(23)IO之打印流 PrintStream & Printwriter

PrintStream

PrintStream可以接受文件和其他字节输出流,所以打印流是对普通字节输出流的增强,其中定义了很多的重载的print()println(),方便输出各种类型的数据。

PrintStream

是一个字节打印流,System.out对应的类型就是PrintStream

它的构造函数可以接收三种数据类型的值。

1,字符串路径。

2File对象。

3OutputStream

注意: 打印流的三种方法

 

void print(数据类型 变量)

 

println(数据类型 变量)

 

printf(String format, Object... args) 

 

可以自定数据格式

 

print println方法的区别在于,一个换行一个不换行

 

print 方法和write方法的却别在于,print提供自动刷新.

 

普通的write方法需要调用flush或者close方法才可以看到数据.

 

JDK1.5之后JavaPrintStream进行了扩展,增加了格式化输出方式,可以使用printf()重载方法直接格式化输出。但是在格式化输出的时候需要指定输出的数据类型格式。%d, %s, %f, %lf, %c

 

PrintStream在实际中主要有下面两个用处

 

1、把任意类型的数据自动转换为字符串输出,相当的方便。

 

2、方便收集异常日志。

 

现在说一下一直使用了那么久的System.out到底是什么,api文档直接查看可以知道System.out就是System内部维护的一PrintStream的对象,默认情况这个标准输出流,把内容输出到控制台,你完全可以使用System.setOut方法重新制定标准输出

 

的位置,只需要传入一个相应的PrintStream参数即可。

 

//重置标准输出流的位置

 

System.setOut(printStream);

 

System.out.println("哈哈哈,你猜猜我在那里呀!!");

 

这是非常类似于C语言里面的freeopen操作。

 

收集异常

 

//收集异常的日志信息 默认情况下异常信息打印到控制台,产品部署到服务器上。而控制台上只能打印部分日志信息,会丢失很多。

 

//这是我们需要把错误信息打印到文件,e.printStackTracePrintStream )传入一个PrintStream参数,打印到文件.但是有一点问题是,这个时候,输出的信息不会追加,而是不断的覆盖。一般日志文件我们用 .log结尾,用日期命名。

 1 //这个时候,可以给PrintStream 传入一个OutputStream 向下面这样 
 2         File logFile = new File("D:\2016722.log");
 3 //        PrintStream logPrintStream = new PrintStream(logFile);
 4         PrintStream logPrintStream = new PrintStream(new FileOutputStream(logFile, true));
 5         try
 6         {
 7             int c = 4/ 0;
 8             System.out.println("c" +c);
 9         } catch (Exception e)
10         {
11             e.printStackTrace(logPrintStream);
12         }

PrintWriter

是一个字符打印流。构造函数可以接收四种类型的值。

1,字符串路径。

2File对象。

对于12类型的数据,还可以指定编码表。也就是字符集。

3OutputStream

4Writer

对于34类型的数据,可以指定自动刷新。

注意:该自动刷新值为true时,只有三个方法可以用:println,printf,format.

如果想要既有自动刷新,又可执行编码。如何完成流对象的包装?

PrintWrter pw =

new PrintWriter(new OutputSteamWriter(new FileOutputStream("a.txt"),"utf-8"),true);

如果想要提高效率。还要使用打印方法。

PrintWrter pw =

newPrintWriter(new  BufferdWriter(new OutputSteamWriter(

newFileOutputStream("a.txt"),"utf-8")),true);

 1 public static void testPrintWriter() throws Exception {
 2         PrintWriter pw = new PrintWriter("c:/b.txt", "gbk");
 3 
 4         // pw.append("xxx");
 5         // pw.println(55);
 6         // pw.println('c');
 7         // pw.printf("%.1s与%4s打价格战, %c", "京东","苏宁", 'a');
 8 
 9         pw.close();
10 
11     }
12 
13 
14 // 下面是使用Scanner
15 public static void testScanner() throws Exception {
16         // Scanner scanner = new Scanner(new File("c:/test.txt"));
17         Scanner scanner = new Scanner(System.in);
18 
19         System.out.println(scanner.nextInt());
20         System.out.println(scanner.nextBoolean());
21 
22         scanner.close();
23     }

 

 

 

 

原文地址:https://www.cnblogs.com/OliverZhang/p/6026590.html