OutputStreamWriter和InputStreamReader以及Writer和Reader和PrintWriter

3/8/2017来源:ASP.NET技巧人气:1989

一、Reader是字符输入流的父类。Writer是字符输出流的父类。 字符流是以(char)为单位读写数据的。一次处理一个unicode. 字符流的底层仍然是基本的字节流。 InputStreamReader:字符输入流。使用该流可以设置字符集,并安装指定的字符集从流中按照该编码将字节数据转换为字符并读取。 OutputStreamWriter:字符输出流。使用该流可以设置字符集,并安装指定的字符集将字符转换为对应字节后通过该流写出。 例1:通过OutputStreamReader写文件:

package day02; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; /** * OutputStreamWriter 字符输出流,可以将给定的字符串转换为对应的字节然后写出。 * 字符流都是高级流 */ public class OSWDemo { public static void main(String[] args) throws UnsupportedEncodingException, IOException { /* * 向文件中写出一个字符串 */ FileOutputStream fos= new FileOutputStream("osw.txt"); /* * 使用OSW可以按照指定的字符集方便的写出字符串。 */ OutputStreamWriter osw= new OutputStreamWriter(fos,"UTF-8"); osw.write("挖掘机技术哪家强?"); osw.write("摩擦摩擦是魔鬼的步伐!"); osw.close(); } }

使用InputStreamReader读取刚才写的句子:

package day02; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; /** * InputStreamReader 字符输入流,可以根据指定的字符集读取字符 */ public class ISRDemo { public static void main(String[] args) throws IOException { FileInputStream fis= new FileInputStream("osw.txt"); /* * 使用该高级流,可以按照给定的字符集读取对应的字符,第二个参数若不指定,就是按照当前系统默认字符集。 */ InputStreamReader isr= new InputStreamReader(fis,"UTF-8"); /* * 由于一个字符一个字符读取会提高读取的次数,这样会降低读取的效率。 */ // int d = -1; // while((d = isr.read())!=-1){ // System.out.PRint((char)d); // } char[] data = new char[1024];//字符流是以(char)为单位读写数据的 /* * 与批量读取字节意思一致。一次尝试读取data长度的字符量,返回值为实际读取到的字符量。若返回值-1表示EOF。 */ int len = isr.read(data); String str = new String(data,0,len); System.out.println(str); isr.close(); } }

二、PrintWriter java.io.PrintWriter:缓冲字符输出流;特点:允许以行单位写出字符串。提供了很多方便的构造方法,允许我们快速创建该流。 例1:

package day02; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; /** * java.io.PrintWriter:缓冲字符输出流 * 特点:允许以行单位写出字符串。提供了很多方便的构造方法,允许我们快速创建该流 */ public class PWDemo { public static void main(String[] args) throws IOException { /* * 支持两个直接向文件中写入数据的构造 * 方法 * PrintWriter(File file) * PrintWriter(String filepath) * * 看似是可以直接向文件中写入,但事实上 * 其构造方法中会创建FOS向文件中写。 * 只是我们不用层层嵌套来组装不同的高级流 * 而已。 * * 若希望按照指定的字符集写出字符串到文件中 * 那么 * PrintWriter(File f) * PrintWriter(String filepath) * 以上两个构造方法都支持一个重载,重载的 * 构造方法可以传入第二个参数,来指定字符集。 */ PrintWriter pw = new PrintWriter("pw.txt","UTF-8"); pw.println("摩擦摩擦,是魔鬼的步伐!"); pw.println("哎呦我去滑板鞋!"); System.out.println(); pw.close(); } }

例2:

package day02; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; /** * PrintWriter处理其他流 */ public class PWDemo2 { public static void main(String[] args) throws IOException { /* * PrintWriter(OutputStream out):可以处理给定的字节输出流,变为一个缓冲字符输出流 * PrintWriter(Writer out):可以处理给定的字符输出流,变为一个缓冲字符输出流 */ FileOutputStream fos= new FileOutputStream("pw2.txt"); //若希望按照指定字符集写出,创建该字符流做转换 OutputStreamWriter osw= new OutputStreamWriter(fos,"UTF-8"); PrintWriter pw= new PrintWriter(osw); pw.println("啦啦啦啦"); pw.close(); } }

例3:

package day02; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; /** * PrintWriter的特点:具有自动行刷新功能当我们使用PrintWriter去处理一个流的时候,可以将PrintWriter声明为具有自动行刷新功能。 */ public class PWDemo3 { public static void main(String[] args) throws IOException { FileOutputStream fos= new FileOutputStream("pw3.txt"); OutputStreamWriter osw= new OutputStreamWriter(fos,"UTF-8"); /* * 当调用的构造方法第一个参数为流时,那么支持传入第二个参数,该参数为boolean类型;若值为true,那么当前PrintWriter就具有了自动行刷新功能。 */ PrintWriter pw= new PrintWriter(osw,true); /* * 当具有了自动行刷新功能的PW在调用println方法写出字符串的时候会自动调用flush强制写出。 */ pw.println("你好!"); pw.println("再见!"); pw.close(); } }