FileInputStream和FileOutputStream的具体使用

FileInputStream

FileInputStream 从文件系统中的某个文件中获得输入字节。

构造方法

public FileInputStream(String name)

通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定

public FileInputStream(File file)

通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。

常用的方法

从输入流中读取一个字节大小的数据
public int read();
从输入流一次读取一个字节数组
public int read(byte[] b);

从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。

public int read(byte[] b,int off,int len);

从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。off:目标数组 b 中的起始偏移量(位置)。

从文件中读取数据的基本操作
public static void main(String[] args) {
        File file = new File("./a.txt");
        if(!file.exists()){
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
            //从输入流中读取数据
//            int tmp;
//            while((tmp = fis.read()) != -1){
//                System.out.println(tmp);
//            }
            byte[] bytes = new byte[fis.available()];//返回当前文件字节数
            fis.read(bytes);
            System.out.println(Arrays.toString(bytes));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

注意

a.FileInputStream在构造对象,有可能抛出文件找不到的异常
b.read()表示每次读取一个字节的数据,把字节转换为int返回
c.文件流使用完之后,要关闭,避免占用资源

面试题:read读取的是一个字节,为什么返回的是int,而不是byte?

-1 ->byte 1111 1111
-1 ->int 1111 1111 1111 1111 1111 1111 1111 1111
因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型

FileOutputStream

文件输出流是用于将数据写入到文件中。

构造方法

public FileOutputStream(File file);

创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

public FileOutputStream(File file,boolean append);

创建一个向指定 File 对象表示的文件中写入数据的文件输出流。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。

public FileOutputStream(String name);

创建一个向具有指定名称的文件中写入数据的输出文件流。

public FileOutputStream(String name,boolean append);

创建一个向具有指定 name 的文件中写入数据的输出文件流。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。

常用的方法

向文件中写入一个字节大小的数据
public void write(int b);

向文件中写入一个字节大小的数据

向文件中一次性写入一个字节数组的数据
public void write(byte[] b);

将 b.length 个字节从指定 byte 数组写入此文件输出流中。

public void write(byte[] b,int off,int len);

指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。

向文件中写入数据的基本操作
public static void main(String[] args){
        FileOutputStream fos = null;
        try {
            fos  = new FileOutputStream("b.txt");
            //fos.write(33);
            byte[] bytes = {33, 34, 35, 36, 37, 38};
            fos.write(bytes);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

拷贝图片或音频文件

图片1 -》 读取图片1 -》 写入图片1的副本 完成拷贝

具体代码

public static void main(String[] args) {
        //定义一个缓存数组去拷贝
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            // 从源文件中读取字节
            fis = new FileInputStream("a.jpg");
            //写入字节到目标文件
            fos = new FileOutputStream("b1.jpg");
            byte[] bytes = new byte[1024];
            int tmp = -1;
            //从源文件中读取数据带缓存数组当中去
            //read(byte[]) return 实际读取的字节数
            while((tmp = fis.read(bytes)) != -1){
                //写入缓存数组当中的数组到目标文件中
                fos.write(bytes, 0, tmp);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //写入字节到目标文件
//        //一个字节一个字节去拷贝
//        //从源文件中读取字节
//        FileInputStream fis = new FileInputStream("a.jpg");
//        //写入字节到目标文件
//        FileOutputStream fos = new FileOutputStream("b1.jpg");
//        //从输入流对象中读取字节
//        //int tmp = fis.read();//只读取一个字节
//        //通过输出流对象写入字节
//        //fos.write(tmp);
//        //从输入流对象中读取字节
//        int tmp = -1;
//        while((tmp = fis.read()) != -1){
//            //通过输出流对象写入字节
//            fos.write(tmp);
//        }
//        fis.close();
//        fos.close();
    }