java基础day19

Day19
使用文件字节输入流和输出流==》乱码;因为两端的编码解码的方式不一样,(Windows系统==》GBK,IDEA==》UTF-8(万国码));使用转换流可以解决问题  
一、Reader:用于读取字符流的抽象类

1、常规的方法:

  • int read():读取单个字符,返回对应字符的ASCAII码或其他的整数;
  • int read(char[] cbuf):将字符读入数组;
  • int read(char[] cbuf, int off, int len):指定数组读取的范围;
二、InputStreamReader(转换流):Reader的直接子类

1、字节流通向字符流的桥梁,为了达到高效率,建议在BufferedReader内包装InputStreamReader
2、构造方法:public InputStreamReader(InputStream in,Charset cs):第一个参数是一个InputStream,第二个参数传递的是要设置的编码格式
3、常规方法:public int read();public int read(char[] cbuf,int offset,int length)
4、步骤:实例化对象–>调用读方法–>关闭资源

三、FileReader:InputStreamReader的直接子类,没有特有的方法,都是继承父类

1、FileReader是用来读取字符文件的便捷类,其构造方法也是调用super(new FileInputStream(file))

注意:FileReader用于读取字符流,需要读取原始字节流,建议使用FileInputStream  

2、构造方法:public FileReader(File file):参数是一个文件的名称;public FileReader(String fileName):文件的路径
3、常规方法:int read();public int read(char[] cbuf,int offset,int length)都是继承父类的方法

四、BufferedReader(缓冲流):自带缓冲区,是Reader的直接子类

1、使用好处:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取(速度快、效率高)
2、构造方法:public BufferedReader(Reader in):需要传递一个Reader对象
3、常规方法:public String readLine():读取一行数据,返回值是读取的是当前数据
4、步骤:实例化对象–>调用readLine()–>关闭资源

五、Writer:用于字符流写入的抽象类

1、常规方法:

  • close():关闭此流,但要先刷新它;
  • abstract void flush():刷新该流的缓冲区;
  • void write(char[] cbuf):写入字符数组;
  • abstract void write(char[] cbuf, int off, int len):写入字符数组的某一部分;
  • void write(int c):写入单个字符;
  • void write(String str):写入字符串;
  • void write(String str, int off, int len):写入字符串的指定的一部分;
六、 OutputStreamWriter(转换流):Writer的直接子类

1、字符流通向字节流的桥梁,为了达到高效率,建议在BufferedWriter内包装InputStreamWriter
2、构造方法:public OutputStreamWriter(OutputStream out,Charset cs)第一个参数是输出流对象,第二个是设置编码格式
3、常规方法:public void write(int c);public void write(char[] cbuf,int off,int len)

七、FileWriter:OutputStreamWriter的直接子类,没有特有的方法,都是继承父类

1、构造方法:FileWriter(File file);FileWriter(String fileName)
2、步骤:实例化对象–>调用其写入方法–>调用flush()方法–>关闭资源

八、BufferedWriter(缓冲流):自带缓冲区,是Writer的直接子类
1、构造方法:public BufferedWriter(Writer out)传递了一个Writer对象
2、特有的方法:public void newLine()等同于"\r\n"==>也就是换行

九、ObjectOutputStream、ObjectInutputStream(对象流)

1、ObjectOutputStream把对象写入到文件里(父类OutputStream)

序列化:把对象转换成字节序列==>才能保存在文件里  
  • 构造方法:public ObjectOutputStream(OutputStream out)需要传递OutputStream来构建一个文件地址或者文件
  • 写入的方法:public final void writeObject(Object obj)写一个对象
  • 步骤:实例化对象–>调用写入方法–>关闭资源
java.io.NotSerializableException当实例需要具有序列化接口时,抛出此异常(序列化异常)  
  • serialVersionUID:相当于对象序列化的唯一表示符, 如果在序列化的时候,不加这个标识符系统会给生成一个默认的标识符,只要修改类的信息就会生成一个新的表示符 ,所有产生了这个问题(序列号不对应)
解决方式:给其生成一个标识符UID  

2、ObjectInutputStream把文件中的对象读取出来(父类InputStream)

反序列化:把字节序列转换成对象==>方便读取(是对以前序列化的对象进行反序列,其他的不行)  
  • 构造方法:ObjectInputStream(InputStream in)
  • 读取的方法:public final Object readObject()
  • 步骤:实例化对象–>调用读取得方法–>关闭资源

3、对象流操作多个对象的方法(第一种)

package com.yxlim.day19;

import java.io.*;

/**
 * 第一种方法处理存取Object流
 * 加入一个空对象
 */
public class First {
    public static void main(String[] args)
            throws IOException, ClassNotFoundException {
        write1();
        read1();
    }
    //写入
    public static void write1() throws IOException{
        ObjectOutputStream oos=new ObjectOutputStream(
                new FileOutputStream("Actor.txt"));
        oos.writeObject(new Actor("xiao李"));
        oos.writeObject(new Actor("xiao林"));
        oos.writeObject(null);   //处理方法
        oos.flush();
        //关闭资源
        oos.close();
    }
    //读取
    public static void read1()
            throws IOException, ClassNotFoundException{
        ObjectInputStream ois=new ObjectInputStream(
                new FileInputStream("Actor.txt"));
        Object obj=null;
        //遍历Object
        while ((obj=ois.readObject())!=null) {
            System.out.println(obj);
        }
        //关闭资源
        ois.close();
    }
}

4、对象流操作多个对象的方法(第二种)

package com.yxlim.day19;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 第二种方法处理存取Object流
 * 使用集合存储
 */
public class Second {
    public static void main(String[] args)
            throws IOException, ClassNotFoundException {
        write2();
        read2();
    }
    //写入
    public static void write2() throws IOException{
        ObjectOutputStream oos=new ObjectOutputStream(
                new FileOutputStream("Actor.txt"));
        List<Actor> list=new ArrayList<>();   //处理方法
        list.add(new Actor("xiao李"));
        list.add(new Actor("xiao林"));
        oos.writeObject(list);
        oos.flush();
        //关闭资源
        oos.close();
    }
    //读取
    public static void read2()
            throws IOException, ClassNotFoundException{
        ObjectInputStream ois=new ObjectInputStream(
                new FileInputStream("Actor.txt"));
        List<Actor> list=(List<Actor>)ois.readObject();
        System.out.println(list);
        //关闭资源
        ois.close();
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值