我们在学习字符流(FileReader、FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStreamWriter,这又是什么意思呢?这其中就涉及到了IO转换流的相关知识。
为了方便我们的理解可以先来看一下转换流原理图:
通过上面的原理图,我们发现IO转换流提供了在字节流和字符流之间的转换,且字节流中的数据都是字符时,转成字符流操作更高效。Java API提供了两个转换流:
InputstreamReader:将Inputstream转换为Reader。
OutputStreamWriter:将Writer转换为OutputStream。
InputStreamReader将一个字节的输入流转换为字符的输入流,解码:字节、字节数组 --->字符数组、字符串。
构造器:
OutputStreamWriter将一个字符的输出流转换为字节的输出流,编码:字符数组、字符串 ---> 字节、字节数组。
构造器:
/**
综合使用InputStreamReader和OutputStreamWriter
*/
public class IsrAndOswTest {
@Test
public void test() {
InputStreamReader isr = null;
OutputStreamWriter osw = null;
try {
//1.造文件、造流
File file1 = new File("D:\\io\\hello.txt");
File file2 = new File("D:\\io\\hello_gbk.txt");
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
isr = new InputStreamReader(fis, "utf-8");
osw = new OutputStreamWriter(fos, "gbk");
//2.读写过程
char[] cbuf = new char[1024];
int len;
while ((len = isr.read(cbuf)) != -1) {
osw.write(cbuf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 3.关闭资源
if (isr != null) {
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (osw != null) {
try {
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
通俗一点来说,磁盘中的存储的数据都是“看不懂”的,也就是以字节形式存储的。而内存中存储的数据都是“看得懂”的,也就是以字符形式存储的。把“看得懂”的数据转换成"看不懂"的数据,即把字符流编码成字节流。怎么样,是不是觉得IO转换流十分神奇呢,在动力节点在线的免费视频课程中,我们将对IO转换流一探究竟。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54