黑马程序员-IO流(一)

---------------------  android培训java培训、期待与您交流! ---------------------
IO流(一)


IO流分为字节流和字符流(字符流的实现也是基于字节流的)。
1.字符流有Reader和Writer两个顶层的抽象类,用于对字符的读入和写出,最常用的实现类有FileReader,FileWriter,BufferedReader和BufferedWriter。BufferedReader和BufferedWriter是装饰类,可装饰字符流,是其有更强的功能(提供readLine和newLine方法)和更优的IO效率(缓冲机制)。


2.字节流有InputStream和OutputStream两个顶层抽象类,用于对字节的输入输出。最常用的实现类有FileInputStream,FileOutputStream,BufferedInputStream和BufferedOutputStream。后两个是装饰类,可装饰字节流,具有更优秀的IO缓冲效率。


3.字符流与字节流的转换通道:InputStreamReader和OutputStreamWriter。其中InputStreamReader修饰InputStream,使字节输入流转换为字符输入流,便于直接使用字符流进行操作。OutputStreamWriter用于修饰OutputStream,使字符输出流转化为字节出流,便于直接使用字符流进行操作。这些转换都是基于数据为字符的前提,不能用于其他数据的操作。而操作字符型的数据最好使用字符流进行,最方便的地方就是可以使用readLine和newLine方法。


4.文件的复制。任意文件的复制不能使用字符流,而应该使用字节流。每读满一个字节数组就写出去,这样就可以了。

public class FileCopyDemo {


public static void main(String[] args) {


int result = copyFile("C:\\","Reader的层次.png","C:\\abcd\\");
if(result == 1)
{
System.out.println("成功");
}

//返回-1失败
//返回 1成功
private static int copyFile(String fromPath, String fileName, String toPath)
{
//FileInputStream fis = null;
//FileOutputStream fos = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;//使用带缓冲的字节流


try
{
bis = new BufferedInputStream(new FileInputStream(fromPath + fileName)) ;
new File(toPath).mkdir();//创建目录
bos = new BufferedOutputStream(new FileOutputStream(toPath + fileName));
byte[] data = new byte[1024];
int len;
while((len = bis.read(data)) != -1)
{
bos.write(data, 0, len);

}
catch(IOException e)//处理异常
{
System.out.println("文件复制出错");
return -1;
}
finally
{
if(bis != null)
{
try{
bis.close();
}
catch(IOException e)
{
System.out.println(e.toString());
return -1;

}
if(bos != null)
{
try{
bos.close();
}
catch(IOException e)
{
System.out.println(e.toString());
return -1;

}


}
return 1;


}
}


5.装饰设计模式:将一个已有的对象进行功能增强,可以定义一个类,将原对象传入,基于原对象已有的功能进行增强。这个类就是装饰类。这样做的好处是使操作更加灵活,关系不臃肿。


6.FileOutputStream由于是节点流,直接对内存进行操作,所以write方法可以直接写入,而不需要额外的flush。其他如字符流都是有缓冲的。


7.使用IO资源时,需要处理异常,不再使用的流需要关闭以释放资源,也防止数据为完全写入(处于缓冲区中)。







---------------------- android培训java培训、期待与您交流! ----------------------详细请查看: http://edu.youkuaiyun.com/heima
### 黑马程序员 IO 练习题及实例代码 #### 关于 I/O 的概念 I/O 用于表示输入和输出的数据序列,在 Java 中,所有的 I/O 都位于 `java.io` 包下。通过这些类可以实现程序与外部资源之间的数据传输[^1]。 #### 文件加密解密案例分析 考虑个简单的文件加解密例子来展示如何利用字节完成特定功能: ```java import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class FileEncryptDecrypt { public static void main(String[] args) { String srcFile = "source.txt"; String destFile = "encrypted.txt"; FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(srcFile); fos = new FileOutputStream(destFile); byte[] buffer = new byte[20]; int len; while ((len = fis.read(buffer)) != -1) { for (int i = 0; i < len; i++) { buffer[i] = (byte) (buffer[i] ^ 5); // 使用异或运算进行简单加密/解密 } fos.write(buffer, 0, len); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } try { if (fis != null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 此段代码展示了如何读取源文件并将其内容写入目标文件的同时执行简单的加密操作。这里采用的是 XOR 操作作为基础的加密手段;同样的逻辑也可以用来做解密工作[^3]。 #### 缓冲区的应用说明 当调用 `InputStream` 的 `read(byte[])` 方法时,该方法尝试次性填充整个传递过来的缓冲数组。如果当前可用的数据量不足以填满整个缓冲,则返回实际已读取的数量,并等待后续更多数据到来继续读取直到结束标志 `-1` 出现为止[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值