Java——IO系统概览 (3)

使用TestBufferedReader.read()返回的字符串来构造一个StringReader对象。然后调用StringReader的read()方法每次读取一个字符,并将其发送到控制台。

public class MemoryInput { public static void main(String[] args) throws IOException { StringReader in = new StringReader(TestBufferedReader.read("mmdou.txt")); int ch; while((ch = in.read()) != -1) { System.out.print((char)ch); //read是以int形式返回下一字节,所以需要强制转换 } } } /* output: This is mmdou.txt To be or not to be that is a question. */ 格式化的内存输入

若是要读取格式化数据,可以使用DataInputStream,它是面向字节的I/O类。创建DataInputStream需要提供InputStream类型参数。这里我们使用将ByteArrayInputStream作为传入给DataInputStream的InputStream。使用TestBufferedReader.read("dis.txt").getBytes()作为ByteArrayInputStream的构造参数。

public class FormattedMemoryInput { public static void main(String[] args) throws IOException { try { DataInputStream dis = new DataInputStream(new ByteArrayInputStream (TestBufferedReader.read("dis.txt").getBytes())); while(true) { System.out.print((char)dis.readByte()); } }catch (EOFException e) { System.err.println("End of file."); } } } /* output: Road End of file. */

上面使用捕获异常来结束来检测输入流是否结束是不正确的用法!我们要判断输入是否结束可以使用avaliable()方法返回可以从此输入流中读取(或跳过)的字节数的估计值(在没有阻塞的情况下)。下面将使用avaliable()演示如何一个字节一个字节地读取文件:

public class TestEOF { public static void main(String[] args) throws IOException{ DataInputStream in = new DataInputStream(new ByteArrayInputStream (TestBufferedReader.read("dis.txt").getBytes())); while(in.available() != 0) { System.out.print((char)in.readByte()); } } } 基本的文件输出

FileWriter对象可以向文件写入数据。我们会创建一个与指定文件连接的FileWriter。通常,我们会使用BufferedWriter将其包装起来用以缓冲输出(缓冲往往可以显著增加I/O操作性能,就像前面一小节缓冲输入文件所解释一样)。在本例中,为了提供格式化机制,它被包装成了PrintWriter。安照这种方式创建的数据文件,可以被作为普通文本读取。

public class BasicFileOutput { static String file = "BasicFileOutput.out"; public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new StringReader(TestBufferedReader.read("BasicFileOutput.java"))); //PrintWriter out = new PrintWriter(file) 等价于下面一句。此方式隐含帮我们执行所有装饰工作 PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file))); int lineCount = 1; String s; while((s = in.readLine()) != null) { //添加行号 out.println(lineCount++ + ":" + s); } //刷新缓冲区 out.flush();//or out.close(); System.out.println(TestBufferedReader.read(file)); } } 存储和恢复数据

若是我们想要实现输出可供另外一个“流”恢复的数据,那么就需要使用DataOutpurStream写入数据,并用DataInputStream恢复数据。在介绍装饰器类FilterInputStream和FilterOutputStream时,我们介绍过这两个类,在此就不在使用例子说明。

我们使用DataOutputStream写入数据,Java保证我们可以使用DataInputStream准确地读取数据——无论读和写数据的平台多么地不同。

管道流

PipedInputStream、PipedOutputStream、PipedReader和PipedWriter用于任务之间的通信,将在后面介绍。

标准I/O

标准I/O这个术语参考的是Unix中"程序所使用的单一信息流"这个概念。程序的所有输入都可以来自于标准输入,它的所有输出也都可以发送到标准输出,以及所有错误信息都可以发送到标准错误。标准I/O的意义在于:我们可以很容易地把程序串联起来,一个程序的标准输出可以作为另一个程序的标准输入。

从标准输入中读取

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgdyfw.html