实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图12-6所示。
/**
* 字符流 使用输入流读取一个文件内容到cpu中,然后使用输出流将内容写出到指定位置的外部文件中。 (使用输入输出流进行了文件的复制
*/
@Test
void test02() {
try {
Reader isr = new FileReader("m:\\emp.txt");
Writer osw = new FileWriter("m:\\emp\\emp001.txt", true);
char[] b = new char[1024];
int len = isr.read(b);
while(len!=-1) {
//打印到控制台
System.out.println(new String(b));//字符无需指定编码格式
osw.write(b, 0, len);
len = isr.read();
}
osw.flush();
if(isr!=null) {
isr.close();
}
osw.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* flush() 方法是清空,即清空缓冲区数据,就是说
* 你用读写流的时候,其实数据是先被读到了内存中,
* 然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,
* 因为还有一部分有可能留在内存这个缓冲区中.这时候如果你调用了
* close方法关闭了读写流,那么这部分数据就会丢失,
* 所以应该再关闭读写流之前先flush(),显得清空数据.
*/
//刷新就是将内存(缓冲区)中的数据(是一个字节数组)强制写到磁盘/浏览器/控制台/文件