Java 常见流对象——文件字节流

363 阅读1分钟

这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

文件字节流

  • FileInputStream
  • FileOutputStream

都是用来操作文件的。以读取字节的方式读任何文件。老朋友一看就知道,这个上一篇文章不是发了嘛,没错。上一篇入门文章就是这样读文本文件的。可以戳:# Java 文件操作必知概念 复习。

FileInputStream

这次读一张图片,就读本文的封面吧题目.pngimage.png 结果呢,也果然不超过 255。

代码的主要逻辑还是:

  1. 新建 输入流对象
  2. new 的时候 try-catch 用 IDEA 自动包起来;
  3. 再手动加上 finally(必须加上 file.close());
  4. try 的时候 用 while 循环不断地读 file.read() 返回的 int 值

FileOutputStream

  1. 在读完的基础上,新建一个 输出流对象
  2. try 分支下,while 里面去写到建好的输出流对象(fos.write());
  3. while 外,要 flush() 一下;
  4. 当然不要忘记在 finally 下面关闭这个对象 ~

上代码

package com.ftech.TestFileIO;

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

public class TestFileStream {
    public static void main(String[] args) {
        FileInputStream file = null;
        FileOutputStream fos = null;
        try {
            file = new FileInputStream("/Users/fang/Images/题目.png");
            fos = new FileOutputStream("/Users/fang/Images/题目 output.png");
            int temp = 0;
            while ((temp = file.read())!=-1){
                System.out.print(temp+" ");
                fos.write(temp);
            }
            // 从内存调一下
            fos.flush();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (file!=null) {
                try {
                    file.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行效果: image.png 控制台这边和之前的结果一样,一堆 int 而已。

优化点

上面在写的时候,读取效率很低。因为是一字节一字节地读和写。相当于要运十几万豆子,本文的方式是攒一个巨大的包,而不是用差不多的小包一批一批运。下一次来详细聊聊。