IO流学习简单总结
字节流和字符流的区别
-
处理数据的方式不同:字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节时,先去查指定的编码表,再将查到的字符返回。
-
处理单元和操作对象不同:字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
-
字节流可以处理所有类型数据,如:图片、MP3、AVI视频文件等,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
字节流的抽象基类是InputStream(输入流-读)和OutputStram(输出流-写);
字符流的抽象基类是Reader(输入流-读)和Writer(输出流-写);
由抽象基类派生出来的子类名称都是以其父类名作为子类名的后缀(判断字节流或字符流)
字节流子类:
字符流子类:
典型应用:复制文件。
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("E:/我的图片和音乐/疯狂动物城.mp4");
out = new FileOutputStream("D:/疯狂动物城.mp4");
//创建一个缓冲区
byte[] bytes = new byte[1024];
//read方法返回-1表示读完
while ((in.read(bytes)) != -1) {
// 读取数据到缓冲区
out.write(bytes);
// 刷新
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally { // 不管是否遇到异常,finally异常一定会执行,在这里进行资源释放
try {
if (in != null) in.close();
if (out != null) out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
BufferedInputStream和BufferedOutputStream
字节流一次读写一个数组的速度明显比一次读写一个字节的速度要快很多,这是加入了数组这样的缓冲区效果,Java本身在设计的时候,也考虑到了这样的设计思想,所以提供了字节缓冲流以提高读写效率。它只是一个缓冲区,真正的操作还是要靠流来进行,只是用它做个容器,其本身并没有什么特有的方法。
字节缓冲流构造是通常需要传入字节流,同时可以指定缓冲区的大小。
-
BufferedOutputStream(OutputStream out)
-
BufferedOutputStream(OutputStream out, int size)
-
BufferedInputStream(InputStream in)
-
BufferedInputStream(InputStream in, int size)
字节数组与字符串之间的转换
应用实例:
// 编码和解码要统一
byte[] bytes = "我真的是个好人".getBytes("utf-8");
String s = new String(bytes, "utf-8");
Reader和Writer
- Reader和InputStream中的方法并没有出入。同样提供了三种类型的read()方法,操作对象变成了字符串char而不是字节byte
- Writer与字节流输出流OutputStream比起来,Writer中提供了五种写入数据的方法,分别用来写入字符,字符数组,字符数组的一部分,字符串,字符串的一部分。同时提供了追加写入的方法append()。
InputStreamReader和OutputStreamWriter分别是Reader和Writer的子类。用来将字节流转换为字符流。它们的构造参数可以传入字节流对象:
- OutputStreamWriter(OutputStream out)、OutputStreamWriter(OutputStream out,String charsetName)
- InputStreamReader(InputStream is)、InputStreamReader(InputStream is,String charsetName)
FileReader和FileWriter分别是InputStreamReader和OutputStreamWriter的子类。提供了字符流便捷类。构造方法:
-
FileReader (String filePath)、FileReader(File fileObj)
-
FileWriter (String filePath)、FileWriter(File fileObj),FileWriter(String filePath, boolean append)
通过字符流便捷类来构造字符输出流很简单,首先要明确一点,所有的字符流都是处理流,其底层都是字节流。字符便捷流对这一过程进行了封装,我们只需要指定File路径或者File对象即可。
比如,构造OutPutStreamWriter对象时:
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:/a.txt"));
FileWriter对这一过程进行了包装,我们只需要指定文件路径即可:
FileWriter fw = new FileWriter("D://a.txt");
BufferedReader和BufferedWriter
BufferedReader和BufferedWriter是针对于字符的缓冲流 。
BufferedReader是高效的字符输入流,BufferedWriter是高效的字符输出流。
构造方法:
要求传入其他字符流: public BufferedWriter(Writer out),public BufferedReader(Reader in)。
同时可以指定缓冲区的大小: BufferedWriter(Writer out, int sz),BufferedReader(Reader in, int sz)。
-
BufferedReader的特有方法:String readLine(),一次读取一行文字。
-
BufferedWriter的特有方法:void newLine(),换行符。