1.转换流的基本使用
现在为止已经知道了两种数据流:字节流和字符流。实际上这两种流是可以进行互相转换处理的。
- OutputStreamWriter:将字节输出流变为字符输出流(Writer对于文字的输出要比OutputStream方便)
- InputStreamReader:将字节输入流变为字符输入流(InputStream读取的是字节,不方便中文的处理)
要想知道这两个类的实际意义,我们首先来看这两个类的继承关系以及构造方法:
public class OutputStreamWriter extends Writer
public OutputStreamWriter(OutputStream out)
public class InputStreamReader extends Reader
public InputStreamReader(InputStream in)
范例:观察字节流与字符流的转换
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class TestOutputStreamWriter {
public static void main(String[] args) throws Exception{
File file = new File(File.separator + "Users" + File.separator + "yuisama" +
File.separator + "Desktop"
+ File.separator + "hello.txt");
if (!file.getParentFile().exists()) { // 必须保证父目录存在
file.getParentFile().mkdirs() ; // 创建多级父目录
}
OutputStream output = new FileOutputStream(file) ;
Writer out = new OutputStreamWriter(output) ; // 字节流转为字符流
String msg = "你好 world" ;
out.write(msg) ;
out.close();
}
}
这种操作在实际开发中并没有什么意义,我们主要用它来分析FileOutputStream、FileInputStream、FileWriter、FileReader之间的继承关系。
从整个继承结构来讲,发现所有字符流处理的时候是经过转换后得来的。
2.文件拷贝(重要)
linux下文件拷贝命令:“cp 源文件路径 目标文件路径”
现在希望通过程序来实现这样的操作。即,建立一个CopyFile程序类,这个类通过初始化参数接收源文件与目标文件路径。
分析:
- 要想实现数据的拷贝肯定是要通过流的方式来完成,对于流有两类,由于要拷贝的内容不一定是文字数据,所以次此处我们采用字节流。
- 在进行拷贝的时候需要确定模式:a.在程序中开辟一个数组,该数组长度为文件长度,将所有数据一次性读取到该数组中随后进行输出保存。b.采用同边读边写的方式完成。
范例:初期模型
这个时候的确成功执行了,但是这个代码有两个问题:
- 在开发里尽量不要去使用do…while,尽量去使用while。
- 拷贝的速度特别慢
范例:解决do…while
while((temp = inputStream.read()) !=-1 ) { // 判断这个读取后的字节(保存在temp)中是否为-1,如果不是表示有内容
outputStream.write(temp) ;
}
以上的方式还是针对于一个字节的方式完成的,如果文件太大,这种做法实在太慢。
范例:解决读取慢的问题
如果要想解决读取慢的问题,那么就要一次性读取多个字节内容
这个程序最为核心的部分就是:
这也是以后用到最多的代码(后续在文件上传之中都是这种模式)
如果现在要求你处理的数据都在InputStream里面,就采用以上的模型。