java中的io条记
副标题#e#
Java流在处理惩罚上分为字符流和字节约。字符流处理惩罚的单位为2个字节的 Unicode 字符,别离操纵字符、字符数组或字符串,而字节约处理惩罚单位为1个字节,操纵字节和字节数组。
Java内用Unicode 编码存储字符,字符流处理惩罚类认真将外部的其他编码的字符流和java内Unicode字符流之间的转换。而类 InputStreamReader和OutputStreamWriter处理惩罚字符流和字节约的转换。字符流(一次可以处理惩罚一个缓冲 区)一次操纵比字节约(一次一个字节)效率高。
( 一 )以字节为导向的 stream—— InputStream/OutputStream
InputStream和OutputStream是两个abstact类,对付字节为导向的 stream 都扩展这两个鸡肋(基类 ^_^ );
1、InputStream
1.1
ByteArrayInputStream — 把内存中的一个缓冲区作为 InputStream 利用 . 如利用 http://www.5a520.cn
construct—
(A)ByteArrayInputStream(byte[]) 建设一个新字节 数组输入流( ByteArrayInputStream ),它从指定字节数组中读取数据( 利用 byte 作为其缓冲区数 组)
(B)—ByteArrayInputStream(byte[], int, int) 建设一个新字节数组输入流,它从指定 字节数组中读取数据。
—mark:: 该字节数组未被复制。
1.2
StringBufferInputStream — 把一个 String 工具作为 InputStream .
construct—
StringBufferInputStream(String) 据指定串建设一个读取数据的输入流 串。
注释:不推荐利用 StringBufferInputStream 要领。 此类不能将字符正确的转换为字节。
同 JDK 1.1 版中的雷同,从一个串建设一个流的最佳要领是回收 StringReader 类。
1.3
FileInputStream — 把一个文件作为 InputStream ,实现对文件的读取操纵
construct—
(A)FileInputStream(File name) 建设一个输入文件流,从指定的 File 工具读取数据。
(B)FileInputStream(FileDescriptor) 建设一个输入文件流,从指定的文件描 述器读取数据。
(C)-FileInputStream(String name) 建设一个输入文件流,从指命名称的文 件读取数据。
method —- read() 从当前输入流中读取一字节数据。
read(byte[]) 将 当前输入流中 b.length 个字节数据读到一个字节数组中。
read(byte[], int, int) 将输入流 中 len 个字节数据读入一个字节数组中。
#p#副标题#e#
1.4
PipedInputStream :实现了 pipe 的观念 ,主要在线程中利用 . 管道输入流是指一个通讯管道的吸收端。
一个线程通过管道输出流发送 数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
construct—
PipedInputStream() 建设一个管道输入流,它还未与一个管道输出流毗连。
PipedInputStream(PipedOutputStream) 建设一个管道输入流 , 它已毗连到一个管道输出流。
1.5
SequenceInputStream :把多个 InputStream 归并为一个 InputStream . “ 序列输入流”类答允应用措施把几个输入流持续地归并起来,
而且使它们像单个输入流一 样呈现。每个输入流依次被读取,直到达到该流的末端。
然后“序列输入流”类封锁 这个流并自动地切换到下一个输入流。
construct—
SequenceInputStream (Enumeration) 建设一个新的序列输入流,并用指定的输入流的列举值初始化它。
SequenceInputStream(InputStream, InputStream) 建设一个新的序列输入流,初始化为首先 读输入流 s1, 然后读输入流 s2 。
2、OutputSteam http://www.bt285.cn
2.1
ByteArrayOutputStream :把信息存入内存中的一个缓冲区中 . 该类实 现一个以字节数组形式写入数据的输出流。
当数据写入缓冲区时,它自动扩大。用 toByteArray() 和 toString() 能检索数据。
constructor
(A)— ByteArrayOutputStream() 建设一个新的字节数组输出流。
(B)— ByteArrayOutputStream() 建设一个新的字节数组输出流。
(C)— ByteArrayOutputStream(int) 建设一个新的字节数组输 出流,并带有指定巨细字节的缓冲区容量。
toString(String) 按照指定字符编码将缓冲区内容 转换为字符串,并将字节转换为字符。
write(byte[], int, int) 将指定字节数组中从偏移量 off 开始的 len 个字节写入该字节数组输出流。
write(int) 将指定字节写入该字节数组输出流 。
writeTo(OutputStream) 用 out.write(buf, 0, count) 挪用输出流的写要领将该字节数组输 出流的全部内容写入指定的输出流参数。
2.2
FileOutputStream: 文件输出流是向 File 或 FileDescriptor 输出数据的一个输出流。
constructor
(A)FileOutputStream(File name) 建设一个文件输出流,向指定的 File 工具输出数据。
(B)FileOutputStream (FileDescriptor) 建设一个文件输出流,向指定的文件描写器输出数据。
(C) FileOutputStream(String name) 建设一个文件输出流,向指命名称的文件输出数据。
(D) FileOutputStream(String, boolean) 用指定系统的文件名,建设一个输出文件。
2.3
PipedOutputStream: 管道输出流是指一个通讯管道的发送端。 一个线程通过管道输 出流发送数据,
而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
constructor
(A)PipedOutputStream() 建设一个管道输出流,它还未与一个管道输入流 毗连。
(B)PipedOutputStream(PipedInputStream) 建设一个管道输出流,它已毗连到一个管道 输入流。
( 二 )以字符为导向的 stream Reader/Writer
以 Unicode 字符为导向的 stream ,暗示以 Unicode 字符为单元从 stream 中读取或往 stream 中写入信息。
Reader/Writer 为 abstact 类
以 Unicode 字符为导向的 stream 包罗下面几种范例:
1. Reader
1.1
CharArrayReader :与 ByteArrayInputStream 对应此类实现一个可用作字符输入流 的字符缓冲区
constructor
CharArrayReader(char[]) 用指定字符数组建设一个 CharArrayReader 。
CharArrayReader(char[], int, int) 用指定字符数组建设一个 CharArrayReader
1.2
StringReader :与 StringBufferInputStream 对应其源为一个字 符串的字符流。
StringReader(String) 建设一新的串读取者。
1.3
FileReader :与 FileInputStream 对应
1.4
PipedReader :与 PipedInputStream 对应
2. Writer
2.1 CharArrayWrite :与 ByteArrayOutputStream 对应
2.2 StringWrite :无与之对应的以字节 为导向的 stream
2.3 FileWrite :与 FileOutputStream 对应
2.4 PipedWrite :与 PipedOutputStream 对应
3、两种差异导向的 stream 之间的转换
3.1
InputStreamReader 和 OutputStreamReader :
把一个以字节为导向的 stream 转换成一个以字符为导向的 stream 。
InputStreamReader 类是从字节约到字符流的桥 梁:它读入字节,并按照指定的编码方法,将之转换为字符流。
利用的编码方法大概由名称指定 ,或平台可接管的缺省编码方法。
InputStreamReader 的 read() 要领之一的每次挪用,大概促 使从根基字节输入流中读取一个或多个字节。
为了到达更高效率,思量用 BufferedReader 封装 InputStreamReader ,
BufferedReader in = new BufferedReader(new InputStreamReader (System.in));
譬喻:// 实现从键盘输入一个整数
#p#分页标题#e#
String s = null;
InputStreamReader re = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(re);
try {
s = br.readLine();
System.out.println("s= " + Integer.parseInt(s));
br.close();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (NumberFormatException e)// 当应用 措施试图将字符串转换成一种数值范例,但该字符串不能转换为适当名目时,抛出该异常。
{
System.out.println(" 输入的不是数字 ");
}
InputStreamReader(InputStream) 用缺省的字符编码方法,建设一个 InputStreamReader 。
InputStreamReader(InputStream, String) 用已定名的字符编码方法, 建设一个 InputStreamReader 。
OutputStreamWriter 将多个字符写入到一个输出流,按照指定 的字符编码将多个字符转换为字节。
每个 OutputStreamWriter 归并它本身的 CharToByteConverter, 因而是从字符流到字节约的桥梁。
(三)Java IO的一般利用原则 :
一、按数据来历(去向)分类:
1、是文件:FileInputStream, FileOutputStream, ( 字节约 )FileReader, FileWriter( 字符)
2、是 byte[] :ByteArrayInputStream, ByteArrayOutputStream( 字节约)
3、是 Char[]: CharArrayReader, CharArrayWriter( 字符 流)
4、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节约)StringReader, StringWriter( 字符流)
5、网络数据流:InputStream, OutputStream,( 字 节约)Reader, Writer( 字符流)
二、按是否名目化输出分:
1、要名目化输出:PrintStream, PrintWriter
三、按是否要缓冲分:
1、要缓冲:BufferedInputStream, BufferedOutputStream,( 字节约)BufferedReader, BufferedWriter( 字符流)
四、按数据格 式分:
1、二进制名目(只要不能确定是纯文本的): InputStream, OutputStream 及其所有 带 Stream 竣事的子类
2、纯文本名目(含纯英文与汉字或其他编码方法); Reader, Writer 及其所有带 Reader, Writer 的子类
五、按输入输出分:
1、输入:Reader, InputStream 范例的子类
2、输出:Writer, OutputStream 范例的子类
六、非凡需要 :
1、从 Stream 到 Reader,Writer 的转换类:InputStreamReader, OutputStreamWriter
2、工具输入输出:ObjectInputStream, ObjectOutputStream
3、历程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4、归并输入 :SequenceInputStream
5、更非凡的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
抉择利用哪个类以及它的结构历程的一般准则如下 (不思量非凡需要):
首先,思量最原始的数据名目是什么:原则四
第二,是输入照旧 输出:原则五
第三,是否需要转换流:原则六第 1 点
第四,数据来历(去向)是什么:原则一
第五,是否要缓冲:原则三 (出格注明:必然要留意的是 readLine() 是否有界说,有 什么比 read, write 更非凡的输入或输出要领)
第六,是否要名目化输出:原则二