java - I/O - FileReader, FileWriter
字节流:
FileInputStream
FileOutputStream
字节流每次读取一个字节,好处是什么类型文件都可以读取,坏处是处理纯文本时可能出现问题(中文每个字占2个字节,可能导致读取错误出现乱码)。
字符流:
FileReader, FileWriter
只能操作纯文本文件(右键记事本可以打开而且不影响内容),txt,html等。
字节流用byte接收数据,byte是8位
字符流用char接受数据,char是16位
汉字占用两个字节,也就是16位
所以字节流有可能乱码,而字符流不会。
两者用房上基本相同,只是参数一个是byte一个是char
FileReader:
package io; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; public class FileReaderTest { public static void main(String[] args){ FileReader fr = null; FileInputStream fis = null; try { fr = new FileReader("C:\\Users\\Administrator\\Desktop\\test\\filereadertest.txt"); fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\test\\filereadertest.txt"); char[] c = new char[5]; int count = fr.read(c); while(count != -1){ System.out.println("---|" + new String(c) + "|---"); count = fr.read(c); } //---|你好世界,|--- //---| //你好I|--- //---|/O。好I|--- byte[] b = new byte[5]; count = fis.read(b); while(count != -1){ System.out.println("---|" + new String(b) + "|---"); count = fis.read(b); } //---|你好?|--- //---|澜纾?|--- //---| //你?|--- //---|肐/O?|--- //---|/O?|--- //字节型出现了乱码,字符型没有 //因为字符型每次读取了一个char是16位的,而字节型只能使用byte读取,每次是8位,每个汉字是16位,所以字节型会出现乱码 }catch(Exception e){ e.printStackTrace(); }finally { //使用fianlly保证流能关闭 if (fr != null) { try { fr.close(); //关闭流 } catch (IOException e) { e.printStackTrace(); } } if (fis != null) { try { fis.close(); //关闭流 } catch (IOException e) { e.printStackTrace(); } } } } }
FileWriter
package io; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; public class FileWriterTest { public static void main(String[] args){ FileWriter fw = null; FileOutputStream fos = null; try { fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\test\\fileWriterTest.txt"); //没有这个文件的话会新建一个 fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test\\fileWriterTest.txt", true);//第二个参数是是否在原有的后面添加,默认是false也就是覆盖,FileWriter同理 fw.write("你好啊世界,\r\n你好难啊I/O。\r\n"); //windows中txt的换行是\r\n\,如果想在文本中添加字符串“\r\n”,要用“\\r\\n”则会输出“\r\n”。 fw.flush();//以前必须写,现在新版本会自动推送- -不过为了适应各种版本最好都写上 //你好啊世界, //你好难啊I/O。 fos.write("你好啊世界,\r\n你好难啊I/O。\r\n".getBytes()); //把String转化为byte[]数组,然后可以用字节流存取。 fos.flush();//以前必须写,现在新版本会自动推送- -不过为了适应各种版本最好都写上 //你好啊世界, //你好难啊I/O。 //因为是一次性全部存入不用分割所以貌似问题不大- -,可能更复杂的情况下需要分批输入的时候才有效果 }catch(Exception e){ e.printStackTrace(); }finally { //使用fianlly保证流能关闭 if (fw != null) { try { fw.close(); //关闭流 } catch (IOException e) { e.printStackTrace(); } } if (fos != null) { try { fos.close(); //关闭流 } catch (IOException e) { e.printStackTrace(); } } } } }