`

io流

阅读更多

一、流的概念
    流一般分为输入流和输出流两类,但这种划分并不是绝对的。比如一个文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流。当然,键盘只是一个输入流,而屏幕则只是一个输出流。输入流输出流指的是传输中的连续不断的数据集合。

 

二、流的分类
流按照处理数据的单位可分为两种:字节流和字符流.(相对于内存)

 

                输入流类             输出流类
字节流类 InputStream   OutputStream
字符流类 Reader            Writer

以上四个I/O流类都是抽象类,不能直接使用

 

三、流结构

1、InputStream

FileInputStream:从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。

                            用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。

 

FilterInputStream:包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。

                               类本身只是简单地重写那些将所有请求传递给所包含输入流的 InputStream 的所有方法。

                               该类子类可进一步重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。
---BufferedInputStream:为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建

                                        BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可

                                        根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入

                                        流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次

                                        mark 操作后读取的所有字节。

 

2.OutputStream

FileOutputStream:文件输出流是用于将数据写入 FileFileDescriptor 的输出流。文件是否可用或能否可以被

                               创建取决于基础平台。特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对

                               象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失

                               败。 FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使

                               用 FileWriter

 

FilterOutputStream:此类是过滤输出流的所有类的超类。类本身只是简单地重写那些将所有请求传递给所包含输出流的

                                 OutputStream 的所有方法。

---BufferedOutputStream:该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流

                                          中,而不必针对每次字节写入调用底层系统。

 

3.Reader

BufferedReader:从字符输入流中读取文本,缓冲各个字符。通常,Reader 所作的每个读取请求都会导致对底层字符

                            或字节流进行相应的读取请求。因此,建议用BufferedReader 包装所有其 read() 操作可能开销很

                            高的 Reader(如 FileReader 和 InputStreamReader)。例如,
                            BufferedReader in = new BufferedReader(new FileReader("foo.in"));

InputStreamReader:将字节流转换为字符流。每次调用 InputStreamReader 中的一个 read() 方法都会导致从底

                                  层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的

                                  字节,使其超过满足当前读取操作所需的字节。 为了达到最高效率,可要考虑在

                                  BufferedReader 内包装 InputStreamReader。例如:
                                  BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 ---FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自

                        定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。FileReader 用于读取字

                        。要读取原始字节流,请考虑使用 FileInputStream。

StringReader:其源为一个字符串的字符流。 构造方法StringReader(String s) 创建一个新字符串 reader。


 4.Writer

BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

OutputStreamWriter:将字节流转换为字符流。

                                   Writer out  = new BufferedWriter(new OutputStreamWriter(System.out));
---FileWriter:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要

              自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。

              文件是否可用或是否可以被创建取决于底层平台。特别是某些平台一次只允许一个 FileWriter(或其

              他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法

              将失败。FileWriter 用于写入字符流。要写入原始字节流,请考虑使用 FileOutputStream

 

分享到:
评论
2 楼 z360194753 2012-07-31  
  够详细了
1 楼 yang1527866 2012-07-26  
挺详细的

相关推荐

Global site tag (gtag.js) - Google Analytics