写在前面:
本文是作者对输入输出流部分知识的认识和总结,难免有不足之处,希望大家积极批评指正,同时希望对大家有所帮助。
本文主要是对一些概念及方法的认识和理解,具体的操作及代码示例见文章——占位——。
1、Java的IO
Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。
流的方向:
所谓的输入输出,是站在内存的角度说的。
输入流是输入到内存中,即读取外部的数据(磁盘、光盘等存储设备中的数据)到程序(内存)中。
输出流是输出到存储设备中,即将程序(内存)中的数据输出到磁盘、光盘等外部存储设备中。
2、字符流
一次处理一个字符,即两个字节(16位)。
<1、字符输入流
1)Reader(抽象类)
用于读取字符流的抽象类。
主要方法:
-public int read() throws IOException
读取单个字符。若到达流末尾,则返回-1。
-public int read(char[] cbuf) throws IOException
将字符读入数组。返回值为实际读取的字符数,若到达流末尾,则返回-1。
-public abstract int read(char[] cbuf, int off, int len) throws IOException
将字符读入数组的某一部分。
cbuf - 目标缓冲区
off - 开始存储字符处的偏移量
len - 要读取的最多字符数
返回:
读取的字符数,如果已到达流的末尾,则返回 -1
-public int close( ) :我们在使用完后,必须对我们打开的流进行关闭,释放与之关联的资源。
2)FileReader
用来读取字符文件(如:纯文本文件)的便捷类。
FileReader 用于读取字符流。要读取原始字节流,请考虑使用FileInputStream。
主要方法:
-public FileReader(String fileName) throws FileNotFoundException
-public FileReader(File file) throws FileNotFoundException
-public FileReader(FileDescriptor fd)
3)CharArrayReader
此类实现一个可用作字符输入流的字符缓冲区。
4)StringReader
其源为一个字符串的字符流。
5)InputStreamReader
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
主要方法:
-public InputStreamReader(InputStream in)
创建一个使用默认字符集的 InputStreamReader。
-public InputStreamReader(InputStream in, Charset cs)
创建使用给定字符集的 InputStreamReader。
-public InputStreamReader(InputStream in, CharsetDecoder dec)
创建使用给定字符集解码器的 InputStreamReader。
-public InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
-public String getEncoding()
返回此流使用的字符编码的名称。
6)FilterReader
用于读取已过滤的字符流的抽象类。
7)BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。例如,
BufferedReader in = new BufferedReader(new FileReader(“foo.in”));
主要方法:
-public BufferedReader(Reader in)
创建一个使用默认大小输入缓冲区的缓冲字符输入流。
-public BufferedReader(Reader in, int sz)
创建一个使用指定大小输入缓冲区的缓冲字符输入流。
-public String readLine() throws IOException
读取一个文本行。通过下列字符之一即可认为某行已终止:换行 (‘\n’)、回车 (‘\r’) 或回车后直接跟着换行。
返回:
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null 。
<2、字符输出流
1)Writer(抽象类)
写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
主要方法:
-public Writer append(char c) throws IOException
将指定字符添加到此 writer。
-public Writer append(CharSequence csq) throws IOException
将指定字符序列添加到此 writer。
-public Writer append(CharSequence csq,int start,int end) throws IOException
将指定字符序列的子序列添加到此 writer.
-public void write(int c) throws IOException
写入单个字符。
-public void write(char[] cbuf) throws IOException
写入字符数组。
-public abstract void write(char[] cbuf, int off, int len) throws IOException
写入字符数组的某一部分。
-public void write(String str) throws IOException
写入字符串。
-public void write(String str, int off, int len) throws IOException
写入字符串的一部分。
-public abstract void flush() throws IOException
刷新该流的缓冲。如果该流已保存缓冲区中各种 write() 方法的所有字符,则立即将它们写入预期目标。
-public abstract void close() throws IOException
关闭此流,但要先刷新它。在关闭该流之后,再调用 write() 或 flush() 将导致抛出 IOException。关闭以前关闭的流无效。
2)CharArrayWriter
此类实现一个可用作 Writer 的字符缓冲区。
主要方法:
-public CharArrayWriter()
构造方法。
3)OutputStreamWriter
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,如:
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
主要方法:
-OutputStreamWriter (OutputStream out)
创建使用默认字符编码的 OutputStreamWriter。
-OutputStreamWriter (OutputStream out, String charsetName)
创建使用指定字符集的 OutputStreamWriter。
4)PrintWriter
向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流(PrintStream)进行写入。
主要方法:
构造方法较多,请参阅API。
-public void print()
-public void println()
5)FileWriter
用来写入字符文件的便捷类。
提示:
-此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
-FileWriter 用于写入字符流。要写入原始字节流,请考虑使用 FileOutputStream。
主要方法:
-public FileWriter(File file, boolean append) throws IOException
根据给定的 File 对象构造一个 FileWriter 对象。如果第二个参数为 true,则将字节写入文件末尾处,即续写,该参数可以不写,缺省值代表不续写。
-public FileWriter(String fileName, boolean append) throws IOException
根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。该布尔值的作用同上。
6)BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
提示:
-通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如:
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(“foo.out”)));
3、字节流
一次处理一个字节
<1、字节输入流
1)InputStream(抽象类)
此抽象类是表示字节输入流的所有类的超类。
主要方法:
-public abstract int read() throws IOException
从输入流中读取数据的下一个字节。返回值为下一个数据字节,若到达流的末尾,则返回-1。
-public int read(byte[] b) throws IOException
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。
返回值为读入缓冲区的总字节数;如果因为已经到达流末尾而不再有数据可用,则返回 -1。
-public int read(byte[] b, int off, int len) throws IOException
将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。若干到达流的末尾,则返回-1。
-public void close() throws IOException
2)FileInputStream
把一个文件作为InputStream,实现对文件的读取操作 。(主要操作原始字节流文件)
3)BufferedInputStream
当向缓冲流写入数据时候,数据先写到缓冲区,待缓冲区写满后,系统一次性将数据发送给输出设备。
<2、字节输出流
1)FileInputStream
将数据写入文件的输出流
提示:
FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter。
2)BufferedInputStream
当从向缓冲流读取数据时候,系统先从缓冲区读出数据,待缓冲区为空时,系统再从输入设备读取数据到缓冲区。
4、流的选择
1、确定数据的流向,如果将外部数据读入内存,用输入流;如果讲数据写入外部存储设备,用输出流。
2、操作对象是否为纯文本,是:字符流;否:字节流。
3、想要提高效率,用缓冲流(Buffer…..)包装。没有人会嫌弃效率太高,所以时刻考虑包装。
写在最后
个人见解,难免有误,望指正,谢谢。
具体操作及示例代码,见文章——占位——。