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();
}