前面曾介绍过PrintStream,它可以将Java的基本数据类型等数据,直接转换为系统默认编码下对应的字符,再输出至OutputStream中。而这里要介绍的 java.io.PrintWriter在功能上与PrintStream类似,除了接受OutputStream实例作为变量之外,PrintWriter还可以接受Writer对象作为输出的对象。当原先是使用Writer对象在作字符处理,而现在想要套用println()之类的方法时,使用PrintWriter会是比较方便的作法。
下面的例子显示了PrintStream与PrintWriter两个对象在处理相同输出目的时的作法,程序会输出简体中文GB2312编码的文字至指定的文件中。
import java.io.*;
import java.util.*;
public class StreamWriterDemo
{
public static void main(String[] args)
{
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();
//PrintStream接受OutputStream实例作为变量
PrintStream printStream =
new PrintStream(new FileOutputStream(args[0],true),true,"GB2312");
printStream.print("PrintStream: ");
//写入数组内容
while((in = inputStreamReader.read()) != -1)
{
printStream.print((char)in);
System.out.println(Integer.toHexString(in));
}
printStream.println();
inputStreamReader.close();
printStream.close();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("没有指定文件");
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
运行如下命令 java StreamWriterDemo Output.txt 屏幕上会输出:
7b80
4f53
4e2d
6587
"简体中文" 对应的Unicode 编码值。