注意:打印一词的意思是:展现某种东西在你的屏幕上,而不是打印机的打印。
1 打印流
System.out和System.err都是java.io.PrintStream实例。
对控制台而言,PrintStream是无限制的,打印流是过滤流,所以它可以连接到任何其他输出流上面,如文件输出流(FileOutputStream),ByteArrayOutputStream, TelnetOutputStream或者其他任何可以写得流上面。
下面三个重载的构造方法用于指定打印流的实质的流是什么:
public PrintStream(OutputStream out)
public PrintStream(OutputStream out, boolean autoFlush)
public PrintStream(OutputStream out, boolean autoFlush, String encoding)
throws UnsupportedEncodingException
自动刷新参数如果设置为true,则在接收到 \n 或者println( )方法调用,或者字节或字节数组被写入。编码参数指定了编码集。
Java5增加了更多的构造方法,就是为了便利
public PrintStream(String fileName) throws FileNotFoundException
public PrintStream(String fileName, String encoding)
throws FileNotFoundException, UnsupportedEncodingException
public PrintStream(File file) throws FileNotFoundException
public PrintStream(File file, String encoding)
throws FileNotFoundException, UnsupportedEncodingException
这些方法就是在后面又套了一层FileOutputStream而已。
2 打印字母
你喜欢使用PrintStream代替OutputStream的原因是为了print( ) 和println( )。
这些方法将在执行写入之前会以字符串的形式打印出来。举个例子,你要写入到numbers.dat的文件中。
PrintStream out = new PrintStream(new FileOutputStream("numbers.dat"));
假设,你有一个简单的写入循环:
for (int i = 0; i <= 127; i++) out.write(i);
当完成后,你发现文件包含了128个字节。第一个是0,然后1,2,3...它是纯净的2进制数据,如果你用文本编辑器打开它,会发现,很多很多字符无法显示出来(文本编辑器可能会尝试用ASCII编码方式来解析它)。因为,他们仅仅是byte,而不是可打印的东西。
如果我们不用write方法,而是用print()方法。输出将不是乱码。
注意,并不能保证以ASCII码方式输出,还取决于平台。
例子用了int,但实际上还有:
public void print(boolean b)
public void print(char c)
public void print(int i)
public void print(long l)
public void print(float f)
public void print(double d)
public void print(char[] s)
public void print(String s)
public void print(Object o)
public void println(boolean b)
public void println(char c)
public void println(int i)
public void println(long l)
public void println(float f)
public void println(double d)
public void println(char[] s)
public void println(String s)
public void println(Object o)
注意,对于引用类型,打印的是Object.toString(),对于原始类型,则是String.valueOf()。
3 换行符
不同平台是不同的:
-
On Unix (including Mac OS X), it's a linefeed, \n, ASCII 10.
-
On Mac OS 9, it's a carriage return, \r, ASCII 13.
-
On Windows, it's a carriage return linefeed pair, \r\n, ASCII 13 followed by ASCII 10.
考虑下面的方式,而不是println()
for (int i = 0; i <= 127; i++) {
out.print(i);
out.print("\r\n");
}
如果你想知道当前系统的换行符是啥子,你也可以调用:
String lineBreak = System.getProperty("line.separator");
并非所有的换行都是等价的。由于自动刷新的存在, \n才会刷, \r是不会的。
4 错误处理
由于打印流不抛出IO异常,所以
使用:
public boolean checkError( )
来检查错误, 使用
protected void setError( )
来设置错误。
一旦错误被设置,无法重置它。
一旦错误,将悄无声息,所以它不适合绝大多数应用程序。
5 格式化打印
c语言风格的东西。
public PrintStream printf(String format, Object... args)
除了printf,打印流还有format方法
public PrintStream format(String format, Object... args)
format()用到了java.util.Formatter类
它的签名是:
public class Formatter implements Flushable, Closeable此外:
Formatter 相当于C语言中的 sprintf( ), fprintf( ) 但它是面向对象的。
不同的是,输出不是控制台,而是string, a file, or an output stream