您的位置:首页 > 其它

IO  —— 使用打印流实现文件的复制

2016-07-24 08:05 351 查看
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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  io