1、Print流 分为PrintStream和 PrintWriter 两种
他们表示的含义可以从他们的构造函数中看出:
PrintStream extends FilterOutputStream:
private PrintStream(boolean autoFlush, OutputStream out, Charset charset) {
super(out);
this.autoFlush = autoFlush;
this.charOut = new OutputStreamWriter(this, charset);
this.textOut = new BufferedWriter(charOut);
}
首先它是一个OutputStream的子类
其次它是一个包裹流,在其输出字节流的基础上包裹了转换流,转换成字符输出流,然后又包裹了一层缓冲输出流
最后他的flush功能默认是关闭的,所以需要进行开启或者手动flush.
PrintWriter extends Writer:
public PrintWriter(OutputStream out, boolean autoFlush) {
this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);
// save print stream for error propagation
if (out instanceof java.io.PrintStream) {
psOut = (PrintStream) out;
}
}
可以看出PrintWriter对于字节流的处理和PrintStream相同,不过它也可以用Writer流作为参数。
public PrintWriter(Writer out,boolean autoFlush) {
super(out);
this.out = out;
this.autoFlush = autoFlush;
lineSeparator = java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("line.separator"));
}
2、关于输出流所提供的功能(方法)对比
- Writer :// FileWriter\CharArrayWriter
write(int) 一个字符
write(char[]) 一个字符数组
write(char[],offset,len) 一个字符数组的一部分
write(string,offset,len) 一个字符串或者它的一部分
- OutputStream
write(int) 一个字节
write(byte[]) 一个字节数组
write(byte[],offset,len) 一个字节数组的一部分
- DataOutputStream
在一个OutputStream的基础上提供以下功能
writeInt(int) 把一个int型数据按照字节输出。100 --> 0x 00 00 00 64
writeLong(long) 把一个long型数据按照字节输出。
- PrintStream
首先它继承自OutputStream,是一个字节流
其次它以字符形式进行输出。也就是说它会自动按照指定的编码把字节中的数据转换为字符,然后进行输出。集合了转换和缓冲输出的功能,参考上面的构造函数
最后它主要是提供了许多格式化输出功能
write(int) 字节输出 100 --> 64
write(byte[],offset,len) // 字节输出
write(char[]) 字符输出
write(string) BufferedWriter 字符输出
print(...) 字符输出 100 --> 100
println(...) 字符输出 '\r\n'
printf(format,...) 字符输出
- PrintWriter
它的方法和PrintStream相同。
关于换行符,在windows下是\r\n, 而在linux下是\n,
他们的用法基本相同
public class TestIO {
public static void main(String[] args) {
String filename = "D:" + File.separator + "hello.txt";
File file = new File(filename);
try {
FileOutputStream fout = new FileOutputStream(file);
PrintStream prt = new PrintStream(fout);
prt.write(100); // 文件中内容为64
prt.close();
fout.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Print 流通常用于标准输出和标准错误,他们默认都是在显示器上进行输出。我们可以更改他们输出到文件,这就是输出重定向,或者叫做标准输出重定向
System.out 标准输出流
System.err 标准错误流
System.setErr()
System.setOut()
?Test Code:
public class TestIO {
public static void main(String[] args) {
String filename = "D:" + File.separator + "hello.txt";
File file = new File(filename);
System.out.println("标准输出 -- 控制台");
try {
//FileOutputStream fileOut = new FileOutputStream(filename);
PrintStream prt = new PrintStream(file);
System.setOut(prt);
System.out.println("标准输出重定向 -- 文件");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}