Java IO 继承关系图
IO流常用基类:
(1)字节流
输出字节流:OutputStream:字节写入流抽象类
|--->FileOutputStream:
字节写入流
|--->BufferedOutputStream:
字节写入流缓冲区
输入字节流:InputStream:字节读取流抽象类
|--->FileInputStream:
字节读取流
|--->BufferedInputStream:
字节读取流缓冲区
(2)字符流
输出字符流:Writer:字符写入流的抽象
|--->FileWriter:
字符写入流
|--->BufferedWriter:
字符写入流缓冲区
|--->OutputStreamWriter:
字符通向字节的转换流(涉及键盘录入时用)
输入字符流:Reader: 字符读取流的抽象类
|--->FileReader:
字符读取流
|--->BufferedReader:
字符读取流缓冲区
|--->InputStreamReader:
字节通向字符的转换流(涉及键盘录入时用)
InputStreamReader
常用的构造方法:
public InputStreamReader(InputStream in)
public InputStreamReader(InputStream in, String charsetName) 创建一个InputStreamReader,使用给定的名字的编码
重要的属性:
private final StreamDecoder sd; 表示一个解码器,说明读取的数据会被转成指定的编码,若没有指定,那么将使用平台默认的编码。
重要的方法:
int read(); 读取单个字符。
int read(char[] cbuf) 从流中的0位置读取,读取cbuf长度的字符。
int read(char[] cbuf, int offset, int length) offset表示从流中哪个位置开始储存字符,length表示最大的存储个数。
public static void main(String[] args) throws IOException { InputStreamReader isr = new InputStreamReader(new FileInputStream("C:\Users\Desktop\1.txt"),"gbk"); char[] cbuf = new char[10]; int len = 0; while((len = isr.read(cbuf))>0){ System.out.print(new String(cbuf,0,len)); } isr.close(); }
OutputStreamWriter
常用的构造方法:
public OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter。
public OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。
重要的属性:
private final StreamEncoder se; 表示一个编码器,将内存中的字符流根据指定的编码表编码成为字节储存。
重要方法:
void write(char[] cbuf,int off,int len) 写入字符数组的某一部分
void write(int c) 写入单个字符
void write(String str,int off,int len) 写入字符串的某一部分
void flash() 刷新该流的缓存
public static void main(String[] args) throws IOException { OutputStream os = new FileOutputStream("C:\Users\Desktop\1.txt"); OutputStreamWriter osw = new OutputStreamWriter(os); String str = "你好吗? 我很好!"; osw.write(str); osw.close(); }
FileInputStream
常用的构造函数:
FileInputStream(File file) 创建“File对象”对应的“文件输入流”
FileInputStream(FileDescriptor fd) 创建“文件描述符”对应的“文件输入流”
FileInputStream(String path) 创建“文件(路径为path)”对应的“文件输入流”
重要方法:
int available() 返回“剩余的可读取的字节数”或者“skip的字节数”
void close() 关闭“文件输入流”
FileChannel getChannel() 返回FileChannel
final FileDescriptor getFD()返回文件描述符 int read() 返回文件输入流的下一个字节
int read(byte[] buffer, int off, int len) 读取“文件输入流”的数据并存在到buffer,从off开始存储,存储长度是len。
long skip(long n) 跳过n个字节
int read(); 读取单个字节。
int read(byte[] b)从流中的0位置读取,读取b长度的字节。
int read(byte[] b, int offset, int length) offset表示从流中哪个位置开始储存字节,length表示最大的存储个数。
FileOutputStream
常用的构造方法:
FileOutputStream(File file) 创建“File对象”对应的“文件输入流”;默认“追加模式”是false,即“写到输出的流内容”不是以追加的方式添加到文件中。
FileOutputStream(File file, boolean append) 建“File对象”对应的“文件输入流”;指定“追加模式”。
FileOutputStream(FileDescriptor fd) 创建“文件描述符”对应的“文件输入流”;默认“追加模式”是false,即“写到输出的流内容”不是以追加的方式添加到文件中。
FileOutputStream(String path) 创建“文件(路径为path)”对应的“文件输入流”;默认“追加模式”是false,即“写到输出的流内容”不是以追加的方式添加到文件中。
FileOutputStream(String path, boolean append) 创建“文件(路径为path)”对应的“文件输入流”;指定“追加模式”。
重要方法:
FileChannel getChannel() 返回FileChannel
final FileDescriptor getFD() 返回文件描述符
void write(byte[] buffer, int off, int len) 将buffer写入到“文件输出流”中,从buffer的off开始写,写入长度是len。
void write(int n) 写入字节n到“文件输出流”中
void write(byte[] b) 将b.length个字节从指定的数组写入到此输出流中
FileReader
是InputStreamReader的子类,内部一共三个方法:
public FileReader(String fileName) throws FileNotFoundException { super(new FileInputStream(fileName)); } public FileReader(File file) throws FileNotFoundException { super(new FileInputStream(file)); } public FileReader(FileDescriptor fd) { super(new FileInputStream(fd)); }
都是通过其父类实现的,全部都是调用了父类(InputStreamReader)的方法。不能为其指定编码格式,使用平台默认的编码格式读取字符,在不要求转码的情况下,这是一个简便的写法,用于从文件中读取字符。
BufferedReader
常用的构造方法:
BufferReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferReader(Reader in,int sz)创建一个使用指定大小的输入缓冲区的缓冲字符输入流。
重要方法:
String readLine()读取一个文本行,到达文件结尾返回null
int read() 读取单个字符,到达文件结尾返回-1
int read(char[] cbuf,int off,int len)将字符读入数组的某一部分
boolean ready() 判断该流是否已经准备好被读取
void reset()将流重置到最新的标记
void mark(int readAheadLimit)标记流中的当前位置
long skip(Long n)跳过n个字符
BufferedWriter
常用构造方法:
BufferedWriter bf = new BufferedWriter(Writer out ); 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
重要方法:
void newLine() 写入一个行分隔符。
void write (int c)写入单个字符
void write(char[] cbuf,int off,int len) 写入字符数组的某一部分
void write (String s,int off,int len)写入字符串的某一部分
void close()关闭此流,但是先刷新它
实现文件的复制:
public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("C:\Users\Desktop\1.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("C:\Users\Desktop\2.txt")); String str; while((str = br.readLine())!=null){ bw.write(str); bw.newLine(); } br.close(); bw.close(); }
通过getEncoding()方法可以返回编码方式,默认是平台(eclipse)编码,txt文件是GBK编码,复制的文本会出现乱码,因为读取的时候是根据UTF-8读,写的时候是根据UTF-8写,这时候就不能使用FileReader的方式,要使用
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\Users\Desktop\1.txt"),"gbk"));
这里的缓冲区不是减少IO操作次数,而是减少编码转换器的操作次数。这要和BufferInputStream、BufferOutputStream区别开来。
BufferInputStream
常用构造函数:
public BufferedInputStream(InputStream in); 创建一个内部缓冲区数组并将其存储在 buf 中,该buf的大小默认为8192。
BufferedInputStream(InputStream in,int size); 指定内部缓冲区的大小
重要属性:
private static int defaultBufferSize = 8192;//内置缓存字节数组的大小 8KB protected volatile byte buf[]; //内置缓存字节数组 protected int count; //当前buf中的字节总数、注意不是底层字节输入流的源中字节总数 protected int pos; //当前buf中下一个被读取的字节下标 protected int markpos = -1; //最后一次调用mark(int readLimit)方法记录的buf中下一个被读取的字节的位置 protected int marklimit; //调用mark后、在后续调用reset()方法失败之前云寻的从in中读取的最大数据量、用于限制被标记后buffer的最大值
重要方法:
int available(); //返回底层流对应的源中有效可供读取的字节数 void close(); //关闭此流、释放与此流有关的所有资源 boolean markSupport(); //查看此流是否支持mark void mark(int readLimit); //标记当前buf中读取下一个字节的下标 int read(); //读取buf中下一个字节 int read(byte[] b, int off, int len); //读取buf中下一个字节 void reset(); //重置最后一次调用mark标记的buf中的位子 long skip(long n); //跳过n个字节、 不仅仅是buf中的有效字节、也包括in的源中的字节
该类主要是提供给InputStream的没有缓冲功能的子类来使用的,经常看见有人把其和FileInputStram来一起使用,FileInputStram本身具有缓存,速度更快,直接调用底层 readBytes(byte b[], int off, int len)。