一、OutputStream输出流
FileOutputStream概述:
操作本地文件的字节输出流,可以把程序中的数据写到本地文件中
书写步骤:
① 创建字节输出流对象
细节1:参数一是字符串表示的路径或者File对象都是可以的
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
细节3:如果文件已经存在,则会清空文件
细节4:参数二表示是否开启续写功能(不会清空文件内容),默认是false
//字符串路径、开启续写功能
FileOutputStream fos = new FileOutputStream("day11\\a.txt",true);
//File对象创建输出流
FileOutputStream fos1 = new FileOutputStream(new File("day11\\a.txt"));
② 写数据
细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符,FileOutputStream写数据的3种方式:
注意1:字符串也可以通过getBytes()方法转换成字节数组进行写入数据。
注意2:写入数据时如果想换行写入,使用\r\n或单写\r和\n即可。
package com.liming.myio;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteOutStreamDemo02 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("day11\\a.txt");
fos.write(97);
fos.write(98);
byte[] arr = {97,98,99,100};
fos.write(arr);
byte[] arr1 = {97, 98, 99, 100};
fos.write(arr1,1,3);
String str1 = "Hello FileOutStream";
byte[] bytes1 = str1.getBytes();
fos.write(bytes1);
//换行\r\n 或者单写\r或\n
String str = "\r\n";
byte[] Bytes = str.getBytes();
fos.write(bytes1);
fos.close();
}
}
③ 释放资源关闭流
细节1:每次使用完流之后都要释放资源
细节2:建议先创建的流后关闭,后创建的流先关闭
// 关闭流
fos.close();
二、InputStream输入流
FileIntputStream概述:
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来
书写步骤:
① 创建字节输入流对象
细节:如果文件不存在,就直接报错
//1. 创建字节输入流对象
FileInputStream fis = new FileInputStream("day11\\a.txt");
FileInputStream fis1 = new FileInputStream(new File("day11\\a.txt"));
② 读数据
细节1:一次读取一个字节,读出来的是数据在ASCII上对应的数字
细节2:读到文件末尾了,read方法返回-1
重点:循环读取数据
//2. 读数据
int read = fis.read();
System.out.println((char) read);
//2. 循环读取一个字节数据
int b;
while ((b = fis.read()) != -1) {
System.out.print((char) b);
}
//2. 循环读取一个字节数组数据
int len;//读取的字节个数
byte[] bytes = new byte[1024*1024*5];//一次读取5MB
while ((len = fis.read(bytes)) != -1) {
//2.1 写入数据、读取几个字节就写入几个字节
fos.write(bytes,0,len);
}
③ 释放资源关闭流
//释放资源
fos.close();
三、拷贝文件案例
要求:
文件拷贝
把D:\aaa\movie.mp4文件拷贝到当前模块下
方式一:
利用循环从磁盘文件读取一个字节数据写入当前模块下
文件 -->(读取) 程序 -->(写入) 文件
代码演示:
package com.liming.myio;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamTest01 {
public static void main(String[] args) throws IOException {
long startTime = System.currentTimeMillis();
//1. 创建字节输入流用于读取数据
FileInputStream fis = new FileInputStream("D:\\aaa\\movie.mp4");
//2. 创建字节输出流用于写入数据
FileOutputStream fos = new FileOutputStream("day11\\copy.mp4");
//3. 循环读取数据
int b;
while ((b = fis.read()) != -1) {
//4. 写入数据
fos.write(b);
}
//4. 释放资源
fos.close();
fis.close();
long endTime = System.currentTimeMillis();
System.out.println("总时间:" + (endTime - startTime) + "毫秒");
}
}
运行效果图:
我们可以发现这种循环读取方式效率非常慢,所有我们利用循环读取一个字节数组的方式对程序进行改进。
方式二:
package com.liming.myio;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamTest02 {
public static void main(String[] args) throws IOException {
/*
* 文件拷贝
* 把D:\aaa\movie.mp4文件拷贝到当前模块下
* */
long startTime = System.currentTimeMillis();
//1. 创建字节输入流用于读取数据
FileInputStream fis = new FileInputStream("D:\\aaa\\movie.mp4");
//2. 创建字节输出流用于写入数据
FileOutputStream fos = new FileOutputStream("day11\\copy.mp4");
//3. 循环读取数据
int len;//读取的字节个数
byte[] bytes = new byte[1024*1024*5];//一次读取5MB
while ((len = fis.read(bytes)) != -1) {
//4. 写入数据、读取几个字节就写入几个字节
fos.write(bytes,0,len);
}
//4. 释放资源
fos.close();
fis.close();
long endTime = System.currentTimeMillis();
System.out.println("总时间:" + (endTime - startTime)+"毫秒");
}
}
运行效果图: