PrintWriter的使用
java.io.PrintWriter
具有自动行刷新的缓冲字符输出流,特点是可以按行写出字符串,并且可以自动行刷新。
java.io.BufferedWriter是缓冲字符输出流,内部有缓冲区可以进行块写操作提供效率,
而PrintWriter就是通过连接它实现的缓冲功能(PW的很多构造方法内部自动连接它)。
PW支持两个直接对文件写操作的构造方法:
* PrintWriter(File f)传文件名
* PrintWriter(String s)传路径
以上两种方法都支持一个重载,就是再传入一个参数
* 允许我们制定写出字符时的字符集。
* PrintWriter给人一种可以直接对文件进行操作的假象
* PW是一个高级流
* 实际上PW包装了字节流、字符流和字符缓冲流。
* PW负责自动行刷新
* bw负责提高效率
* osw负责读字符
* fos负责写字节
* 最后PW能够按行很快地把一个字符串变成字节写在文件中
代码展示如下所示:
import java.io.IOException; import java.io.PrintWriter; /** * java.io.PrintWriter * 具有自动行 * @author 小明 * */ public class PWDemo { public static void main(String[] args) throws IOException { /** * PW支持两个直接对文件写操作的构造方法: * PrintWriter(File f)传文件名 * PrintWriter(String s)传路径 * PrintWriter给人一种可以直接对文件进行操作的假象 * PW是一个高级流 * 实际上PW包装了字节流、字符流和字符缓冲流。 * PW负责自动行刷新 * bw负责提高效率 * osw负责读字符 * fos负责写字节 * 最后PW能够按行很快地把一个字符串变成字节写在文件中 */ PrintWriter pw = new PrintWriter("pw.txt"); pw.println("飞雪连天射白鹿"); pw.println("金庸小说我都爱看"); System.out.println("写出完毕!"); pw.close(); } }
import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; public class PWDemo2 { public static void main(String[] args) throws IOException { /** * 使用流连接形式向文件中写出字符串 */ // FileOutputStream fos = new FileOutputStream("pw2.txt"); // // OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); // // BufferedWriter bw = new BufferedWriter(osw); // // PrintWriter pw = new PrintWriter(bw); PrintWriter pw = new PrintWriter( new BufferedWriter( new OutputStreamWriter( new FileOutputStream("pw2.txt") , "UTF-8") ) ); pw.println("你好"); pw.println("我不好"); pw.close(); } }
缓冲字符流中所有构造方法中第一个参数都是Reader或Writer对象。
代码展示如下所示:
PrintWriter创建时如果有参数true时,会有行刷新。PrintWriter调用println()方法有行刷新。
当创建PW时第一个参数为一个流时,
* 那么久可以再传入一个boolean值类型的参数,
* 若该值为true,那么当前PW久具有自动行刷新的功能,
* 即:每当使用println方法写出一行字符串后就会自动调用flush
* 注:使用自动行刷新可以提高写出数据的即时性,
* 但是由于会提高写出次数,必然会导致写效率降低。
package io; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Scanner; /** * 完成简易记事本功能 * 程序启动后要求输入文件名,然后对该文件写操作。 * 之后输入的每一行字符串都按行写入到该文件中。 * 当输入“exit"是程序退出。 * * 使用PW完成该功能,并且自行使用流连接完成。 * * @author 小明 * */ public class Note { public static void main(String[] args) throws IOException, FileNotFoundException{ Scanner reader = new Scanner(System.in); System.out.println("请输入文件名:"); String filename = reader.nextLine(); PrintWriter pw = new PrintWriter( new BufferedWriter( new OutputStreamWriter( new FileOutputStream(filename),"UTF-8" ) ),true ); System.out.println("请开始输入内容"); while(true) { String line = reader.nextLine(); /** * 当创建PW时第一个参数为一个流时, * 那么久可以再传入一个boolean值类型的参数, * 若该值为true,那么当前PW久具有自动行刷新的功能, * 即:每当使用println方法写出一行字符串后就会自动调用flush * 注:使用自动行刷新可以提高写出数据的即时性, * 但是由于会提高写出次数,必然会导致写效率降低。 */ if("exit".equals(line)) { break; } //pw.write(line); pw.println(line); //pw.flush(); } pw.close(); System.out.println("谢谢输入"); } }