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 中国大陆许可协议进行许可。

posted @   (≧∇≦)(≧∇≦)(≧∇≦)  阅读(52)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起