1:流分类(java.io)
按方向:输入流输出流(站在程序角度)
按处理数据单位不同:字节流/字符流
按照功能不同:节点流/处理流
java.io内定义的所有流类型都分别继承自以下四种抽象流类型
字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer
节点流:为可以从一个特点的数据源(节点)读写数据(如文件,内存)
处理流:是连接在已存在的流(节点流或处理流)之上,通过对数据的处理为程序员提供更强大的读写功能
2:InputStream的子类
继承自InputStream的流都属于向程序输入数据,且数据的单位为字节(8位)
其中处理流:FilterInputStream/SequenceInputStream/ObjectInputStream
其中节点流:FileInputStream/PipedInputStream/ByteArrayInputStream/StringBufferInputSteam
继承FilterInputStream的只有处理流
LineNumberInputStream/DataInputStream/BufferedInputStream/PushbackInputStream
基本方法(所有方法都会抛出IOException)
int read() throws IOException/读取一个字节,返回-1表示已到输入流末尾,否则返回(0-255)
int read(byte [] buffer)/读取一系列字节存储到buffer里,返回实际读取的字节数,如果读前已到输入流末尾返回-1
int read(byte[] buffer,int offset,int length)/读取length个字节,从buffer的offset位开始存,返回实际读取的字节数
void close()/关闭字节输入流
long skip(long n)/跳过n个字节不读,返回实际跳过的字节数
3:OutputStream的子类
处理流:FilterOutputStream/ObjectOutputStream
节点流:FileOutputStream/PipedOutputStream/ByteArrayOutputStream
其中FilterOutputStream的处理流子类
DataOutputStream/BufferedOutputStream/PrintStream
基本方法(所有方法都会throws IOException)
void write(int b)/向输入流写入一个字节数据,给字节数据为参数b的低八位
void write(byte[] b)/将字节数组b的所有数据写入输出流
void write(byte[] b,int off,int len)/将b字节数组从off开始的len个字节数组写入到输出流
void close()/
void flush()/将输出流中缓冲的数据全部写入到目的地
4:Reader的子类(处理单位为字符(两个子节))
处理流:BufferedReader/InputStreamReader/FilterReader
节点流:CharArrayReader/PipedReader/StringReader
其中:
BufferedReader->LineNumberReader(处理流)
InputStreamReader->FileReader(节点流)
FilterReader->PushbackReader(处理流)
基本方法 (全都throws IOException)
int read()/读取一个字符并以整数的形式返回(0-255),返回-1如果到输入流的末尾
int read(char[] c)/返回实际读取的字符数
int read(char[] c,int offset,int length)/
void close()/
long skip(long l)/
5:Writer(用于程序输出数据,数据单位为字符)
子类
处理流:BufferedWriter/OutputStreamReader/FilterWriter
节点流:CharArrayWriter/PipedWriter/StringWriter
其中
OutputStreamReader->FileWriter(节点流)
基本方法(都会抛出 throws IOException)
void write(int b)/将b的低16位写入输出流
void write(char[] c)/
void write(char[] c,int offset,int length)/
void write(String s)/调用String的toCharArray方法
void write(String s,int offset,int length)/
void close()/
void flush()/
6:节点流类型
类型 字符流 字节流
File(文件) FileReader/FileWriter FileInputStream/FileOutSteam
Memort Array(内存数组) CharArrayReader/CharArrayWriter ByteArrayInputStream/ByteArrayOutputStream
Memory String(内存字符) StringReader/StringWriter 无
Pipe(管道) PipedReader/PipedWriter PipedInputStream/PipedOutputStream
7:FileInputStream/FileOutputStream(里面的构造函数都throws FileNotFoundException)
FileInputStream/FileOutputStream(String name/File file)/构造文件输入/输出流
调用(InputStream/OutputStream)里面的read()/write()/read(byte[] b)/write(byte[])
特殊:FileOutputStream(File f/String name,boolean appeand)/重写文件,还是在文件末尾重写(不覆盖原理内容)
FileReader/FileWriter(FileReader 的构造函数throws FileNotFoundException,FileWriter 的构造函数throwsIOException(因为当文件不存在时会自动创建一个文件))
FileReader/FileWriter(File f/String filename)/构造文件输入输出流
调用Reader/Writer里的read()/write()/read(char[] c)/write(char[] c)
8:处理流类型
处理类型 字符流 字节流
Buffering(缓冲流) BufferedReader/BufferedWriter BufferedInputStream/BufferedOutputStream
Filtering FilterReader/FilterWriter FilterInputStream/FilterOutputStream
Converting between (转换流) InputStreamReader 无
bytes and character OutputStreamWriter 无
Object Serialization 无 ObjectInputStream/ObjectOutputStream
Data conversion 无 DataInputStream/DataOutputStream
Counting LineNumberReader LineNumberInputStreeam
Peeking ahead PushbackReader PushbackInputStream
Printing PrintWriter PrintStream
9:缓冲流(BuffferReader/BufferedWriter/BufferedInputStream/BufferedOutputStream)
套在相应节点流上,对读写数据提供缓冲功能,提高读写效率,同时增加了些新方法
构造函数
BufferedReader(Reader in (int sz))/sz是自定义缓冲区大小
BufferedWriter(Writer out (int sz))/sz是自定义缓冲区大小
BufferedInputStream(InputStream in(int sz))/
BufferedOutputStream(OutputStream out(int sz))/
1.缓冲输入流支持父类的mark(int readAheadLimit)(标记一个位置,并重当前开始读)/reset()(回到标记位)
2.BufferedReader 提供readLine()读取一行字符串(以\r或\n分隔)
3.BufferWriter 提供了newLine用于写入一个行分隔符
4.对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush方法将会使内存的数据立刻写出
10:转换流(InputStreamReader/OutputStreamWriter)
1.用于字节数据到字符数据之间的转换
2.InputStreamReader 需要和InputStream套接
3.OutputStreamWriter需要和OutputStream套接
4.转换流构造时可指定其编码集合/InputStream isr = new InputStreamReader(System.in,"ISO8859_1");
当需要用BufferedReader读取一行字节输入流时(因为BufferedReader有一个好用的readLine()方法),可以先用InputStreamReader把字节数据转换成字符数据
在调用BufferedReader.(比如System.in字节输入流)
常用构造函数
InputStreamReader(InputStream in (String charsetName))/后面的参数是编码方式
OutputStreamWriter(OutputStream out,(String charsetName))/
特殊方法
getEncoding()/获得当前流的编码方式(两个类都有该方法)
read(char[] c(,int offset,int length))/转化了,所有参数可以是字符数组
write(char[] c/String s)/
11:数据流(DataInputStream/DataOutputStream)和内存数组字节流类型(ByteArrayInputStream/ByteArrayOutputStream)
1.分别继承InputStream/OutputStream,属于处理流,需要分别套接在InputStream/OutputStream类型的节点流上
2.提供了可以存取与机器类型无关的java原始数据类型(如int,double等)的方法
内存数组字节流类型构造函数:
new ByteOutputStream((int size))/在内存构造一个字节数组,大小为size,并存在一条管道指向它
new ByteInputStream(byte[] b(,int offset,int length))/构造指向b字节数组的输入管道
ByteInputStream特殊方法
int available()/可以读取多少个数组
ByteOutputStream特殊方法
size()/当前指向的字节数组大小
toByteArray()/得到当前指向的字节数组
String toString()/把当前指向的字节数组转换成字符串
数据流构造方法
new DataInputStream(InputStream in)/
new DataOutputStream(OutputStream out)/
DataInputStream特殊方法
boolean readBoolean()/读一个boolean型数据
Byte readByte()/读一个字节数据
...
char readChar()/
double readDouble()/
void readFully(byte[] b(int offset,int length))/
String readLine()/底层调用了InputStreamReader和BufferReader
readUTF()/
DataOutputStream
void write(boolean b)/
void write(double d)/
....
void writeChars(String s)/
void writeChar(int v)/将v两个低位字节写入
void writeUTF()/
注意:没writeChar(char c)
12:打印流(Print流)PrintWriter/PrintStream分别针对字符/字节(可以向窗口,文件等打印数据)
1.提供重载的print/println用于多种数据类型输出
2.这两个类的输出操作不会抛出异常(用户通过检测错误状态获取错误信息)
3.PrinteWriter/PrintStream 有自可以动flush()功能(用参数true)
构造函数
PrintWriter(Writer out/OutputStream out)/
PrintWriter(Writer out/OutputStream out,boolean autoFlush)/后一个参数决定是否自动flush
PrintStream(OutputStream)/
PrintStream(OutputSteam,boolean autoFlush)/
特殊方法:
除了常用的read/write外,还可以用print/println写入
13:Object流ObjectOutputStream/ObjectInputStream(当要将Object整个写入硬盘时,需要实现Serializable序列化(没什么作用,就是一个标记,意味着该类可以序列化))
1.直接将整个Object(转化成字节流)写入或读出
2.关键字transient(透明化)用该关键字修饰某成员变量时,写入整个Object时(该变量的值不会写入,使用默认值)
3.构造函数
new ObiectOutputStream/ObjectInputStream(/OutputStream/InputStream)
4.两个常用方法
Object readObject();
void writeObject();
还有很多readLong()...等方法
5:还有一个接口Externalizable重写可实现自己定义的Object序列化方法