【归纳总结】IO流总结——字节流

在文本文件中,写入文本数据分为三步:搭桥、运输、拆桥

①搭桥
搭建好数据传输通道——流对象
创建FileOutputStream对象
构造方法:
Ⅰ FileOutputStream(File file) //用File对象创建
Ⅱ FileOutputStream(String name) //用路径名创建

②运输
对于输出流而言,利用写操作,让数据在传输通道中,流动起来
Ⅰ public void write(int b)
Ⅱ public void write(byte[] b)
Ⅲ public void write(byte[] b,int off,int len)

③拆桥
关闭流
public void close()

例:通过OutputStream对象,完成向文本文件中输出” hello world”

public static void outPutStream() throws IOException {
        File file = new File("d:\test\a.txt");
        if(!file.exists()){
            file.createNewFile();
        }
        //搭桥
        OutputStream os = new FileOutputStream(file);
        
        //运输
        String s = "hello world";
        byte[] bytes = s.getBytes();
        os.write(bytes);

        //拆桥
        os.close();
    }

字节输出流常见问题:
①创建字节输出流jvm到底做了哪些事情?

  1. FileOutputStream对象在被创建之前,jvm会首先到操作系统中,找目标文件
    如果找到,首先,清空已经存在的目标文件内容(因为默认向文件中写入数据中的方式,从文件头开始写入)
    如果找不到,jvm会创建一个新的目标文件
  2. 在jvm内存中,创建FileOutputStream对象
  3. 在FileOutputStream对象和目标文件之间,建立数据传输通道

②数据写成功后,为什么要close()?

  1. 关闭此输出流,即断开数据传输通道
  2. 释放与此流有关的所有系统资源。

③如何向文件中写入换行字符

  1. windows操作系统: ‘\r’’\n’
  2. 类unix操作系统:’\n’

④如何实现数据的追加写入?

  1. FileOutputStream(File file, boolean append)
  2. FileOutputStream(String name, true)

字节输入流
与字节输出流类似,从文件中读取数据也需要搭桥、运输、拆桥。有两种常用的方式:
①按单个字节

import java.io.FileInputStream;
import java.io.IOException;

public class HomeWork01 {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("d:\\test\\a.txt");

        //按单个字节读取
        //read()方法返回的是0 到 255 范围内(8位无符号整数)的 int 字节值。
        //没有则返回-1
        int read;
        while ((read = in.read()) != -1){
            char c = (char)read;
            System.out.print(c);
        }

        in.close();
    }
}

②按多个字节读取

import java.io.FileInputStream;
import java.io.IOException;

public class HomeWork01 {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("d:\\test\\a.txt");

        //一次读取多个字节
        //利用int read(byte[] b)方法读取字节,并将其存储在缓冲区数组 b 中,返回实际读取到的字节数,用len接受
        //把b数组的从0-len个元素转化为字符串并输出
        byte[] b = new byte[1024];
        int len = in.read(b);
        System.out.println(new String(b, 0, len));

        in.close();
    }
}

字节流复制数据练习

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class HomeWork01 {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("d:\\test\\a.txt");
        FileOutputStream out = new FileOutputStream("d:\\test\\b.txt");
        byte[] b = new byte[1024];

        int len;
        while ((len = in.read(b)) != -1){
            out.write(b, 0, len);
        }

        in.close();
        out.close();
    }
}

字节缓冲流
为什么要设置字节缓冲流?
答:字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果。java本身在设计的时候,也考虑到了这样的情况,所以提供了字节缓冲区流。

字节缓冲输出流
BufferedOutputStream
构造方法:
BufferedOutputStream(OutputStream out)
//创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
//参数OutputStream out其实是一个继承了OutputStream抽象类的子类

字节缓冲输入流
BufferedInputStream
构造方法
BufferedInputStream(InputStream in)
//创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
//参数InputtputStream in其实是一个继承了OutputStream抽象类的子类

注意

  1. 在创建一个流对象的时候,需要基于其他的流对象来创建的,这种流对象叫做包装流。
  2. 对于包装流而言,如果我们要关闭包装流,只需要调用流的close方法即可,不用try–catch。因为,包装流自己会保证,正常关闭,包装流锁关闭的底层流。
  3. void flush()刷新此缓冲的输出流。 flush可以可以帮助我们,强制把缓冲流中的字节数字,写入底层流中,从而写入目标文件中

用字节缓冲流复制数据


import java.io.*;


public class HomeWork01 {
    public static void main(String[] args) throws IOException {
        InputStream in = new FileInputStream("d:\\test\\a.txt");
        OutputStream out = new FileOutputStream("d:\\test\\b.txt");
        InputStream bfin = new BufferedInputStream(in);
        OutputStream bfout = new BufferedOutputStream(out);
        byte[] b = new byte[1024];

        int len;
        while ((len = bfin.read(b)) != -1){
            bfout.write(b, 0, len);
        }

        bfin.close();
        bfout.close();
    }
}
上一篇:IO输出输入流


下一篇:JavaSE-IO流:【FileInputStream +FileOutputStream完成文件的拷贝 】常用代码及问题记录