Java IO流(三)(字节流FileInputStream)

2023-12-13 15:38:05

  1. FilelnputStream

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来。

  1. 使用步骤

①创建字节输入流对象

②读数据

③释放资源

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);
????????}
????}
}
  1. FilelnputStream使用详解

①创建字节输入流对象

细节1:如果文件不存在,就直接报错。

②读取数据

细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字

细节2:读到文件末尾了,read方法返回-1。

③释放资源

细节1:每次使用完流必须要释放资源。

  1. FilelnputStream一次读多个字节

方法名称

说明

public int read()

一次读一个字节数据

public int read(byte[] buffer)

一次读一个字节数组数据

?read(byte[] buffer)方法可以一次读一个字节数组的数据,每次读取会尽可能把数组装满。

  1. 练习:文件拷贝

一个字节一个字节的读取,效率低,代码如下:

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

  1. 异常完整形态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);
????????????????}
????????????}
????????}

????}
}

文章来源:https://blog.csdn.net/weixin_50083448/article/details/134911751
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。