1 基本概括

java PrintWriter 发出的post请求乱码 java中printwriter_System

2 主要介绍

2.1 PrintStream和PrintWriter区别

1 PrintStream主要操作byte流,而PrintWriter用来操作字符流。读取文本文件时一般用后者。 2 java的一个字符(char)是16bit的,一个byte是8bit的 

3 PrintStream的可能会出现字符集乱码吧。PrintStream是用来操作byte,

 PrintWriter是用来操作Unicode, 一般 需要处理中文时用PrintWriter好了

4 PrintStream是一种能接收各种数据类型的输出,打印数据时比较方便:

-System.out是标准输出;-System.err是标准错误输出。

PrintWriter是基于Writer的输出。

2.2 PrintStream和PrintWriter 需要了解的点

这两者在往文件中写入字符串时,最终都需要通过字符集的映射关系得到对应字节。

但这二者在通过char得到对应若干字节的时机不一样,以new PrintStream( new BufferedOutputStream( new FileOutputStream("BasicFileOutput.out")));和new PrintWriter( new BufferedWriter( new FileWriter("BasicFileOutput.out")))为例,前者在存字符串时,从PrintStream传到BufferedOutputStream时就已经是字节了;后者在存字符串时,直到FileWriter真正写入文件时,才将字符转换为字节。

如果PrintStream被设置为autoFlush,那么这些情况flush方法将会自动执行:写入字节数组、任何重载版本的println被调用、一个换行符(char)被写入、一个换行符的字节存储(\n)被写入。

如果PrintWriter被设置为autoFlush,那么这些情况flush方法将会自动执行:println、printf、format方法被调用。

它们都不会抛出IO异常,因为它们在方法内部捕获住了,可以通过checkError()来判断是否发生异常。

PrintWriter会使用平台特有的换行符(比如Windows和linux),PrintStream则固定使用\n。

总的来说,Reader/Writer相比InputStream/OutputStream算是一种升级,将当初设计得不好的地方进行了优化。

3 简单用例

3.1使用PrintStream进行打印到文件的操作

@Test
public void IOTest1() throws Exception{
    PrintStream ps = new PrintStream(new FileOutputStream("D:\\\\testofprint.txt"));
    ps.print("我是打印流测试(PrintStream)");
    ps.close();
}

3.2使用PrintWriter进行打印到文件的操作

@Test
public void IOTest2() throws Exception{
    PrintWriter pw = new PrintWriter(new FileWriter("D:\\testofprint.txt"));
    pw.write("我是打印流测试(PrintWriter)");
    pw.close();
}

3.3使用打印流进行重定向的操作,从文件读取内容到程序

@Test
public void IOTest3() throws Exception{
    System.setIn(new FileInputStream("D:\\testofprint.txt"));
    Scanner input = new Scanner(System.in);
    String next = input.next();
    System.out.println(next);
    input.close();
}

3.4使用打印流进行重定向的操作,从程序到文件

//使用打印流进行重定向操作,从程序将内容打印到文件
@Test
public void IOTest4() throws Exception{
    System.setOut(new PrintStream("D:\\testofprint.txt"));
    System.out.println("我是打印流重定向操作");
}