PrintWriter
java.io.PrintWriter在功能上与PrintStream类似,除了接受OutputStream实例作为变量之外, PrintWriter还可以接受Writer对象作为输出的对象。当原先是使用Writer对象在作字符处理,而现在想要套用println()之类的 方法时,使用PrintWriter会是比较方便的作法
范例显示了PrintStream与PrintWriter两个对象在处理相同输出目的时的作法,程序会输出简体中文GB2312编码的文字至指定的文件中
import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.PrintWriter; public class StreamWriterDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { // "简体中文"四个字的GB2312编码 byte[] sim = { (byte) 0xbc, (byte) 0xf2, (byte) 0xcc, (byte) 0xe5, (byte) 0xd6, (byte) 0xd0, (byte) 0xce, (byte) 0xc4 }; // 数组作为流来源 ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( sim); InputStreamReader inputStreamReader = new InputStreamReader( byteArrayInputStream, "GB2312"); // PrintWriter还接受writer实例作为变量 PrintWriter printWriter = new PrintWriter(new OutputStreamWriter( new FileOutputStream(args[0]), "GB2312")); int in = 0; printWriter.print("PrintWriter:"); // 写入数组内容 while ((in = inputStreamReader.read()) != -1) { printWriter.print((char) in); } printWriter.println(); printWriter.close(); byteArrayInputStream.reset(); // PrintWriter 接受OutpuStream实例作为变量 PrintStream printStream = new PrintStream(new FileOutputStream( args[0], true), true, "GB2312"); printStream.print("PrintStream:"); // 写入数组数据 while ((in = inputStreamReader.read()) != -1) { printStream.print((char) in); } printStream.println(); printStream.close(); inputStreamReader.close(); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("没有找到文件"); } catch (IOException e) { e.printStackTrace(); } } }
CharArrayReader和CharArrayWriter
java.io.CharArrayReader与java.io.CharArrayWriter,使用它们可以将字符数组当作字符数据输出或输入的来源。
举个应用的例子,通常您很少会对文本文件进行随机存取的动作,因为要与ASCII兼容,一个文本文件中可能会有ASCII与非西欧语系的双字节字符。也就是说,在文本文件中,英文字符与中文字符的长度不一定相同,对文本文件进行随机存取容易发生错误
由于Java中的字符是Unicode字符,通过这个特性,可以将文本文件的内容读入字符数组,对字符数组作随机存取,然后再将之写回文件。这样对于文本文件也可以达到类似随机存取的功能
范例可以打开一个简单的文本文件,其中有简单的英文与中文字符。在读取文件之后,可以直接以程序来指定文本文件的字符位置,以修改所指定的字符。程序的作法是将字符读入字符数组中,修改指定索引处的数组元素。在修改完数组内容之后,重新将字符数组存回文件
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.CharArrayReader; import java.io.CharArrayWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Scanner; public class CharArrayReaderWriterDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { File file = new File(args[0]); BufferedReader bufInputReader = new BufferedReader(new FileReader( file)); // 将文件读入字符数组 CharArrayWriter charArrayWriter = new CharArrayWriter(); char[] array = new char[1]; while (bufInputReader.read(array) != -1) { charArrayWriter.write(array); } charArrayWriter.close(); bufInputReader.close(); // 显示字符数组内容 array = charArrayWriter.toCharArray(); for (int i = 0; i < array.length; i++) System.out.println(array[i] + " "); System.out.println(); // 让用户输入位置与字符修改内容 Scanner scanner = new Scanner(System.in); System.out.print("输入修改位置:"); int pos = scanner.nextInt(); System.out.print("输入修改字符:"); char ch = scanner.next().charAt(0); array[pos - 1] = ch; // 将字符数内容存回文件 CharArrayReader charArrayReader = new CharArrayReader(array); BufferedWriter bufwriter = new BufferedWriter(new FileWriter( args[0])); char[] tmp = new char[1]; while (charArrayReader.read(tmp) != -1) { bufwriter.write(tmp); } charArrayReader.close(); bufwriter.flush(); bufwriter.close(); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("文件未找到"); } catch (IOException e) { e.printStackTrace(); } } }
PushbackReader
PushbackReader拥有一个PushBack缓冲区,只不过PushbackReader所处理的是 字符。从这个对象读出数据后,如果愿意的话,只要PushBack缓冲区没有满,就可以使用unread()将数据推回流的前端
范例可以将文本文件中的一些数学符号:<、>、<=、>=、!=、=转换为BIG5码中的<、>、≦、≧、≠、=等全角符号并另存新文件
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PushbackReader; public class PushbackReaderDemo { public static void main(String args[]) { char[] symbols = { '<', '>', '≦', '≧', '≠', '=' }; try { PushbackReader pushbackReader = new PushbackReader(new FileReader( args[0])); FileWriter fileWriter = new FileWriter("D:\\math_abc.txt"); int c = 0; while ((c = pushbackReader.read()) != -1) { int poss = -1; switch (c) { case '<': poss = 0; break; case '>': poss = 1; break; case '!': poss = 2; break; case '=': poss = 5; break; default: fileWriter.write(c); } if (poss != -1) { if ((c = pushbackReader.read()) == '=') { fileWriter.write(symbols[poss + 2]); } else { pushbackReader.unread(c); fileWriter.write(symbols[poss]); } } } pushbackReader.close(); fileWriter.close(); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("指定文件"); } catch (IOException e) { e.printStackTrace(); } } }