java I/O解析

来源:互联网 发布:淘宝刷手有什么风险么 编辑:程序博客网 时间:2024/06/06 22:25

1 . Java I/O是一套Java用来读写数据 ( 输入和输出 ) 的API。Java I/O包主要涉及文件、网络数据流、内存缓冲等的输入和输出。
2 .关于 InputStream、OutPutStream、Reader、Writer的解释:

(1)流分为字节流和字符流,字节流用InputStreamOutputStream来实现,字符流用Reader和Writer来实现。(2)InputStreamOutputStream : 输入流可以理解为向内存输入,输出流可以理解为从内存中输出。输入流有read()方法,输出流有write()方法。(3)Reader和Writer:Reader是输入字符流,Writer是输出字符流。

3 . 几种不同介质中流的传输:

(1) 文件中: 要根据文件是二进制文件还是文本文件来选择用FileInputStream还是用FileReader来读取文件。可以使用RandomAccessFile来实现跳跃式的读取文件中的某些部分。同理,根据文件是二进制文件还是文本文件选择用FileOutputStream还是用FileWriter来写入文件。(2)管道中: 管道为同一个JVM中的两个线程提供了通信的能力,不能利用管道进行不同JVM中的线程的通信。Java中,通信的双方应该是同一个进程中的不同线程。PipedInputStream 和 PipedOutputStream可以用来创建管道,管道的通信双方是在同一个进程中的不同两个线程。一个PipedInputStream和一个PipedOutputStream相关联,通过PipedOutputStream写入的数据可以通过PipedInputStream读出来。需要两个线程是因为read和write操作会产生阻塞,如果在一个线程中,会导致死锁。(3)网络中: 对于在网络中的传输,网络 Api提供在不同进程间提供网络连接,Java io 用来实现在建立连接后的进程间交换数据。当网络连接建立好之后,操作方式和操作文件很类似,InputStream用来读出数据,OutputStream用来写入数据。

4 .字节和字符数组的应用:
Java中,常用字符或者字节数组临时存储数据,而不是简单的字节或者字符流。
InputStream 和 OutputStream只能处理字节流。
Reader和Writer只能处理字符流。
所以我们在应用的过程中,需要将以上四种转化为字符数组或者字节数组的形式,方便java中应用。

(1) 从InputStream和Reader中读取数据:用ByteArrayInputStream或者CharArrayReader封装字节或者字符数组从数组中读取数据。通过这种方式字节和字符就可以以数组的形式读出了。(2) 通过OutputStream和Writer来写入数据:把数据写到ByteArrayOutputStream或者CharArrayWriter中。你只需要创建ByteArrayOutputStream或者CharArrayWriter,把数据写入,就像写其它的流一样。当所有的数据都写进去了以后,只要调用toByteArray()或者toCharArray,所有写入的数据就会以数组的形式返回。

5 . System.in System.out System.err

1)JVM启动时通过Java运行时初始化这三个流。(2)这三个流是java.lang.System中的静态变量(final static),但是初始化后仍然可以更改他们。(3)可以使用System.setIn(), System.setOut(), System.setErr()方法设置新的系统流(这三个方法均为静态方法,内部调用了本地native方法重新设置系统流).

6 . 关于组合流:
正常情况下,一次性读取一个字节或者一个字符,写入一个字节或者字符。
但是这种方式效率太低,所以我们将流组合起来使用,我们从磁盘中可以一次性读取一大块数据,然后从读到的数据块中获取字节。即利用了缓冲来实现。

我们将InputStream包装到BufferedInputStream 中,将OutPutStream包装到BufferedOutputStream中。实现缓冲,从而实现高效率读取数据块,再获取字节。

7 .Java io 异常处理:
注意,所有的流和Reader、Writer等在使用完成的时候都需要关闭操作,我们可以在finally块中进行关闭操作。

待更!

0 0
原创粉丝点击