一.概念
- I/O:I(Input输入)/O(output输出)流–数据从内存到存储设备之间的传输通道
二.流的分类
-
按照单位分类
字节流:以字节为单位进行数据传输,例:图片,视频,音频,文本... 字符流:以字符为单位进行数据传输,例:文本
-
按照方向分类
输入流:指从<存储设备>到<内存>的数据通道---上传 输出流:指从<内存>到<存储设备>的数据通道---下载
-
按照功能分类
节点流:实际传输数据的流---M416--发射子弹 过滤流:增强节点流功能的流---消音,硝烟,扩容弹夹,倍镜,垂直握把,三角握把,枪托,红点
-
使用:单位+方向+功能+流—字节输出节点流
三.字节流
-
字节输出流父类/字节输入流父类:OutputStream/InputStream
-
字节输出流父类–方法(写)
write(int b):将字节b写入输出流 write(byte[] bs):将字节数组写入输出流 write(byte[] bs,int pos,int len):将字节数组从下标pos开始的len个字节写入输出流
-
字节输入流父类–方法(读)
read():一次读入一个字节 read(byte[] bs):一次读入一个字节数组 read(byte[] bs,int pos,int len):一次读入数组中从pos下标开始的len个字节
-
-
字节输出节点流/字节输入节点流:FileOutputStream/FileInputStream
-
字节输出节点流:FileOutputStream
FileOutputStream(String name):向指定文件name文件传输数据 //写出数据覆盖原有数据 FileOutputStream fos=new FileOutputStream("files/a.txt",true); //在文件尾部添加数据 注: //相对路径:相对于项目文件在的位置-项目下的路径 //绝对路径:相对电脑来说文件的位置-盘符:/文件夹/.../文件(不建议使用) //文件夹和文件之间可以用:/ 或者 \\ //如果参数为文件,文件存在直接使用,文件不存在自动创建 //如果参数为文件路径(文件夹/.../文件),如果文件夹不存在报错
-
字节输入节点流:FileInputStream
FileInputStream(String name):从指定文件name中读取数据
-
read():一次读入一个字节
while(true) { int i = fis.read(); if(i==-1)break;//读取到文件尾部返回-1 //通过i操作文件数据 }
-
read(byte[] bs):一次读入一个字节数组
while(true) { int i=fis.read(bs);//读取到的有效字节个数 if(i==-1)break;//读取到文件尾部返回-1 for(int j=0;j<i;j++) { //通过bs[j]操作文件数据 } }
-
read(byte[] bs,int pos,int len):一次读入数组中从pos下标开始的len个字节
while(true) { int i = fis.read(bs,1,4);//读取到的有效字节个数 if(i==-1)break;//读取到文件尾部返回-1 for(int j=1;j<i+1;j++) { //通过bs[j]操作文件数据 } }
-
-
-
字节输出缓冲流/字节输入缓冲流:BufferedOutputStream/BufferedInputStream
-
字节输出缓冲流:BufferedOutputStream
new BufferedOutputStream(OutputStream os):创建字节输出缓冲区增强参数节点流的功能 //flush():将缓冲区中的数据放到存储设备中,清空缓冲区,刷新缓冲区 //close():关闭流,任何流使用完都需要进行关闭,关闭流之前 自动清空缓冲区
-
字节输入缓冲流:BufferedInputStream
new BufferedInputStream(InputStream is):创建字节输入缓冲流增加参数字节输入节点流的功能 //循环读取: while(true) { int i = bis.read(); if(i==-1)break; //通过i操作文件数据 }
-
作用:减少访问磁盘的次数,提高IO的读写效率
-
-
字节输出对象流/字节输入对象流:ObjectOutputStream/ObjectIputStream
-
作用:
读写基本类型的数据 writeDouble()/ReadDouble() 读写String数据 writeUTF()/readUTF() 读写对象 writeObject()/readObject() 增强缓冲区功能
-
对象序列化:
-
把对象在流上进行传输过程称为对象序列化
-
要求:
必须实现java.io.Serializable接口(标识性接口--空接口) transient可以修饰属性,属性值不再对象序列化(不在流上传输) 所有属性都必须实现对象序列化 输出对象是一个容器,容器内所有元素都必须实现对象序列化
-
循环读取:
while(true){ try{ Object o=ois.readObject(); //通过o获取所有对象 }catch(EOFException e){ break; } }
-
-
四.流的标准异常处理
-
JDK1.7处理方式
FileOutputStream fos=null; try { fos = new FileOutputStream("files/f.txt"); fos.write(65); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if(fos!=null)fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
-
JDK1.7之后自动关流
try(FileOutputStream fos = new FileOutputStream("files/f.txt");) { fos.write(65); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
五.编码格式
-
字符集
GBK:简体中文 GB2312:简体中文 GB18030:简体中文(最新) UTF-8:万国码 ISO-8859-1:西欧 BIG5:繁体中文
-
编解码
编码:将文字转为二进制码的过程 解码:将二进制转为文字的过程
-
乱码:
编码格式(使用字符集)和解码格式不一致
六.字符流
-
字符输出流/字符输入流:Writer/Reader
-
字符输出流:Writer
write(int c):写出一个字符 write(char[] cs):写出一个字符数组 write(char[] cs,int off,int len):写出字符数组从下标off开始的len个字符 write(String s):写出一个字符串 write(String s,int off,int len):写出字符串中从下标off开始的len个字符
-
字符输入流:Reader
read():读入一个字符 read(char[] cs):读入一个字符数组 read(char,int off,int len):读入字符数组的一部分
-
-
字符输出节点流/字符输入节点流:FileWriter/FileReader
-
字符输出节点流:FileWriter
自带缓存区
-
字符输入节点流:FileReader
while(true) { int i = fr.read(); if(i==-1)break;//读取到文件尾部取-1 //通过i获取文件内容 }
-
-
字符输出缓冲流/字符输入缓冲流:BufferedWriter/BufferedReader
-
字符输出缓冲流:BufferedWriter
newLine():输出一个换行符
-
字符输入缓冲流:BufferedReader
readLine():读入一行文本
while(true) { String s = br.readLine(); if(s==null)break;//读取到文件尾部取值null //通过s获取文件数据 }
-
-
字符输出缓冲流:PrintWriter
- 作用:
-
print():输出数据不换行
-
println():输出数据并换行
-
PrintWriter 既可以作为过滤流,又可以作为节点流
PrintWriter(Writer w) printWriter(String fileName)
-
- 作用:
-
字符输出桥转换流/字符输入桥转换流:OutputStreamWriter/InputStreamReader
-
使用步骤:
//创建字节输入输出的节点流 //创建字符输入输出的桥转换流 //创建字符输入输出的缓冲流
-
作用:
将字节流转为字符流 设置输入输出的编码格式
-
七.File类
-
概念:
IO:操作文件内容,读写数据 File:操作文件本身
-
位置:java.io包
-
常用方法:
createNewFile():创建文件 mkdirs():创建文件夹和子文件夹 getAbsolutePath():返回文件的绝对路径 getName():返回文件名 list():显示当前文件夹下的文件和文件夹名 exists():判断文件是否存在 ...
看完如果对你有帮助,感谢点赞支持!