JavaSE: FileOutputStream类 & FileInputSteam类
FileOutputStream类
<1> 基本概念
java.io.FileOutputStream类:用于将图像数据之类的原始字节流写入到输出流中。
<2> 常用的方法
方法声明 功能介绍
1.FileOutputStream(String name) 根据参数指定的文件名来构造对象
2.FileOutputStream(String name, boolean append) 以追加的方式,根据参数指定的文件名,来构造对象
3.void write(int b) 将指定字节,写入此文件输出流
4.void write(byte[] b, int off, int len) 将指定字节数组中从偏移量off开始的len个字节写入此文件输出流
5.void write(byte[] b) 将 b.length 个字节从指定字节数组写入此文件输出流中
6.void flush() 刷新此输出流并强制写出任何缓冲的输出字节
7.void close() 关闭流对象并释放有关的资源
FileInputStream类
<1> 基本概念
java.io.FileInputStream: 用于从输入流中以字节流的方式获取图像数据等。
<2> 常用的方法
方法声明 功能介绍
8.FileInputStream(String name) 根据参数指定的文件路径来构造对象
9.int read() 从输入流中读取单个字节的数据并返回,返回-1表示读取到末尾
10.int read(byte[] b, int off, int len) 从此输入流中,将最多len个字节的数据存入字节数组中,返回读取到的字节个数,
返回 -1 表示读取到末尾
11.void close() 关闭流对象,并释放有关的资源
12.int available() 获取输入流所关联的文件的大小
案例题目
编程实现两个文件之间的拷贝功能
代码示例:
class FileByteCopyTest{
main(){
// 获取当前系统时间距离 1970年1月1日0时0分0秒的毫秒数
long g1 = System.currentTimeMillis();
FileInputStream fis = null;
FileOutputStream fos = null;
try{
// 1. 创建FileInputStream类型的对象,与d:/03 IO流的框架图.png 文件关联
// fis = new FileInputStream("d:/02_IO流的框架结构.mp4");
fis = new FileInputStream ("d:/02_IO流的框架结构.mp4");
// 2. 创建FileOutputStream类型的对象,与d:/03 IO流的框架图.png 文件关联
fos = new FileOutputStream("d:/IO流的框架结构.mp4");
// 3. 不断地从输入流中,读取数据内容,并写入到输出流中
println("正在玩命地拷贝...");
// 方式一:以单个字节为单位进行拷贝,也就是每次读取一个字节后,再写入一个字节
// 缺点: 文件稍大时,拷贝的效率很低
/*
int res = 0;
while ( (res = fis.read(bArr)) != -1){
fos.write(res);
}
*/
// 方式二: 准备一个和文件大小一样的缓冲区,一次性将文件中的所有内容取出到缓冲区,然后一次性写入进去
// 缺点: 若文件过大时,无法申请和文件大小一样的缓冲区,真实物理内存不足
/*
int len = fis.available();
println("获取到的文件大小是:" + len);
byte[] bArr = new byte[len];
int res = fis.read(bArr);
println("实际读到的文件大小是:" + res);
fos.write(bArr);
*/
// 方式三: 准备一个相对适当的缓冲区,分多次将文件拷贝完成
byte[] bArr = new byte[1024];
int res = 0;
while ( (res = fis.read(bArr)) != -1 ) {
fos.write(bArr,0,res);
}
println("拷贝文件成功!");
*/
} catch(IOException e) {
e.printStackTrace();
} finally {
// 4. 关闭流对象,并释放有关的资源
if (null != fos){
try{
fos.close();
} catch(IOException e) {
e.printStackTrace();
}
}
if (null != fis){
try{
fis.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
long g2 = System.currentTimeMillis();
println("使用文件流拷贝文件消耗的时间为:" + (g2 - g1)); // 165
}
}