JAVA流操作


前言

自己看资料写的,供自己学习记忆使用,流式操作


提示:下面案例仅供参考

字节流 abstract抽象类(InputStream/OutputStream)

一、字节输入输出节点流(FileInputStream)

最小的传输单位-字节,其中可扩充为字节数组加大传输速率
代码如下(示例):

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class test {
    public static void main(String[] args) throws Exception{
        File file = new File("C:\\Users\\断桥残雪\\IdeaProjects\\FirstProject01\\1.txt");
        File file2 = new File("C:\\Users\\断桥残雪\\IdeaProjects\\FirstProject01\\2.txt");
        //这里不删除没有任何问题,区别在于后面的创建的输出流fileOutputStream是否在源文件内容里追加或覆盖
        if(file2.exists()){
            System.out.println(file2.delete());
        }
        FileInputStream fileInputStream = new FileInputStream(file);
        // fileOutputStream如果文件不存在会自动创建一个空文件
        // 参数(file file,append:Boolean)
        // append:true 指的是是否在源文件内容基础上追加,false则将原文件内容清空后写入数据
        FileOutputStream fileOutputStream = new FileOutputStream(file2,false);
        // 字节输入输出流InputStream/OutputStream 读写最小以一个字节为单位
        int read = fileInputStream.read();  // 内部处理后-1 ~ 255,其中-1是指定的文件结束标志EOF(End Of File)方法看下图
        // 支持数组 参数(数组)或(数组,off,len)数据;起始偏移量;要写入的字节数
        byte[] arr =new byte[]{(byte)229,(byte)164,(byte)169};
        fileOutputStream.write(arr,0,3);
        while(read!=-1) {
            System.out.println(read);
            fileOutputStream.write(read);
            read = fileInputStream.read();
        }
        fileInputStream.close();
        fileOutputStream.close();
        System.out.println("done");
    }
}

read方法返回-1到255具体使用C实现的在这里插入图片描述

二、字符输入输出缓冲流

作用:减少内存IO访问磁盘的次数,提高效率
注意:使用缓冲流需要使用flush()清空缓冲区,清空后还可以继续使用,关闭流只需要关闭最外层流,会自动调用flush()方法
代码如下(示例)总感觉有瑕疵:

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception{
        File file = new File("C:\\Users\\断桥残雪\\IdeaProjects\\FirstProject01\\1.txt");
        File file2 = new File("C:\\Users\\断桥残雪\\IdeaProjects\\FirstProject01\\2.txt");
        if(file2.exists()){
            System.out.println(file2.delete());
        }
        FileInputStream fileInputStream = new FileInputStream(file);
        //参数 输入流,缓冲区大小(输入输出都默认8192)
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        FileOutputStream fileOutputStream = new FileOutputStream(file2,false);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        int read = bufferedInputStream.read();
        while(read!=-1) {
            System.out.println(read);
            bufferedOutputStream.write(read);
            read = bufferedInputStream.read();
        }
        bufferedInputStream.close();
        bufferedOutputStream.close();
        System.out.println("done");
    }
}

三、字节输入/输出数据流

作用:增强了八种基本数据类型和字符串的功能
注意:与上面不同,底部是直接抛出EOFException的
代码如下(示例):

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception{
        //File file = new File("C:\\Users\\断桥残雪\\IdeaProjects\\FirstProject01\\1.txt");
        File file2 = new File("C:\\Users\\断桥残雪\\IdeaProjects\\FirstProject01\\2.txt");
        //注意一定先写后读,数据流会将流内数据信息整合携带数据类型存入文件
        FileOutputStream fileOutputStream = new FileOutputStream(file2,false);
        DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);
        FileInputStream bufferedOutputStream = new FileInputStream(file2);
        DataInputStream dataInputStream = new DataInputStream(bufferedOutputStream);
        dataOutputStream.writeInt(34);
        dataOutputStream.writeBoolean(true);
        dataOutputStream.writeUTF("天下无双");
        dataOutputStream.flush();
        dataOutputStream.close();
        // 结果只有天下无双能正常看到
        // 读 结果34   true    天下无双  按顺序取的,取错报EOFException ,readBoolean读不到不报错返回false
        System.out.println(dataInputStream.readInt()+"   "+dataInputStream.readBoolean()+"    "+dataInputStream.readUTF());
        dataInputStream.close();
        System.out.println("done");
    }
}

四、字节输入/输出对象流

作用:封装了基本类型后对象也要来一次
注意:没对象的就不要看了,博主开始new 对象啦
代码如下(示例):
1.new 一个对象,主要注意要实现Serializable接口,这个接口就是一个标识接口,没有其他作用

import java.io.Serializable;

public class Person implements Serializable {
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

2.主代码

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception{
        File file2 = new File("C:\\Users\\断桥残雪\\IdeaProjects\\FirstProject01\\2.txt");
        //注意一定先写后读,数据流会将流内数据信息整合携带数据类型存入文件
        FileOutputStream fileOutputStream = new FileOutputStream(file2,false);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        FileInputStream fileInputStream = new FileInputStream(file2);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        Person person = new Person("小明",18);
        // 写 查看依旧是乱码
        objectOutputStream.writeObject(person);
        objectOutputStream.flush();
        objectOutputStream.close();
        // 读
        Person person2 = (Person) objectInputStream.readObject();
        objectInputStream.close();

        System.out.println(person2);
        System.out.println("done");
    }
}

字符流 abstract(Writer/Reader)

一、字符输出输入节点流FileWriter/FileReader自带缓冲流

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception{
        // 先读后写,因为读出来数据全是数字无意义展示
        File file = new File("C:\\Users\\断桥残雪\\IdeaProjects\\FirstProject01\\1.txt");
        File file2 = new File("C:\\Users\\断桥残雪\\IdeaProjects\\FirstProject01\\2.txt");
        FileWriter fileWriter = new FileWriter(file2,false);
        FileReader fileReader = new FileReader(file);
        int read = fileReader.read();
        while (read!=-1){
            fileWriter.write(read);
            read = fileReader.read();
        }
        fileReader.close();
        // 加一些其他的字符
        fileWriter.write("你好世界");
        // 换行,windows是这个
        fileWriter.write("\r\n");
        fileWriter.write("Hello,World");
        fileWriter.flush();
        fileWriter.close();
        System.out.println("done");
    }
}

二、字符输出输入缓冲流流BufferedWriter/BufferedReader

import java.io.*;

public class FileTest {
    public static void main(String[] args) throws Exception{
        // 先读后写,因为读出来数据全是数字无意义展示
        File file = new File("C:\\Users\\断桥残雪\\IdeaProjects\\FirstProject01\\1.txt");
        File file2 = new File("C:\\Users\\断桥残雪\\IdeaProjects\\FirstProject01\\2.txt");
        FileWriter fileWriter = new FileWriter(file2,false);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

        FileReader fileReader = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(fileReader);

        int read = bufferedReader.read();
        while (read!=-1){
            bufferedWriter.write(read);
            read = bufferedReader.read();
        }
        bufferedReader.close();
        // 加一些其他的字符
        bufferedWriter.write("你好世界");
        // 换行,windows是这个
        bufferedWriter.write("\r\n");
        bufferedWriter.write("Hello,World");
        bufferedWriter.flush();
        bufferedWriter.close();
        System.out.println("done");
    }
}

三、字符输入输出桥转换流InputStreamReader/OutputStreamWriter

import java.io.*;

public class FileTest {
    public static void main(String[] args) throws Exception {
        File file = new File("C:\\Users\\断桥残雪\\IdeaProjects\\FirstProject01\\1.txt");
        // 先创建一个文件输出流
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,"UTF-8");
        PrintWriter printWriter = new PrintWriter(outputStreamWriter);
        printWriter.print("妖亦有道,人却无情");
        printWriter.flush();
        printWriter.close();
    }
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了流的使用,有其他框架拥有自己封装的流可自行查阅。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值