简述
IO流指的就是内存到硬盘的路径,从硬盘到内存我们称为输入流,从内存到硬盘我们称为输出流。根据数据的类型我们还可以把IO流分为字节流和字符流,一个字符等于2个字节。
一个中文在GBK中占两个字节,在UTF-8中占三个字节,所以我们用字节的输入输出流读取/写入中文时,会有些困难
所以java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。
任意的文本编辑器,在打开文件的时候,都会查询编码表,将字节转化为字符表示
如果在0到127范围就会查询ASCII码表,如果是其他值就会查询系统默认编码表,UTF-8三个字节是一个中文,GBK两个字节是一个中文
windows系统的换行符是 ,linux系统的换行符是/n,mac是/r
字节输出流OutputStream
这是一个抽象类,表示所有字节输出流的超类。
输出流的本质就是在指定路径创建一个空的文件,然后对此空文件进行操作。
close() 关闭输出流
flush() 刷新此输出流
write(byte[] b)将b.length字节从指定的byte数组写入此输出流
常用子类FileOutputStream
简述
FileOutputStream是文件字节输出流,继承OutputStream,作用是把内存中的数据写入到硬盘的文件中。
构造方法:
FileOutputStream(File file) 创建一个向指定File对象表示的文件中写入数据的文件输出流
FileOutputStream(String name) 创建一个向指定文件名称表示的文件中写入数据的文件输出流
FileOutputStream(File file,boolean append) append表示是否追加数据
FileOutputStream(String name,boolean append) append表示是否追加数据
若使用下面两个构造函数,则创建对象时不会创建空文件,而是继续在末尾追加数据
字节输入流InputStream
read() 读取输入流数据的下一个字节,读取到文件的末尾就返回-1
read(byte[] b) 从输入流中读取一定量的字节,将其存储到缓冲区数组b中
close() 关闭资源
常用子类FileInputStream
简述
FileInputStream是文件字节输入流,继承InputStream,作用是把硬盘中的数据读入到内存中
构造方法
FileInputStream(File file)
FileInputStream(String name)
字符输入流Reader
Reader表示用于读取字符流的所有类的超类,可以读取字符信息到内存中
void close() 关闭此字符流
int read() 从输入流中读取一个字节
int read(char[] buf) 从输入流中读取一些字符,并将它们存储到字符串数组buf中
常用子类FileReader
简述
读取文件的字符输入流,该类继承InputStreamReader,InputStreamReader继承Reader
作用是把硬盘文件中的数据以字符的方式读入内存中
构造方法
FileReader(File file)
FileReader(String name)
字符输出流Writer
Writer是字符输出流的超类
close() 关闭此流
write(char[] cbuf) 写入字符数组
write(char[] cbuf,int off,int len) 写入字符数组的某一部分
write(int c) 写入单个字符
write(String str) 写入单个字符串
write(String str,int off ,int len) 写入字符串的某一部分
常用子类FileWriter
简述
输出文件的字符输出流,该类继承OutputStreamWriter,OutputStreamWriter继承Write
注意字符输出流的write是将数据写入内存的缓冲区中(字符转化为字节的过程)
需要调用flush或者关闭资源才会将数据从缓冲区刷到硬盘
作用是把内存中的数据以字符的方式输出到硬盘中
构造方法
FileWriter(File file)
FileWriter(String name)
FileWriter(File file,boolean append)
FileWriter(String name,boolean append)
流的异常处理
在jdk1.7之后,可以在try后增加一个小括号,在括号内可以定义流对象,那么这个流对象的作用域就在try中有效,try中的代码执行完毕时会自动地把流对象释放,这样做可以简化IO流的异常处理
try(FileInputStream fileInputStream = new FileInputStream("c:\1.jpg"); FileOutputStream fileOutputStream = new FileOutputStream("d:\1.jpg"); ){ byte[] bytes = new byte[1024]; int len = 0; while((len = fileInputStream.read(bytes))!=-1){ fileOutputStream.write(bytes,0,len);//写bytes的有效区间 } }catch (IOException e){ e.printStackTrace(); }