使用字符流 必须刷新缓冲区 flush

实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图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(),显得清空数据.
        */
       //刷新就是将内存(缓冲区)中的数据(是一个字节数组)强制写到磁盘/浏览器/控制台/文件

猜你喜欢

转载自blog.csdn.net/Hurricane_m/article/details/89380238
今日推荐