第二十三课:文件输入和输出(二)

第二十三课:文件输入和输出(二)
一、使用字符流来读写文本文件
1.字符流:可以处理能用Notepad++打开不乱码的文件
⑴字符输入流:Reader -> InputStreamReader -> FileReader
①构造:
•FileReader(File file);
•FileReader(String path);
•InputStreamReader(InputStream is);
•InputStreamReader(InputStream is,String charsetName); 可以指定字符集(字符
编码)名称
②关于字符编码/字符集的补充:
•举例:当你用Notepad++存储一段内容时,到底在干什么?
•当你输入了内容之后,它默认会以UTF-8进行解码,然后再通过UTF-8进行编码
用于显示给你
•解码和编码字符集必须保持一致,否则会出现乱码
③常用方法:
int read(char[] cha); 读取字符数均 将 数据读取到字符数组中 返回字符数
⑵字符输出流:Writer -> OutputStreamWriter -> FileWriter
①构造:
•FileWriter(File file);
•FileWriter(String path);
•OutputStreamWriter(OutputStream os);
•OutputStreamWriter(OutputStream os,String chasetName); 可以将字节流转换为
字符流
②常用方法:
•write(String str);
•writer(String str,int offset,int length);
•write(char[] cha,int offset,int length);
2.字节流:
⑴字节输入流:InputStream -> FileInputStream
⑵字节输出流:OutputStream -> FileoutputStream

二、会使用二进制流读写二进制文件(了解)

三、会使用高校缓冲流读写文本文件
1.高效缓冲字符流
⑴输入流:
①构造:
BufferedReader(Reader reader);
②常用方法:
String readLine(); 读取一行
⑵输出流:BufferedWriter
①构造:
BufferedWriter(Writer writer);
②常用方法:
•同字符输出流方法
•因为有缓冲区,所以如果需要立即将将内容输出到文本,需要调用 flush() 方法刷
新缓冲区
•关流也会刷新缓冲区

四、使用对象流实现序列化和反序列化
•serializable
•一个合格的JavaBean类应该有以下组成:
⑴属性私有化
⑵提供公共的getter/setter方法
⑶提供无参构造
⑷实现序列化接口
•当Java在进行对象的序列化(对象一定实现过序列化接口)时,它会自动生成一个序
列化版本ID(serialVersionUID),同理,在读取对象时(反序列化)时,Java还会再生
成一个序列化版本ID

java.io.InvalidClassException: cn.kgc.demo4.user; local class incompatible: stream
classdesc serialVersionUID = -5990646266163102806,local class serialVersionUID =
13392451066535050577
at java.io.ObjectStreamClass.initNonProxy(objectStreamClass.java:687)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1883)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1749)
at java.io.ObjectInputStream.reasOrdinaryObject(ObjectInputStream.java:2040)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1571)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
at cn.kgc.demo4.Demo2.main(Demo2.java:19)

./**

  • 输出对象 序列化:将内存中的Java对象以指定的二进制序列写入特定的流(二进制序列)
  • @author Raymond
  • 2019年3月3日 下午7:16
    */
    public class Demo1{
    public static void main(String[] args){
    try(OutputStream os = new FileOutputStream(“d:/object.txt”);
    ObjectOutputStream oos = new ObjectOutputStream(os)?{
    User user = new User();
    user.setName(“王明轩”);
    user.setAge(12);
    // 序列化
    oss.writeObject(user);
    } catch(Exception e){
    e.printStackTrace();
    }
    }
    }

/**

  • 读取对象:反序列化:将特定流中的数据重构为Java对象

  • @author Raymond

  • 2019年3月3日 下午7:28
    */
    public class Demo2{
    public static void main(String[] args){
    try(File InputStream fis = new FileInputStream(“d:/object.txt”);
    objectInputStream ois = new ObjectInputStream(fis)){

         // 反序列化
         User user = (User) ois.readObject();
         System.out.println(user);
     }catch(Exception e){
         e.printStackTrace();
     }
    

    }
    }

/**

  • 用户实体

  • @author Raymond

  • 2019年3月3日 下午8:45
    */
    public class User implements Serializable{

    /**

    • 序列化ID
      */
      private static final long serialVersionUID = 1L;

    private String name;
    private int age;

    publicn User(){}
    // 省略getter/setter
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值