[会写代码的健身爱好者成长史]之java-io流

1.什么是流

流是内存与存储设备的一个传输数据的通道

如果按照流向划分

从存储设备到内存叫输入流,input

从内存到存储设备叫输出流,output

如果按照单位划分

字节流:以节点为单位,可以读写所有的数据

字符流:以字符为单位,可以读写文本数据

如果按照功能划分

节点流和过滤流:

FileInputStream读取本地文件数据

public static void main(String[] args) throws IOException {
        //创建一个FileInputStream,并指定一个要读取的文件路径
        FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Administrator\\Desktop\\aa.txt");
        byte[] bytes = new byte[1024];
        int count = 0;
        //当count=-1的时候说明已经读完了
        while ((count=fileInputStream.read(bytes))!=-1){
            //new String(bytes,0,count)
            //通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
            //参数: bytes:要解码为字符的 byte 
            //offset: 要解码的第一个 byte 的索引 
            //length: 要解码的 byte 数 的长度
            System.out.println(new String(bytes,0,count));
        }
        fileInputStream.close();
    }

FileOutputStream字节输出流

public static void main(String[] args) throws IOException {
        //创建一个FileOutputStream,并指定一个要读取的文件路径,如果当前路径没有此文件则会自动创建
        //如果有true则表示接着里面的文件内容写,如果不加true则表示会重置里面的内容,写入新的内容
        FileOutputStream fos = new FileOutputStream("D://bbb.txt",true);
        String write = "chinasoft";
        //获取write字符串对应的字节数组
        fos.write(write.getBytes());
        fos.close();
    }

实现文件复制

/**
 *实现文件复制
 */
public class IOTest {

    public static void main(String[] args) throws IOException {
        //创建输入和输出流
        FileInputStream fileInputStream = new FileInputStream("D://bbb.txt");
        FileOutputStream fileOutputStream = new FileOutputStream("D://ccc.txt");
        int count;
        byte[] bytes = new byte[1024];
        while ((count=fileInputStream.read(bytes))!=-1){
            //边读边写,将读到的文件内容,写到新的文件里面去
            fileOutputStream.write(bytes,0,count);
        }
        fileInputStream.close();
        fileOutputStream.close();
    }
}

字节缓冲流

首先会创建一个缓冲区,在读取数据的时候,如果缓冲区里面有,就没必要从硬盘中读取

可以提高io的效率,减少访问磁盘的次数

 1.BufferedInputStream缓冲字节输入流

public static void main(String[] args) throws IOException {
        //创建BufferedInputStream 字节缓冲输入流,内部有个缓冲区,可以提高io的效率,减少访问磁盘的次数
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D://ccc.txt"));
        int count =0;
        while ((count=bis.read())!=-1){
            System.out.print((char) count);
        }
    }

2.BufferedOutputStream缓冲字节输出流

public static void main(String[] args) throws IOException {
        //创建BufferedOutputStream 字节缓冲输入流,内部有个缓冲区,可以提高io的效率,减少访问磁盘的次数
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D://fff.txt", true));
        String write = "hello";
        //如果在没有关闭流或者没有刷新的时候,内容其实是写到BufferedOutputStream缓冲区里面的
        bos.write(write.getBytes());
        //当调用flush方法,内容才写入到对应的文件里面去
        bos.flush();
        //关闭流,close方法里面其实就已经调用了flush方法,所以bos.flush() 不加也行,但是可能会出现数据丢失的问题
        // 如果程序正在运行,往文件里写数据的时候,此时断电了,最起码已经flush的数据是可以写到文件里面
        bos.close();
    }

对象流

1.ObjectOutputStream

public static void main(String[] args) throws IOException {
        //创建一个对象流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D://www.txt"));
        //序列号写入操作,写入一个User对象,名字aaa,年纪18
        //序列化的User类,必须要实现Serializable接口
        oos.writeObject(new User("aaa",18));
        //关闭流,里面自动调用了flush方法
        oos.close();
    }

2.ObjectInputStream

public static void main(String[] args) throws IOException, ClassNotFoundException {
        //创建一个对象流
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D://www.txt"));
        //读取文件(反序列化),返回的Object,强转为User对象
        User o = (User) ois.readObject();
        //关闭流
        ois.close();
        System.out.println(o);
    }

 3.关于序列化和反序列化

1.序列化必须实现 Serializable 接口

2.序列化类里面的对象属性也要求要实现Serializable 接口

3.序列化的时候序列化的id,serialVersionUID,要求保证序列化和反序列化的类是同一个类

4.在属性前面加上 java关键字  transient,表明这个属性不可被序列化

5.静态属性不能被序列号

6.可以一次实现多个对象的序列化,借用集合即可 

字符流

1.FileReader

public static void main(String[] args) throws IOException, ClassNotFoundException {
        //创建一个字符流
        FileReader fileReader = new FileReader("D://bbb.txt");
        int count = 0;
        StringBuilder stringBuilder = new StringBuilder();
//        //一个字符一个字符的读
//        while ((count=fileReader.read())!=-1){
//             stringBuilder.append((char) count);
//        }
        char [] chars = new char[1024];
        while ((count = fileReader.read(chars))!=-1){
            String s = new String(chars, 0, count);
            stringBuilder.append(s);
        }
        fileReader.close();
        System.out.println(stringBuilder);
    }

2.FileWriter

public static void main(String[] args) throws IOException, ClassNotFoundException {
        //创建一个字符流
        FileWriter fileWriter = new FileWriter("D://bbb.txt",true);
        String write = "在电线杆上多嘴,你说这一句很有夏天的感觉";
        fileWriter.write(write);
        fileWriter.close();
    }

3.字符流复制文本文件 

public static void main(String[] args) throws IOException, ClassNotFoundException {
        //创建一个字符流,使用fileReader和fileWriter复制文本文件,不能复制图片或者二进制文件
        FileReader fileReader = new FileReader("D://bbb.txt");
        FileWriter fileWriter = new FileWriter("D://ccc.txt",true);
        int data=0;
        char [] chars = new char[1024];
        while ((data=fileReader.read(chars))!=-1){
            fileWriter.write(chars);
        }
        fileReader.close();
        fileWriter.close();
    }

字符缓冲流

1.BufferedReader 

public static void main(String[] args) throws IOException {
        //创建一个字符缓冲流
        BufferedReader bufferedReader = new BufferedReader(new FileReader("D://bbb.txt"));
        String line = "";
        //一行一行的读取
        while ((line=bufferedReader.readLine())!=null){
            System.out.println(line);
        }
        bufferedReader.close();
    }

2.BufferedWriter 

 public static void main(String[] args) throws IOException {
        //创建一个字符缓冲流
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("D://bbb.txt",true));
        //写入
        bufferedWriter.newLine();//写入一个换行符
        bufferedWriter.write("手中的铅笔在纸上来来回回");
        bufferedWriter.close();
    }

打印流

public static void main(String[] args) throws IOException {
        //创建一个打印流
        PrintWriter printWriter = new PrintWriter("D://print.txt");
        //打印,原样打印,写的是什么,打印的就是什么
        printWriter.println(97);
        printWriter.println(true);
        //关闭
        printWriter.close();
    }

转换流

1.InputStreamReader 

public static void main(String[] args) throws IOException {
        //创建一个转换流
        InputStreamReader isr  = new InputStreamReader(new FileInputStream("D://bbb.txt"),"utf-8");
        int count = 0;
        while ((count=isr.read())!=-1){
            System.out.print((char) count);
        }
        isr.close();
    }

2.OutputStreamWriter 

public static void main(String[] args) throws IOException {
        //创建一个打印流
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D://bbb.txt",true),"utf-8");
        String write = "--jay";
        osw.write(write);
        osw.close();
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值