一、字符输出流Writeer 点击此处返回总目录 二、FileWriter
三、字符输入流Reader 四、FileReader 五、案例:使用字符流实现文本文件复制 一、字符输出流Writer java.io.Writer是所有字符输出流的超类。也是用于写文件。但是这种流的局限性很大,只能用于写文本文件,不能写别的。写图片,音乐什么的都不可以。 什么叫文本文件?用记事本打开,能够看得懂的就是文本文件。比如,txt,sql文件等等。 方法: 1. write(int c) //写入一个字符。【例1】【例2】 2. write(char[] c) //写入字符数组。【例3】 3. write(char[] c ,int off, int len) //写入字符数组的一部分,从off开始写len个。【例4】 4. write(String s) //写入字符串。【例5】 5. flush() //刷新该流的缓冲。Writer写数据时,必须要运行flush()。如果不刷新,数据是不会走到目的地的。 //建议写一次刷一次,如果不刷的话,数据都存在于内存中,浪费资源,所以还是写一个刷一个好 6. close() //关闭此流,但要先刷新它。也就是执行close()时,默认会先执行flush(),然后再关闭资源。 flush()与close()的区别: flush()刷新完以后流还能用,close()的话不但刷新了,而且流也废掉不能用了。 flush()只有字符输出流Write使用,别的(字节输出流、字节输入流、字符输入流等)都不使用。 Writer是抽象类,子类有FileWriter等。 二、FileWriter 1)构造方法 作用:绑定数据目的。 1. FileWriter(File file) 2. FileWriter(File file, boolean append) 3. FileWriter(String filename) 4. FileWriter(String filename, boolean append) 2)父类功能演示 例1:
package cn.itcast.demo10; import java.io.FileWriter; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException{ FileWriter fw = new FileWriter("e:\\f.txt"); fw.write(97); //第一句 fw.flush(); //第二句 fw.close(); //第三句 } } |
运行结果:打开e:\\f.txt,可以看到"a"。 如果只有第一句,没有第二三句,f.txt中将不会有任何信息,因为没有刷新。当然这么写是错误的,因为没有close()。 如果有第一二句,没有第三句,f.txt中会看到"a"。但是这么写是错误的,因为没有close()。 如果有第一句,第三句,f.txt中会看到"a"。这么写是正确的,因为close()会先执行flush()。但是这么写不好,应该write一句,写一个flush,不要等到最后close()的时候flush。 例2:
package cn.itcast.demo10; import java.io.FileWriter; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException{ FileWriter fw = new FileWriter("e:\\f.txt"); fw.write(97); fw.flush(); //写一次刷新一次。不要等到最后close()的时候刷新。 fw.write(99); fw.flush(); fw.close(); } } |
运行结果: 查看e:\\f.txt,可以看到结果为"ac"。 例3:
package cn.itcast.demo10; import java.io.FileWriter; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException{ FileWriter fw = new FileWriter("e:\\f.txt"); fw.write("abcd".toCharArray()); fw.flush(); fw.close(); } } |
运行结果: abcd 例4:
package cn.itcast.demo10; import java.io.FileWriter; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException{ FileWriter fw = new FileWriter("e:\\f.txt"); char[] c = {'a','b','c','d'}; fw.write(c,1,2); fw.flush(); fw.close(); } } |
运行结果: bc 例5:
package cn.itcast.demo10; import java.io.FileWriter; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException{ FileWriter fw = new FileWriter("e:\\f.txt"); fw.write("haha"); fw.flush(); fw.close(); } } |
运行结果: haha 三、字符输入流Reader 是所有字符输入流的超类。作用:读取文本文件。只能读取文本文件。读一首歌什么的不行。 方法: int read() //与字节输入流完全相同。【例1】 int read(char[] cbuf) //与字节输入流完全相同。【例2】 Writer是抽象类,子类有FileReader等。 四、FileReader类 1)构造方法 作用:绑定数据源 1. FileReader(File file) //参数是File类型对象 2. FileReader(String name) //参数是String类型对象 2)继承过来的方法演示 例1:
package cn.itcast.demo11; import java.io.FileReader; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("e:\\aaa.txt"); int i = 0; while((i = fr.read()) != -1){ System.out.print((char)i); } } } |
例2:
package cn.itcast.demo11; import java.io.FileReader; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("e:\\aaa.txt"); int len = 0; char[] ch = new char[1024]; while((len = fr.read(ch)) != -1){ System.out.print(new String(ch,0,len)); } } } |
五、案例:使用字符流实现文本文件复制
package cn.itcast.demo12; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class Test { public static void main(String[] args) { FileReader fr = null; FileWriter fw = null; try{ fr = new FileReader("e:\\a.txt"); //a.txt的默认编码方式是GBK。 fw = new FileWriter("e:\\b.txt"); int len = 0; char[] ch = new char[1024]; while((len = fr.read(ch))!=-1){ fw.write(ch, 0, len); fw.flush(); } }catch(IOException e){ e.printStackTrace(); throw new RuntimeException("复制失败"); }finally{ try{ fw.close(); }catch(IOException e){ throw new RuntimeException("资源关闭失败"); }finally{ try{ fw.close(); }catch(IOException e){ throw new RuntimeException("资源关闭失败"); } } } } } |
aaa.txt中默认的编码方式是GBK,运行后b.txt中的内容为: 123456789 987654321 000000000 中国 静静 没有问题,是正确的。 但是将aaa.txt另存一份,选择编码为utf-8: 同样执行上面的程序,结果为: 锘?23456789 987654321 000000000 涓浗 闈欓潤 出现了乱码!! 要想解决这种问题,需要用到下一节的转换流。 |