IO|转换流和缓冲流详解
程序员文章站
2024-03-07 08:40:44
...
IO|转换流和缓冲流详解
转换流和缓冲流都是处理流,也称高级流,他们的使用都是要和节点流进行配合的。
转换流
作用:将字节流和字符流进行相互的转换
操作字符对人来说还是比操作字节要更加简单一些,所以出现了转换流。
OutputStreamWriter
将字节输出流变为字符输出流
class OutputStreamWriter extends Writer
从类的定义我们可以看出输出转换流继承了Writer类,和节点流的构造函数传递路径不同,他的构造函数都用到了OutputStream参数,将其实例化成一个Writer的实例。
public OutputStreamWriter(OutputStream out) {
super(out);
try {
this.se = StreamEncoder.forOutputStreamWriter(out, this, (String)null);
} catch (UnsupportedEncodingException var3) {
throw new Error(var3);
}
}
相对于字符流而言多了一个编码的属性
private final StreamEncoder se;
使用实例:
public class TestApp {
public static void main(String[] args) {
String path = "C:/Users/Chuuuki/Desktop/test.txt";
try {
FileOutputStream ops = new FileOutputStream(path);
OutputStreamWriter opsw = new OutputStreamWriter(ops);
opsw.write("Hello Chuki!");
opsw.close();
ops.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
InputStreamReader
将字节输入流变为字符输入流
和OutputStreamWriter基本是类似的
public class InputStreamReader extends Reader {
private final StreamDecoder sd;
public InputStreamReader(InputStream in) {
super(in);
try {
this.sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
} catch (UnsupportedEncodingException var3) {
throw new Error(var3);
}
}
其中的方法基本也是基类Reader、Writer提供的方法。使用起来和基类实例类似,不过是实例化时传入的参数不同。
public int read() throws IOException {
return this.sd.read();
}
缓冲流
为了提高IO流的读写速度。分为字节缓冲流:BufferedInputStream、BufferedOutputStream
字符缓冲流:BufferedReader、BufferedWriter
BufferedWriter
缓冲流在源码中都有一个char cb[]
的缓冲区,在缓冲区写满之后再往磁盘上进行输出,将数据批量处理,可以提高效率。
不同的构造函数可以 设缓存的大小。
public class BufferedWriter extends Writer
也是继承了Writer父类,可以使用其提供的方法。当然他自己也由一些新的方法:void newLine()
public class TestApp {
public static void main(String[] args) {
String path = "C:/Users/Chuuuki/Desktop/test.txt";
try {
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(path));
bufferedWriter.write("Hello");
bufferedWriter.newLine(); // 根据当前的系统写入一个换行符 “\n”
bufferedWriter.write("The second line...");
bufferedWriter.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
BufferedReader
继承了Reader父类,也有缓冲数组,除了能使用Reader的基本操作之外还向我们提供了一个新的方法
public String readLine()
读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回
public class TestApp {
public static void main(String[] args) {
String path = "C:/Users/Chuuuki/Desktop/test.txt";
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader(path));
String msg = null;
while ((msg = bufferedReader.readLine()) != null) {
System.out.println(msg);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果: