PrintWriter 是一个经常使用的很重要的流,并且它是一个高级流(包装流),它可以实现一行一行地“打印”(对字符数据进行操作)。
例1:对打印流的初级认识
/**
* Created by liwei on 16/7/19.
*
* 需求:把一个文件复制到另一个文件中。
* 数据源:
* 读取数据 -- FileReader -- BufferedReader
* 目的地:
* 写出数据 -- FileWriter -- BufferedWriter -- PrintWriter
*
*/
public class CopyFileDemo {
/*public PrintWriter(OutputStream out, boolean autoFlush) {
this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);
// save print stream for error propagation
if (out instanceof java.io.PrintStream) {
psOut = (PrintStream) out;
}
}*/
public static void main(String[] args) throws IOException {
// 以前的版本
// 封装数据源
// BufferedReader br = new BufferedReader(new FileReader(
// "DataStreamDemo.java"));
// // 封装目的地
// BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
//
// String line = null;
// while ((line = br.readLine()) != null) {
// bw.write(line);
// bw.newLine();
// bw.flush();
// }
//
// bw.close();
// br.close();
// 打印流的改进版
// 封装数据源
BufferedReader br = new BufferedReader(new FileReader("src/com/liwei/io1/DataStreamDemo.java"));
// 封装目的地
// 【重要】PrintWriter 的源代码里就有高效流 BufferedWriter
PrintWriter pw = new PrintWriter(new FileWriter("copy.java"),true);
String line = null;
while ((line=br.readLine())!=null){
pw.println(line);
}
pw.close();
br.close();
}
}
例2:对打印流的进一步认识(重要)
/**
* Created by liwei on 16/7/19.
* 打印流:
* 字节打印流 PrintStream
* 字符打印流 PrintWriter
*
* 打印流的特点:
* (1)只有写数据的功能,没有读取数据的功能。只能操作目的地,不能操作数据源
* (2)可以操作任意类型的数据(非常重要)
* (3)如果启动了自动刷新,能够自动刷新
* (4)这个流是可以直接操作文本文件的
* 哪些流对象是可以直接操作文本文件的呢?
* FileInputStream
* FileOutputStream
* FileReader
* FileWriter
* PrintStream
* PrintWriter
* 看API,查流对象的构造方法,如果同时有File类型和String类型的参数,一般来说就是可以直接操作文件的。
*
* 流:
* 基本流:就是能够直接读写文件的
* 高级流:在基本流基础上提供了一些其他的功能
*
*/
public class PrintWriterDemo {
public static void main(String[] args) throws FileNotFoundException {
// 作为 Writer 类的子类使用
PrintWriter pw = new PrintWriter("pw.txt");
pw.write("liwei");
pw.write("zhouguang");
pw.write("wudi");
pw.flush();
pw.close();
}
}
例3:打印流的构造方法里有自动刷新的设置
建议参看官方文档深入学习打印流。
以下的描述来自 JDK 官方文档。
与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。
/**
* Created by liwei on 16/7/19.
* 1、PrintWriter 可以操作任意类型的数据;
* print()
* println()
*
* 2、启动自动刷新
* PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"),true);
* 还是应该调用 println() 方法才可以实现自动刷新
* 这个时候不仅仅自动刷新,还实现了数据的换行。
*
* println() 等价于
* pw.write();
* pw.newLine();
* pw.flush();
*
*/
public class PrintWriterDemo2 {
public static void main(String[] args) throws IOException {
// 创建打印流对象
PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"),true);
// 靠 write() 方法是搞不定的
// 我们可以尝试使用新的方法
pw.println("今天是个好日子");
pw.println("心想的事儿都能成");
pw.println("明天又是好日子");
pw.println("打开了家门咱迎春风");
pw.println(true);
pw.println(14.19);
pw.close();
}
}