java流在处理上分为字节流和字符流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
Java内用Unicode编码存储字符,字符流处理类将外部的其他编码的字符流和java内Unicode字符流之间的转换。而类InputStreamReader和OutputStreamWriter处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。
(一)以字节为导向的stream------InputStream/OutputStream
InputStream和OutputStream是两个abstract(抽象)类,对于字节为导向的stream都扩展这两个基类:
InputStream:
1.1 ByteArrayInputStream --把内存中的一个缓冲区作为InputStream使用。
构造函数:
(A)ByteArrayInputStream(byte[])创建一个新字节数组输入流(ByteArrayInputStream),它从指定字节数组中读取数据(使用byte作为其缓冲区数组)
(B)ByteArrayInputStream(byte[] buf,int offset,int length)创建一个新字节数组输入流,它从指定字节数组中读取。
---mark::该字节数组未被复制
1.2 StringBufferInputStream --把一个String对象作为InputStream
Construct---
StringBufferInputStream(String)根据指定字符串创建一个读取数据的输入流串
注:不推荐使用StringBufferInputStream,此类不能将字符正确的转换为字节。从一个串创建一个流的最佳方式是采用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个字节数据读入到一个字节数组中
1.4 PipedInputStream:实现了pipe的概念,主要在线程中使用,管道输入流是指一个通讯管道的接收端。
一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可以实现两个线程间的通讯.
Construct--
PipedInputStream()创建一个管道输入流,他还未与一个管道输出流连接。
PipedInputStream(PipedOutputStream)创建一个管道输入流,他已经连接到某个管道输出流。
1.5 SequenceInputStream:把多个InputStream合并为一个InputStream。序列化输入流类允许应用程序吧几个输入流连续的合并起来,并且使他们想dangerous输入流一样出现。每个输入流依次被读取,直到到达该流的末尾。然后序列化输入流类关闭这个流并自动切换到下一个输入流。
Construct---
SequenceInputStream(Enumeration)创建一个县的序列输入流,并用指定的输入流的枚举值初始化他。
SequenceInputStream(InputStream,InputStream)创建一个新的序列化输入流,初始化为首先读取输入流s1,然后读取输入流s2。
OutputStream
2.1ByteArrayOutputStream:把信息存入内存中的一个缓冲区中,该类实现一个以字节数组形式写入数据的输出流。当数据写入缓冲区时,它自动扩大。用toByteArray()或者toString能检索数据
construct
ByteArrayOutputStream(),创建一个新的字节数组输出流。
ByteArrayOutputStream(int),创建一个新的字节数组输出流。并带有指定大小字节的缓冲区容量
method:
toString(String)根据指定字符编码将缓冲区内容转换为字符串,并将字节转换为字符
write(byte[],int,int)将指定字节数组中从偏移量off开始的len个字节写入该字节输入输出流
write(int)将指定字节写入该字节数组输出流
writeTo(OutputStream)用out.write(buf,0,count)调用输出流的写方法将该字节数组输出流的全部内容写入指定的输出流参数,
2.2FileOutputStream:文件输出流事项File或FileDescriptor输出数据的一个输出流
Construct
(A)FileOutputStream(File name)创建一个文件输出流,向指定的File对象输出数据
(B)FileOutputStream(FileDescriptor)创建一个文件输出流,向指定的文件描述起输出数据
©FileOutputStream(String name)创建一个文件输出流,向指定名字的文件输出数据
(D)FileOutputStream(String,boolean)用指定系统的文件名,创建一个输出文件
2.3PipedOutputStream:管道输出流是指一个通讯管道的发送端,一个线程通过管道输出流发送数据,儿另一个线程通过管道输入流读取数据,这样可以实现两个线程之间的通讯。
(A)PipedOutputSream(),创建一个管道输出流,他还没有与一个管道输入流连接
(B)PipedOutputStream(PipedInputStream)创建一个管道输出流,它已经连接到一个管道输入流
(二)以字符为导向的streamReader/Writer
以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或向stream中写入数据
Reader/Writer为abstract(抽象)类
1.Reader
1.1CharArrayReader:与ByteArrayInputStream对应,此类实现了一个可用作字符输入流的字符缓冲区
Construct
CharArrayReader(char[])用指定字符数组创建一个CharArrayReader
CharArrayReader(char[],int,int)用指定字符数组创建一个CharArrayReader
1.2StringReader:与StringBufferInputStream对应,为一个字符串的字符流
StringReader(String)创建一个县的字符串读取者
1.3FileReader:与FileInputStream对应
1.4PipedReader:与PipedInputStream对应
2.Writer
2.1CharArrayWrite:与ByteArrayOutputStream对应
2.2StringWrite:没有与他对应的以字节为导向的stream
2.3FileWrite:与FileOutputStream对应
2.4PipedWrite:与PipedOutputSteam对应
3.两种不同导向的stream之间的转换
3.1 InputStreamReader和OutputStreamWriter:
把一个以字节为导向的stream转换成一个以字符为导向的stream
InputStreamReader类是从字节流到字符流的桥梁:他读取字节并根据提供的编码方式,将之转换为字符流。使用的编码方式可能由名称显示指定,或由平台可接受的缺省编码方式。
InputStreamReader的read()方法,之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。为了达到更高的效率,考虑用BufferedRead封装InputStreamReader,即:
BufferedReaderin = new BufferedReader(new InputStringReader(new InputStream()));
InputStreamReader(InputStream),使用缺省的字符编码方式,创建一个InputStreamREader
InputStreamReader(InputSteam,String)用已命名的字符编码方式,创建一个InputStreamReader
OutputStreamWriter将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节,每个OutputStreamWriter合并他自己的CharToByteConverter,因而是从字符流到字节流的桥梁
(三) JAVA I/O的一般使用原则
一、按数据来源(去向)分类:
1.是文件:FileInputStream,FileOutputStream(字节流);FileReader,FileWriter(字符流)
2.是byte[]:ByteArrayOutputStream,ByteArrayInputStream(字节流);
3.是char[]:CharArrayReader,CharArrayWriter(字符流);
4.是String:StringBufferInputStream,StringBufferOutputStream(字节流);StringReader,StringWriter(字符流)
5.是网络数据流:InputStream,OutputStream(字节流);Reader,Writer(字符流)
二、是否按格式化输出:
PrintStream,PrintWriter
三、是否要缓冲分
要缓冲:BufferedReader,BufferedWriter(字符流);BufferedInputStream,BufferedOutputStream(字节流)
四、按数据格式分
1.二进制格式(只要不能确定是纯文本的):所有带有Stream结束(字节流)
2.纯文本格式,带有Reader、Writer的(字符流)
五、按输入输出分
1.输入:Reader,InputStream
2.输出:Writer,OutputStream
六、特殊需要