一、打印流概述 点击此处返回总目录 二、打印流的使用 三、打印流的自动刷新功能 四、应用:打印流实现文本文件复制 五、解释一个问题:打印字符数组不是打印地址而是遍历 一、打印流概述 打印流一共有两个: PrintStream //打印字节流 PrintWriter //打印字符流 打印流的特点: 1. 此流不负责数据源,只负责数据目的端。 2. 为其他流添加了功能,方便打印 3. 永远不会抛出IOException,但是可能抛出别的异常。 二、打印流的使用 两个打印流的方法完全一致。这两个流的区别在于构造方法。构造方法中写明了输出目的。PrintWriter比PrintStream多一个数据目的,因此用的多一些。 1) 构造方法 PrintStream的构造方法: 1. printStream(File file); 2. printStream(String filename); 3. printStream(OutputStream os); printWriter的构造方法: 1. printWriter(File file); //【例1】 2. printWriter(String filename); //【例2】 3. printWriter(OutputStream os); //【例3】 4. printWriter(OutputStream os, boolean autoFlush) //可以开启自动刷新功能。 5. printWriter(Writer w); //【例4】 6. printWriter(Writer w, boolean autoFlush); //可以开启自动刷新功能。 2)常用的方法 1. print() //原样输出。 2. println() //原样输出。 例1:
package cn.itcast.demo05; import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; public class Test { public static void main(String[] args) throws FileNotFoundException { File file = new File("e:\\aaa.txt"); PrintWriter pw = new PrintWriter(file); pw.println(100); //原样输出,打出来的是100,不是d。不走码表。 pw.flush(); pw.println(true); //原样输出。 pw.close(); } } |
运行结果,打开aaa.txt,可以看到: 100 true 例2:
package cn.itcast.demo07; import java.io.FileNotFoundException; import java.io.PrintWriter; public class Test { public static void main(String[] args) throws FileNotFoundException { PrintWriter pw = new PrintWriter("e:\\bbb.txt"); pw.print("hello"); pw.flush(); pw.print(222); pw.close(); } } |
例3:
package cn.itcast.demo08; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintWriter; public class Test { public static void main(String[] args) throws FileNotFoundException { FileOutputStream fos = new FileOutputStream("e:\\c.txt"); PrintWriter pw = new PrintWriter(fos); pw.println("hello"); pw.flush(); pw.print("lijing"); pw.close(); } } |
例4:
package cn.itcast.demo08; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class Test { public static void main(String[] args) throws IOException { FileWriter fw = new FileWriter("e:\\d.txt"); PrintWriter pw = new PrintWriter(fw); pw.println("hello"); pw.flush(); pw.print("lijing"); pw.close(); } } |
三、打印流的自动刷新功能 打印流可以开启自动刷新功能,但是必须要满足两个条件: 1. 输出的数据目的必须是流对象。也就是只能是OutputStream或Writer。 2. 必须调用println、printf、format三个方法中的一个。 通过一下这两个构造方法来实现自动刷新: printWriter(OutputStream os, boolean autoFlush) //可以开启自动刷新功能。 printWriter(Writer w, boolean autoFlush); //可以开启自动刷新功能。 例:
package cn.itcast.demo09; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintWriter; public class Test { public static void main(String[] args) throws FileNotFoundException { FileOutputStream fos = new FileOutputStream("e:\\fff.txt"); PrintWriter pw = new PrintWriter(fos,true); pw.println("aaa"); pw.println("bbb"); pw.close(); //可以看到,当不写这一句时,fff.txt中也有相应的内容。 } } |
四、应用:打印流实现文本文件复制 读取文件:使用BufferedReader,每次读取一行 写文件:使用PrintWriter,而且自动刷新。
package cn.itcast.demo10; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class Test { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("e:\\d.txt")); PrintWriter pw = new PrintWriter(new FileWriter("e:\\gg.txt"),true); String line = null; while((line = br.readLine())!=null){ pw.println(line); } pw.close(); br.close(); } } |
五、解释一个问题:打印字符数组不是打印地址而是遍历
package cn.itcast.demo06; public class Test { public static void main(String[] args) { int[] in = {1,3,4}; System.out.println(in); //[I@104c575。输出数组地址 byte[] by = {12,34}; System.out.println(by); //[B@3fa5ac。输出数组地址。 char[] ch = {'a','b','c'}; System.out.println(ch); //abc。输出的不是地址,而是abc。 } } |
其他的打印都是数组地址,唯独字符数组打印的是字符。为什么呢? 查看printStream类或者printWriter类的API文档,可以看到只有一个打印数组的函数: void println(char[] ch) 但是没有打印其他数组的函数,比如void println(int[] in)、void println(byte[] b)等等都是没有的。 因此在上面的例子中println(ch)调用的是println(char[] ch)这个方法,这个方法会遍历数组。 而println(in)、println(by)调用的是void println(Object x)这个方法,这个方法打印的是地址。 为什么只有char数组做遍历,而其他数组没有遍历呢? 因为String s = "abc"的本质就是字符数组。打印s,就是打印的字符数组。如果打印字符数组这里不是遍历的话,打印字符串也将看到的是地址。所以这个地方的遍历是为了字符串准备的。 |