1.输入缓冲文件
可以使用以String或FIle对象作为文件名的FileReader。为了提高速度,我们将产生的引用传递给BufferedReader构造器用于文件缓冲,由于BufferedReader也提供readline()方法,所以它将是最终文件读取的接口。
2.从内存输入
下面的示例,从BufferedInputFile.read()读入的String结果被用来创建一个StringReader。然后调用read()每次读取一个字符,并把它发送到控制台。
注意read()是以int形式返回下一个字节,因此必须类型转换为char才能正确打印。
3.格式化的内存输入
DataInputStream是一个面向字节的I/O类,因此我们必须使用InputStream而不是Reader类。当然我们可以用InputStream以字节形式读取文件,但是这里读取字符串。
必须为ByteArrayInputStream提供字节数组,为了产生该数组,String提供了一个可以实现此项工作的getBytes()方法。
如果我们从DataInputStream用readByte()一次一个字节地读取字符,那么任何字符的值都是合法的结果,因此返回值不能用来检测输入是否结束,相反,我们可以使用available()方法查看还有多少可供读取的字符。
注意。available()的工作方式会随着所读取的媒介类型的不同而有所不同;字面意思就是“在没有阻塞的情况下能读取的字节数”。对于文件,这个就意味着整个文件。但是对于不同类型的流,可能就不是这样,因此需要谨慎使用。
我们也可以通过捕获异常的方式检测输入的末尾。但是,使用异常进行流控制,被认为是对异常特性的错误使用。
4.基本的文件输出
FileWriter的对象可以向文件写入数据。首先,创建一个与指定文件连接的FileWriter。实际上,我们通常会用BufferedWriter将其包装起来用以缓冲输出(尝试移除此包装来感受对性能的影响——缓冲往往能显著地增加I/O操作的性能)。在本例中,为了提供格式化机制,它被装饰成了PrintWriter。
PrintWriter提供了辅助构造器,使得可以简写装饰工作
遗憾的是,其他常见的写入任务没有快捷方式,因此典型的I/O仍旧包含大量的冗余文本。
5.从标准输入中读取
按照标准I/O模型,Java提供了System.in、System.out、System.err。其中后两个已被包装成PrintStream对象,而前者未经处理的InputStream。这意味着在读取System.in之前必须对其进行包装。
通常我们会用readLine()一次一行地读取输入,因此,我们将System.in包装成BufferedReader来使用。这要求我们必须用InputStreamReader把System.in转换成Reader。
回车和ctrl-z都能停止循环。