java的输入流
虽然,我们常常想做的一件工作是将名目化的输出打印到节制台,但那已在第5章建设的com.bruceeckel.tools中获得了简化。
第1到第4部门演示了输入流的建设与利用(尽量第4部门展示了将输出流作为一个测试东西的简朴应用)。
1. 缓冲的输入文件
为打开一个文件以便输入,需要利用一个FileInputStream,同时将一个String或File工具作为文件名利用。为提高速度,最好先对文件举办缓冲处理惩罚,从而得到用于一个BufferedInputStream的构建器的功效句柄。为了以名目化的形式读取输入数据,我们将谁人功效句柄赋给用于一个DataInputStream的构建器。DataInputStream是我们的最终(final)工具,并是我们举办读取操纵的接口。
在这个例子中,只用到了readLine()要领,但理所虽然任何DataInputStream要领都可以回收。一旦抵达文件末端,readLine()就会返回一个null(空),以便中止并退出while轮回。
“String s2”用于聚积完整的文件内容(包罗必需添加的新行,因为readLine()去除了那些行)。随后,在本措施的后头部门中利用s2。最后,我们挪用close(),用它封锁文件。从技能上说,会在运行finalize()时挪用close()。并且我们但愿一旦措施退出,就产生这种环境(无论是否举办垃圾收集)。然而,Java 1.0有一个很是突出的错误(Bug),造成这种环境不会产生。在Java 1.1中,必需明晰挪用System.runFinalizersOnExit(true),用它担保会为系统中的每个工具挪用finalize()。然而,最安详的要领照旧为文件明晰挪用close()。
2. 从内存输入
这一部门回收已经包括了完整文件内容的String s2,并用它建设一个StringBufferInputStream(字串缓冲输入流)——作为构建器的参数,要求利用一个String,而非一个StringBuffer)。随后,我们用read()依次读取每个字符,并将其发送至节制台。留意read()将下一个字节返回为int,所以必需将其造型为一个char,以便正确地打印。
3. 名目化内存输入
StringBufferInputStream的接口是有限的,所以凡是需要将其封装到一个DataInputStream内,从而加强它的本领。然而,若选择用readByte()每次读出一个字符,那么所有值都是有效的,所以不行再用返回值来侦测何时竣事输入。相反,可用available()要领判定有几多字符可用。下面这个例子展示了如何从文件中一次读出一个字符:
//: TestEOF.java // Testing for the end of file while reading // a byte at a time. import java.io.*; public class TestEOF { public static void main(String[] args) { try { DataInputStream in = new DataInputStream( new BufferedInputStream( new FileInputStream("TestEof.java"))); while(in.available() != 0) System.out.print((char)in.readByte()); } catch (IOException e) { System.err.println("IOException"); } } } ///:~
留意取决于当前从什么媒体读入,avaiable()的事情方法也是有所区此外。它在字面上意味着“可以不受阻塞读取的字节数量”。对一个文件来说,它意味着整个文件。但对一个差异种类的数据流来说,它却大概有差异的寄义。因此在利用时应思量周全。
为了在这样的环境下侦测输入的竣事,也可以通过捕捉一个违例来实现。然而,若真的用违例来节制数据流,却显得有些大材小用。
4. 行的编号与文件输出
这个例子展示了如何LineNumberInputStream来跟踪输入行的编号。在这里,不行简朴地将所有构建器都组合起来,因为必需保持LineNumberInputStream的一个句柄(留意这并非一种担任情况,所以不能简朴地将in4造型到一个LineNumberInputStream)。因此,li容纳了指向LineNumberInputStream的句柄,然后在它的基本上建设一个DataInputStream,以便读入数据。
这个例子也展示了如何将名目化数据写入一个文件。首先建设了一个FileOutputStream,用它同一个文件毗连。思量到效率方面的原因,它生成了一个BufferedOutputStream。这险些必定是我们一般的做法,但却必需明晰地这样做。随后为了举办名目化,它转换成一个PrintStream。用这种方法建设的数据文件可作为一个原始的文本文件读取。
符号DataInputStream何时竣事的一个要领是readLine()。一旦没有更多的字串可以读取,它就会返回null。每个行城市陪伴本身的行号打印到文件里。该行号可通过li查询。
可看到用于out1的、一个明晰指定的close()。若措施筹备掉回头来,并再次读取沟通的文件,这种做法就显得相当有用。然而,该措施直到竣事也没有查抄文件IODemo.txt。正如以前指出的那样,假如不为本身的所有输出文件挪用close(),就大概发明缓冲区不会获得刷新,造成它们不完整。