20220809 第一组 于芮 IO流实践与应用(第二十八天)
IO流(输入输出流)
1.按照流向分
输入流:从磁盘上读取数据到内存(读)
输出流:从内存写出数据到硬盘上(写)
一个文件在传输过程中经历过多次拷贝,IO的性能本身就很低
2. 按照操作单元分
字节流:一个字节的操作(二进制操作),可以操作任意类型的文件
字符流:一个字符的操作(一个字符是两个字节),主要用来处理文本文件,例如.txt,.java,.py,.xml,.html,.js,性能高
3.按照角色划分
节点流:直接操作一个特定的IO设备
处理流:在节点流的基础上,做进一步的处理,
file类不能操作文件的内容
java中常用的流
字节输入流:inputstream->fileinputstream->bufferinputstream(缓冲流)->objectinputstream(操作对象)
字节输出流:outputstream->fileoutputstream->bufferoutputstream(缓冲流)->objectoutputstream(操作对象)
字符输入流:reader->filereader->bufferreader(缓冲流)
字符输出流:writer->filewriter->bufferwriter(缓冲流)
流的具体使用
输入流:往内存中读取数据
开始读文件册操作,read方法(),返回值int,当返回值是-1,说明文件读取到了末尾,读取文件是否结束的标记
字节输入流:
1.创建一个fileinputstream
2.定义一个标记用来控制输入流的读取
3.循环读取,如果读取到了-1,说明读取到了文件的末尾,循环结束
4.关闭资源.close(封装工具类)--重要
当一个流读完之后,默认调用Mark和reset方法来进行记录和重置,这个就已经重置到了上次读完的位置
所以就无法再次读取内容,并不是读完一次之后就关闭了流
字节输出流:
fileoutputstream构造器
boolean append,如果出入TRUE,则代表在原有基础上追加,不覆盖
如果传入false,或者不传,覆盖原有内容
写的操作,如果目标文件不存在,会自动创建
字符流:
字符处理流(用的最多)
缓冲流(处理流)
外层流,内层流:关闭了外层的流,内层的流会随之关闭。
序列化与反序列化(操作对象)
序列化:将对象写入到IO流中(将内存模型的对象变成字节数字),可以进行存储和运输
反序列化:从IO流中恢复对象,将存储在硬盘上或者从网络中接收的数据恢复成对象模型
使用场景:所有可在网络上传输的对象都必须是可序列化的,否则会报错,所有保存在硬盘上的对象也必须要可序列化的。
序列化版本号:反序列化必须有class文件,但随着项目的升级,class文件也会升级,序列化要保证升级前后的兼容性
版本号可以自由指定,但是不能不指定,如果不指定,JVM会根据类信息自己计算一个版本号,所以无法匹配,会报错
不指定版本号,不利于JVM的移植,可能class文件没有改,但是不同的JVM计算规则不同,导致无法序列化
如果只修改了方法,反序列化不受影响,无需修改版本号
如果修改了的静态变量static,瞬态变量transient,反序列化也不受影响,无需修改版本号
总结
1.所有需要网络传输的对象都需要实现序列化接口
2.对象的类名,实例变量都会被序列化,方法,类变量,transient变量不会被序列化
3.如果想让某个变量不被序列化。可以用transient修饰
4.序列化对象的引用类型成员变量,也必须是可序列化的,否者会报错
5.反序列化是必须有序列化对象的class文件
6.同一个对象被序列化多次,只有第一次序列化为二进制,以后都只是保存序列化的版本号
* 7.建议所有可序列化的类加上版本号,方便项目升级。
properties(读取属性文件)
今天的实例主要是一些操作文件的读取操作,利用几种方式完成输入输出的操作,接下来看一下代码吧!
1 package H0809; 2 3 import org.junit.Test; 4 5 import java.io.*; 6 import java.util.Objects; 7 8 public class Ch02 { 9 10 @Test 11 public void test1() { 12 InputStream inputStream = null; 13 try { 14 inputStream = new FileInputStream("f:/indel"); 15 int read; 16 byte[] buf = new byte[1024]; 17 while ((read = inputStream.read(buf)) != -1) { 18 System.out.println(new String(buf)); 19 } 20 } catch (FileNotFoundException e) { 21 throw new RuntimeException(e); 22 } catch (IOException e) { 23 throw new RuntimeException(e); 24 } finally { 25 //IOUtil.closeIO(inputStream,null); 26 /* try { 27 if(Objects.nonNull(inputStream)){ 28 //关闭流 29 inputStream.close(); 30 } 31 } catch (IOException e) { 32 throw new RuntimeException(e); 33 } 34 }*/ 35 } 36 } 37 @Test 38 public void test2(){ 39 InputStream inputStream=null; 40 try { 41 inputStream=new FileInputStream("f:/indeal"); 42 //开始读的操作,read方法,返回值是int,当返回值是-1时,说明文件读取到了末尾 43 //读取文件是否结束的标记 44 int read; 45 //循环读取 46 while((read=inputStream.read())!=-1){ 47 System.out.println(read+""); 48 } 49 System.out.println(); 50 System.out.println("读取完毕,再读一次。。"); 51 //循环读取 52 while ((read=inputStream.read())!=-1){ 53 System.out.println(read+""); 54 } 55 } catch (FileNotFoundException e) { 56 throw new RuntimeException(e); 57 } catch (IOException e) { 58 throw new RuntimeException(e); 59 }finally { 60 try { 61 //关闭流 62 inputStream.close(); 63 } catch (IOException e) { 64 throw new RuntimeException(e); 65 } 66 } 67 } 68 @ Test 69 public void test3(){ 70 OutputStream outputStream=null; 71 try { 72 outputStream= new FileOutputStream("f:/ideal"); 73 outputStream.write("\r\n".getBytes()); 74 outputStream.write("hahahahha".getBytes()); 75 System.out.println("写出成功"); 76 } catch (FileNotFoundException e) { 77 throw new RuntimeException(e); 78 } catch (IOException e) { 79 throw new RuntimeException(e); 80 }finally { 81 // IOUtil.closeIO(null,outputStream); 82 } 83 84 } 85 @Test 86 public void test03(){ 87 InputStream inputStream=null; 88 OutputStream outputStream=null; 89 try { 90 inputStream=new FileInputStream("f:/ideal"); 91 outputStream=new FileOutputStream("f:/ideal"); 92 byte[]buf=new byte[3]; 93 int len; 94 //循环读进来 95 while((len=inputStream.read(buf))!=-1){ 96 //写出去 97 outputStream.write(buf,0,len); 98 } 99 System.out.println("文件复制完毕"); 100 } catch (FileNotFoundException e) { 101 throw new RuntimeException(e); 102 } catch (IOException e) { 103 throw new RuntimeException(e); 104 }finally { 105 // IOUtil.closeIO(inputStream,outputStream) 106 try { 107 if(Objects.nonNull(outputStream)){ 108 outputStream.close(); 109 int i = 10/0; 110 } 111 } catch (Exception e) { 112 throw new RuntimeException(e); 113 } 114 try {
1 package H0809; 2 3 import java.io.*; 4 5 public class Copyfile { 6 public static void main(String[] args) throws IOException { 7 InputStream inputStream=new FileInputStream("f:/ideal"); 8 OutputStream outputStream=new FileOutputStream("f:/ideal"); 9 byte[]buf=new byte[3]; 10 int len; 11 while((len=inputStream.read(buf))!=-1){ 12 outputStream.write(buf,0,len); 13 } 14 System.out.println("文件复制完成"); 15 } 16 }
115 if(Objects.nonNull(inputStream)){ 116 inputStream.close(); 117 } 118 } catch (Exception e) { 119 throw new RuntimeException(e); 120 } 121 } 122 123 } 124 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】