java----IO流

《基本介绍》

 《常见操作》

《创建文件的方法》

 

 

 《获取文件信息》

 《目录操作与文件的删除》

在Java编程中,目录是被当成特殊的文件来处理的

所以其可以用File类中的全部方法

 《流》

字节流输入,输出更慢,但可以保证更加无损,处理二进制文件更好

字节流包括:

  字节输入流,其顶级父类是InputStream

  字节输出流,其顶级父类是OutputStream

字符流同理

《InputStream字节输入流常用子类》

 

 《FileInputStream》

这个类中的方法:

《read()》

 

 

 

 注意:

  这种方法千万不能用来读入汉字。在Java中,汉字站3个字节,而这里的方法是一个字节一个字节读入,读汉字会出现乱码

《read(byte[] b)》

上述方法有点慢,一般可以用下面这个方法来优化读入速度:

 

 

 

 结果:

 

 《关于byte与char

既然上面提到了这个就回忆一下:

  byte是整数类型,占1个字节,可以保存-128~127之间的整数

  char是字符类型,占2个字节,char 本质上保存的还是整数,然后将对于整数的ASCII的字母输出

  一个字节有8位(8bit)

 《OutputStream字节输出流》

《FileOutputStream》

 

 

 

《写入时不覆盖的方法》

write()方法默认会将原先的内容全部清空,为了达到只是追加的效果,在使用FileOutputStream构造器时,如下:

《文件拷贝》

 

 《FileReader》

用这种方式去读不会出现中文乱码,因为其会根据编码的模式,读一个字符时,用3个字节还是2个字节

 

 《FileWriter》

 

 《处理流》

 

 节点流:

  其对特定的数据源进行操作,但是这样的话功能比较单一,效率比较慢

但是对于处理流,如:

 

 

 

 设计模式思想:

处理流在关闭流的时候只要关闭外层流,内部的节点流会自动关闭

 

 

 

《BufferedReader》

 尽量用BufferedReader读取文本文件,如果读取二进制文件可能会有损失

《常用方法》

《public String readLine()》

 

 

 

 

 《BufferedWriter》

 

 

 

 《处理字节的处理流BufferedInputStream》

 

《处理字节的处理流BufferedOutputStream》

 

 

 

 

 

 《使用字节处理处理流拷贝图片》

《处理流中的对象流》

    InputStream: 文件->程序                   Output: 程序->文件

 《序列化:ObjectOutputStream》

 

最后记得关闭流:oos.close();

《反序列化ObjectInputStream》

 最后记得关闭流:ois.close();

 《对象处理流细节》

 

 对于第三点的说明:

  

 

 

   当添加了序列化的版本号后,我们在往Dog类中加新属性后就会认为是类的升级版,而不是一个新的类

对于第四点要注意

对于第五点的解释:

 《后序学习对这里手动序列化的补充》

手动序列化的使用场景:比如我的密码不可能在不加密的情况下直接序列化,我想要我的密码在序列化的时候自动加密该如何作?

这个时候就要使用序列化的另一个接口了:Externalizable,其中有两个方法要我们实现

1.public void writeExternal(ObjectOutput out);

这个方法是通过out.write(xxx),来将要序列化的变量写进流中

2.public void readExternal (ObjectInput in);

 这个方法是将我们写进流中的变量再读取出来

  1 package com.cilinmengye.IO;
  2 
  3 import java.io.*;
  4 
  5 class User implements Externalizable {
  6     private String name, password;
  7     private A a;
  8     private int age;
  9     private boolean vip;
 10 
 11     public User() {
 12         ;
 13     }
 14 
 15     public User(String name, String password, A a, int age, boolean vip) {
 16         this.name = name;
 17         this.password = password;
 18         this.a = a;
 19         this.age = age;
 20         this.vip = vip;
 21     }
 22 
 23     public void writeExternal(ObjectOutput out) throws IOException {
 24         out.writeObject(name);
 25         out.writeObject(password);
 26         out.writeObject(a);
 27         out.writeInt(age);
 28         out.writeBoolean(vip);
 29     }
 30 
 31     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
 32         name = (String) in.readObject();
 33         password = (String) in.readObject();
 34         a = (A) in.readObject();
 35         age = in.readInt();
 36         vip = in.readBoolean();
 37     }
 38 
 39     @Override
 40     public String toString() {
 41         return "User{" +
 42                 ", name='" + name + '\'' +
 43                 ", password='" + password + '\'' +
 44                 ", a=" + a +
 45                 ", age=" + age +
 46                 ", vip=" + vip +
 47                 '}';
 48     }
 49 }
 50 
 51 class A implements Serializable {
 52     private String name;
 53     private B a;
 54 
 55     public A(String name, B a) {
 56         this.name = name;
 57         this.a = a;
 58     }
 59 
 60     @Override
 61     public String toString() {
 62         return "A{" +
 63                 "name='" + name + '\'' +
 64                 ", a=" + a +
 65                 '}';
 66     }
 67 }
 68 
 69 class B implements Serializable {
 70     private int x;
 71 
 72     public B(int x) {
 73         this.x = x;
 74     }
 75 
 76     @Override
 77     public String toString() {
 78         return "B{" +
 79                 "x=" + x +
 80                 '}';
 81     }
 82 }
 83 
 84 
 85 public class ObjectStream {
 86     public static void main(String[] args) {
 87         B b = new B(1);
 88         A a = new A("11", b);
 89         User user = new User("22", "33333", a, 10, true);
 90         System.out.println("写入文件之前");
 91         System.out.println(user);
 92         try (
 93                 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("com/cilinmengye/IO/a.txt"));
 94                 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("com/cilinmengye/IO/a.txt"));
 95 
 96         ) {
 97             out.writeObject(user);
 98             user = (User) ois.readObject();
 99         } catch (IOException | ClassNotFoundException e) {
100             e.printStackTrace();
101         }
102         System.out.println("写入文件之后");
103         System.out.println(user);
104     }
105 }

 

 《标准输入输出流》

《标准输入流》

《标准输出流》

 

 《转换流》

 

 《InputStreamReader》

《OutputStreamWriter》

 

《使用演示》

 

 《打印流》

《PrintStream:字节打印流》

 

 《PrintWriter:字符打印流》

 

 《Properties》

注意:这个类本身是一个集合类(HashTable)

 

 

 

posted @ 2022-08-04 17:18  次林梦叶  阅读(28)  评论(0)    收藏  举报