这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战。
文件字节流
- FileInputStream
- FileOutputStream
都是用来操作文件的。以读取字节的方式读任何文件。老朋友一看就知道,这个上一篇文章不是发了嘛,没错。上一篇入门文章就是这样读文本文件的。可以戳:# Java 文件操作必知概念 复习。
FileInputStream
这次读一张图片,就读本文的封面吧题目.png:
结果呢,也果然不超过 255。
代码的主要逻辑还是:
- 新建 输入流对象;
new的时候try-catch用 IDEA 自动包起来;- 再手动加上
finally(必须加上file.close()); try的时候 用while循环不断地读file.read()返回的int 值。
FileOutputStream
- 在读完的基础上,新建一个 输出流对象;
try分支下,while 里面去写到建好的输出流对象(fos.write());while外,要flush()一下;- 当然不要忘记在
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();
}
}
}
}
运行效果:
控制台这边和之前的结果一样,一堆 int 而已。
优化点
上面在写的时候,读取效率很低。因为是一字节一字节地读和写。相当于要运十几万豆子,本文的方式是攒一个巨大的包,而不是用差不多的小包一批一批运。下一次来详细聊聊。