javase part21 IO流

在计算机中文件的分类

  • 二进制文件
  • 文本文件

在java中流的分类

  • 字节流:操作二进制文件
  • 字符流: 操作文本文件

流: stream 系列的都是字节流

  • InputStream 输入字节流的超类
  • OutPutStream 输出字节流的超类
  • FileInputStream 文件输入流,用于从文件中获得字节输入流
  • FileOutputStream 文件输出流
  • BufferedInputStream InputStream的子类,使用装饰者模式对FileInputStream进行装饰
  • BufferedOutputStream
  • DataInputStream:InputStream的子类,使用装饰者模式对输入输出流进行装饰,将变量输出到流
  • DataOutputStream: 将数据读出,按照顺序读出
图片.png

字节流使用


图片.png

使用FIleInput/OutputStream

//使用FileInput / OutputStream
//一个字节一个字节搞,太慢,可以使用BufferedInputStream提高速度
@SuppressWarnings("resource")
    public static void main(String[] args) {
        try {
            FileInputStream fileInputStream = new FileInputStream(new File("d:/img/1.mp4"));
            FileOutputStream fileOutputStream = new FileOutputStream(new File("d:/img/2.mp4"));
            int len = -1;
            while ((len = fileInputStream.read())!=-1) {
                fileOutputStream.write(len);
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
拷贝一个100M的视频所需时间(未使用缓存).png

使用BufferedInput/OutputStream ,这个类自带buff 为8K

@SuppressWarnings("resource")
    public static void main(String[] args) {
        try {
            BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("d:/img/1.mp4"));
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("d:/img/2.mp4"));
            int len = -1;
            while ((len=bufferedInputStream.read())!=-1) {
                bufferedOutputStream.write(len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
使用自带buff的流来拷贝.png

使用DataInput / OutStream
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。

DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(new File("d:/img/1.txt")));
        dataOutputStream.writeInt(132);
        dataOutputStream.writeDouble(0.01);
        dataOutputStream.writeUTF("这是一个字符串");

//读取刚才通过DataOutputStream 写入的数据
//要按照写入的顺序读取
DataInputStream dataInputStream = new DataInputStream(new FileInputStream(new File("d:/img/1.txt")));
        int readInt = dataInputStream.readInt();
        double readDouble = dataInputStream.readDouble();
        String readUTF = dataInputStream.readUTF();
        System.out.println(readInt);
        System.out.println(readDouble);
        System.out.println(readUTF);

使用ObjectInput / OutputStrem 之前,需要将要写入的对象的类序列化,不然会引发异常

图片.png

//将一个student对象写入

public class Student implements Serializable {
    
    private static final long serialVersionUID = 1L;
    private String name;
    private String address;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    
    public Student() {
        super();
    }
    public Student(String name, String address) {
        super();
        this.name = name;
        this.address = address;
    }
}

ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("d:/img/1.abc")));
objectOutputStream.writeObject(student);

//尝试将对象读出来
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("d:/img/1.abc")));
Student student2 = (Student) objectInputStream.readObject();
System.out.println(student2);

字符流使用
通过字符流可以很方便的将字符写入writer

图片.png

使用BufferedWriter/Reader
使用完Buffered后如果没有flush和close,数据将不会被写入进文件

//bufferWriter 若目标文件不存在,会自动创建文件
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("d:/img/2.abc"))));     
bufferedWriter.write("这个是一个字符串");
bufferedWriter.write("qweasd");
            
bufferedWriter.flush();
bufferedWriter.close();


//使用BufferedReader来将数据读出
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("d:/img/2.abc")));

String string = null;
StringBuilder stringBuilder = new StringBuilder();
            
while ((string = bufferedReader.readLine())!=null) {
        stringBuilder.append(string);
}

使用FileWriter/Reader
若文件不存在,将自动创建文件

FileWriter fileWriter = new FileWriter(new File("d:/img/2.txt"));
fileWriter.write("这是一个字符串");
fileWriter.write("\n");
fileWriter.write("这是一个字符串2哦");
            
fileWriter.flush();
fileWriter.close();

//读取数据
FileReader fileReader = new FileReader(new File("d:/img/2.txt"));
int len = -1;
StringBuilder stringBuilder = new StringBuilder();
char[] buff = new char[512];
while ((len = fileReader.read(buff)) != -1) {
    stringBuilder.append(buff, 0, len);
}
System.out.println(stringBuilder);

使用OutputStreamWriter/InputStreamReader
如果目标文件不存在,将会创建文件


图片.png
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("d:/img/3.txt"));
        outputStreamWriter.write("这是一个男字符串");
        outputStreamWriter.write("这是一个女字符串");

        outputStreamWriter.flush();
        outputStreamWriter.close();
        
      //读取数据
        InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("d:/img/3.txt"));
        int len = -1;
        char[] buff = new char[512];
        StringBuilder sBuilder = new StringBuilder();
        while ((len = inputStreamReader.read(buff))!=-1) {
            sBuilder.append(buff,0,len);
            
        }
        System.out.println(sBuilder);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、流的概念和作用。 流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总成或抽象。即数据在两设备之间的传输...
    布鲁斯不吐丝阅读 13,419评论 2 95
  • IO简单概述 IO解决问题 : 解决设备与设备之间的数据传输问题(硬盘 -> 内存 内存 -> 硬盘) 读和写文...
    奋斗的老王阅读 8,746评论 0 53
  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 8,027评论 3 10
  • 最好的时候莫过于, 我要上公交车, 你骑着自行车给我送来了充电器。 最好的关心莫过于, 在我难过流泪的时候, 你在...
    叶抽抽阅读 1,813评论 9 6
  • 七绝·题丹山春韵图(中华新韵) ——溪竹青岩入镜湖雄峙天,景非千里不得缘。坐...
    溪竹青阅读 4,312评论 8 6