目录
摘要:本文讲解了java中的文件字节流,也就是我们常说的万年流,包括文件字节输入流(FileInputStream)和文件字节输出流(FileOutputStream)的内容,这里会讲解这两种流的构造方法和常用方法,后面还有一个案例来理解文件字节流。
万能流:任何类型的文件都可以采用该流(输入流或输出流)来读或写
1. 如何理解文件字节流?
首先,文件?File?对文件进行操作?以什么样的形式?
File类
是对文件和目录的本身进行操作,不能对文件内容操作。
它完成的操作是:
创建文件,删除文件,判断·某个文件或目录是否存在,获取文件的长度等。
文件字节流
是对文件里的内容进行读和写操作。
2. 基础概念(文件专属)
FileInputStream
文件字节输入流:java.io.FileInputStream
继承自InputStream的流,以字节的方式读取文件的内容
FileOutputStream
文件字节输入流:java.io.FileOutputStream
继承自OutputStream的流,以字节的方式将内容写入文件
注:1个字节 = 8个二进制位
文件是存储在硬盘中的,而程序是运行在内存中的。
输入流:从硬盘读取到内存中
输出流:从内存写入到硬盘中
3. FileInputStream流的基本方法
java.io.FileInputStream类
1)继承关系:
2)构造方法
3)常用的具体方法
4. FileOutputStream流的基本方法
java.io.FileOutputStream类
1)继承关系
2)构造方法
3)常用的具体方法
5. 万能流的异常问题:(需要注意的地方)
1)当创建FileInputStream流对象时,出现文件路径或文件对象错误时,会引发FileNotFoundException异常;
2)而FileOutputStream 的创建不依赖于文件是否存在,如果没有这个文件,会新建该文件;但是需要注意的是,当该文件的父级目录不存在时,会报FileNotFoundException;如果打开只读文件的话,会报IOException异常。
6. 案例: 实现文件复制(使用字节流)
package cn.sz.gl.test05;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Test {
public static void copyFileByStream(File source, File target) {
// 判断源文件是否存在,如果不存在,就退出程序
if (!source.exists()) {
System.out.println("源文件不存在,程序退出");
System.exit(0);
}
// target.getParentFile()表示用来获取目标对象的父目录对象
// 如果目标文件路径不存在,就创建
if (!target.getParentFile().exists()) {
target.getParentFile().mkdirs();
}
InputStream is = null;
OutputStream os = null;
try {
// 准备输入流
is = new FileInputStream(source);
// 准备输出流
os = new FileOutputStream(target);
// 准备一个数组,用来存放读写的数据
byte[] b = new byte[1024];
int len = 0;
// read(b)实现读取操作,数据存入b数组,返回读取长度给len,当所有内容都读取完毕,len=-1
while ((len = is.read(b)) != -1) {
// 实现写的操作
os.write(b, 0, len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 将source文件对象的内容读出来,同时完成将读出来的内容写入的target文件对象中
public static void main(String[] args) {
File source = new File("D:\\java\\Java高级\\myfile\\a.txt");
File target = new File("D:\\java\\Java高级\\myfile\\b.txt");
copyFileByStream(source, target);
}
}