2022-8-9 第一组 甘源册 学习笔记
知识点
字节流(理解) 字符流(理解) 序列化(理解) 属性类(理解)
1.IO流
- File类不能操作文件的内容
- 流的分类
- 按照流向分
- 输入流:从物理内存(硬盘)中读取数据到内存【读】
- 输出流:从内存写出数据到硬盘。【写】
- 一个文件在传输过程中经历了多次的拷贝——IO的性能很低
- 按照操作单元分
- 字节流:是一个字节一个字节的操作。【二进制操作】——操作任意类型的文件
- 字符流:是一个字符一个字符的操作。【1字符=2字节】——操作任意文本文件【.txt / .java / .c /.xml】
- 按照角色划分
- 节点流:直接操作一个特定的IO设备。
- 处理流:在节点流的基础上,做进一步的处理。
- 按照流向分
- 在Java中输入/输出常用的流:
字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 | |
---|---|---|---|---|
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
缓存流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
操作对象 | ObjectInputStream | ObjectOutputStream |
- 流的用法
- 输入流:往内存里读数据
- 输出流:
1.1字节流
-
字节输入流
-
File file = new File("c:\\a.txt"); InputStream stream = null; try { stream = new FileInputStream(file); Integer read; byte[] bytes = new byte[10]; // 创建一个FileInputStream对象 // 定义一个标记的点 // 循环读取,读到-1停止 // 关闭资源 /* * 一个流读完就没有了--当一个流读完之后默认调用mark和reset方法来进行记录和重置, * 这个流已经重置到了上次读完的位置 * 所以就无法再次读取内容---并不是关闭流. * */ while ((read = stream.read()) != -1) { }
-
-
字节输出流
-
构造器
- 传入参数true,则代表在原有的内容上追加,不覆盖
- 传入参数false:则代表覆盖原有的内容,不追加
-
public void test02() { OutputStream out = null; try { out = new FileOutputStream("c:/a.txt", true); out.write("".getBytes()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } }
-
-
如果目标文件不存在,会自动创建出来
1.2字符流
-
字符处理流——只能处理纯文本文件
-
访问文件
-
public void test04() { Reader reader = null; try { reader = new FileReader("c:/a.txt"); int len; char[] chars = new char[10]; while ((len = reader.read(chars)) != -1) { System.out.println(Arrays.toString(chars)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } }
-
-
缓存流
-
public void test05() { BufferedReader bufferedReader = null; BufferedWriter bufferedWriter = null; try { bufferedReader = new BufferedReader(new FileReader("c:/a.txt")); bufferedWriter = new BufferedWriter(new FileWriter("c:/b.txt")); String str; while ((str = bufferedReader.readLine()) != null) { bufferedWriter.write("我是死锁"); bufferedWriter.write(str+"\r\n"); } } catch (IOException e) { e.printStackTrace(); } finally { IOUtil.Ioclose(bufferedReader, bufferedWriter); } }
-
1.3序列化和反序列化——操作对象
-
序列化:将对象写入到IO流中【将内存模型的对象,变成字节数字】,可以进行存储和传输。
-
反序列化:从IO流中恢复对象,将存储在硬盘上的或者从网络上接受的数据恢复成对象模型
-
使用场景
- 所有在网络上,传输的对象都是必须是可序列化的,保存到硬盘上的对象也必须是可序列化的,否则会报错。
-
注意事项
- 反序列化必须拥有class文件,但随着项目的升级,class文件也会升级,序列化保证升级的兼容性,【Java序列化提供了一个版本号】
- 版本号可以自由指定,如果不指定,JVM会根据类信息自己计算一个版本号,所以无法匹配会报错。
- 不指定版本号,还有一个隐患,不利于JVM的移植,可能class文件没有改变,但是不同JVM的计算规则不同,导致无法反序列化。
- 如果只修改了方法,反序列化不受影响,无需修改版本号
- 如果是静态变量,和瞬态变量,反序列化也不受影响,无需修改版本号
-
总结
- 所有需要网络传输的对象都需要实现序列化接口
- 对象的类名,实例变量都会被序列化:方法,和类变量(static,transient)不会被序列化
- 如果想让某个变量不被序列化,可以用transient修饰
- 序列化对象的引用类型成员变量,也必须是可序列化的,否则会报错。
- 反序列化时,必须有序列化对象的class文件
- 如果一个对象被序列化多次,只有第一次序列化为二进制流,以后都只是保存序列化的版本号
- 建议所有可实例化的类加上版本号,方便项目升级。
2.属性类(Properties)
-
操作属性文件的类
-
public void test03() throws IOException { Properties properties = new Properties(); properties.load(new FileInputStream("db.properties")); String username = properties.getProperty("username"); System.out.println(username); // root System.out.println(properties.getProperty("password")); // 3306 }
本文作者:(≧∇≦)(≧∇≦)(≧∇≦)
本文链接:https://www.cnblogs.com/gycddd/p/16567206.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
2022 Java实训
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步