- FilelnputStream
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来。
- 使用步骤
①创建字节输入流对象
②读数据
③释放资源
import java.io.FileInputStream;
import java.io.IOException;
public class InputStreamDemo1 {
public static void main(String[] args) throws IOException {
// 1.创建输入流
FileInputStream fis = new FileInputStream("text/c.txt");
// 2.读取并回显数据
// 当到达文件终点时read方法返回-1
for(int c = fis.read(); c != -1; c = fis.read()){
System.out.println((char) c);
}
}
}
- FilelnputStream使用详解
①创建字节输入流对象
细节1:如果文件不存在,就直接报错。
②读取数据
细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字
细节2:读到文件末尾了,read方法返回-1。
③释放资源
细节1:每次使用完流必须要释放资源。
- FilelnputStream一次读多个字节
方法名称 | 说明 |
public int read() | 一次读一个字节数据 |
public int read(byte[] buffer) | 一次读一个字节数组数据 |
read(byte[] buffer)方法可以一次读一个字节数组的数据,每次读取会尽可能把数组装满。
- 练习:文件拷贝
一个字节一个字节的读取,效率低,代码如下:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) throws IOException {
// 源文件路径
String sourcePath = "D:\\npp.8.5.8.Installer.x64.exe";
// 目标文件地址
String destPath = "dest\\notepad++858.exe";
// 创建输入流
FileInputStream fis = new FileInputStream(sourcePath);
// 创建输出流
FileOutputStream fos = new FileOutputStream(destPath);
// 记录当前系统时间
long beginMill = System.currentTimeMillis();
// 循环读取并写出
for (int b = fis.read(); b != -1; b = fis.read()){
fos.write(b);
}
System.out.println("拷贝共花费" + (System.currentTimeMillis() - beginMill) + "毫秒");
// 关闭资源
fis.close();
fos.close();
}
}
改进使用1M大小的buffer数组作为缓冲区,读写效率将大大提高:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopyPlus {
public static void main(String[] args) throws IOException {
// 源文件路径
String sourcePath = "D:\\npp.8.5.8.Installer.x64.exe";
// 目标文件地址
String destPath = "dest\\notepad++858.exe";
// 创建输入流
FileInputStream fis = new FileInputStream(sourcePath);
// 创建输出流
FileOutputStream fos = new FileOutputStream(destPath);
// 记录当前系统时间
long beginMill = System.currentTimeMillis();
// 创建缓冲数组1M
byte[] buffer = new byte[1024 * 1024];
// 循环读取并写出
for (int len = fis.read(buffer); len != -1; len = fis.read(buffer)){
fos.write(buffer,0, len); // 写出buffer中的数据,从0索引开始,写len个数据
}
// 统计消耗时间
System.out.println("拷贝共花费" + (System.currentTimeMillis() - beginMill) + "毫秒");
// 关闭资源
fis.close();
fos.close();
}
}
- 异常完整形态try...catch...
引入finally语句块:finally里面的代码一定被执行,除非虚拟机停止。因此释放资源之类的代码非常适合写在finally语句块内。
但在关闭前也要判断是否已初始化(是否为null)。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IODemo1 {
public static void main(String[] args) {
//1.创建对象
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("D:\\itheima\\b.mp4");
fos = new FileOutputStream("myio\\copy.mp4");
//2.拷贝
int len;
byte[] bytes = new byte[1024 * 1024 * 5];
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
} catch (IOException e) {
//e.printstackTrace();
} finally {
//3.释放资源
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
}