Java IO 介绍

news/2024/10/24 17:14:43/

IO 介绍
Java IO 主要是对文件进行读取和写入。

IO 的分类
按数据流的方向可以分成两类:

输入流:只能从中读取数据。
输出流:只能向其写入数据。
按处理数据的单位不同可以分成两类:

字节流:二进制,可以处理所有文件。
字符流:文本文件,只能用于处理文本文件。
按功能不同可以分成两类:

节点流:包裹源头。
处理流:增强功能,提高性能。

区别
FileInputStream 与 BufferedInputStream 区别

FileInputStream 是字节流,BufferedInputStream 是字节缓冲流。

使用 BufferedInputStream 读资源比 FileInputStream 读取资源的效率高,且 FileInputStream 对象的 read() 方法会出现阻塞。

FileInputStream 与 FileReader 区别

FileInputStream 是字节流,FileReader 是字符流。

用字节流读取中文的时候,可能会出现乱码,而用字符流则不会出现乱码,而且用字符流读取的速度比字节流要快。

ObjectOutputStream 与 ByteArrayOutputStream 的区别

ObjectOutputStream 可以将 java 对象写入 outputstream 流中(序列化),然后进行持久化,此对象必须是实现了java.io.Serializable 接口。

ByteArrayOutputStream 是将数据写入 byte 数组中。

字节流案例
FileInputStream
FileInputStream 用来通过字节读取文件。

下面案例是通过 FileInputStream 读取本地的文本文件,并打印文件内容。

FileInputStream inputStream = new FileInputStream(“D:\test.txt”);
byte[] bytes = new byte[1024];
int length = 0;
// 需要注意中文占三个字节,英文和数字占一个字节,如果中文在读取的时候截断了,会出现乱码
while ((length = inputStream.read(bytes)) != -1) {
String str = new String(bytes, 0, length);
System.out.println(str);
}
// 释放资源
inputStream.close();
FileOutputStream
FileOutputStream 用来通过字节写入文件。

下面案例是通过 FileOutputStream 写入文本文件,并将本地文件保存到本地。

FileOutputStream outputStream = new FileOutputStream(“D:\test.txt”);
byte[] bytes = “人生苦短,我用Python”.getBytes();
outputStream.write(bytes, 0, bytes.length);
outputStream.close();
字符流案例
BufferedReader
BufferedReader 用来通过字符读取文件。

下面案例是通过 BufferedReader 读取文件,并打印文件内容。

BufferedReader reader = new BufferedReader(new FileReader(“D:\test.txt”));
char[] chars = new char[10];
int length = 0;
while ((length = reader.read(chars)) != -1) {
System.out.print(String.valueOf(chars, 0, length));
}
reader.close();
此外 BufferedReader 按行读取文件。

BufferedReader reader = new BufferedReader(new FileReader(“D:\test.txt”));
// 读取第一行
System.out.println(reader.readLine());
// 读取第二行
System.out.println(reader.readLine());
// …以此类推,如果读取的行数不存在,则返回 null
reader.close();
BufferedWriter
BufferedWriter 用来通过字符写入文件。

下面案例是通过 BufferedWriter 写入文本文件,并将本地文件保存到本地。

BufferedWriter writer = new BufferedWriter(new FileWriter(“D:\test.txt”));
writer.write(“辛苦遭逢起一经,”);
writer.write(“干戈寥落四周星。”);
writer.write(“山河破碎风飘絮,”);
writer.write(“身世浮沉雨打萍。”);
writer.write(“惶恐滩头说惶恐,”);
writer.write(“零丁洋里叹零丁。”);
writer.write(“人生自古谁无死?”);
writer.write(“留取丹心照汗青。”);
writer.close();
文件上传和下载
上传单个文件
编写一个单个文件上传的方法,并将上传的文件保存到本地。

@SneakyThrows
@GetMapping(“uploadFile”)
@ResponseBody
public Object uploadFile(MultipartFile file) {
// 文件保存本地的地址
String localPath = “D:\uploadFile\”;
// 文件名称
String fileName = file.getOriginalFilename();
// 文件保存路径
String savePath = localPath + fileName;
// 获得文件的输入流
InputStream is = file.getInputStream();
// 创建文件保存的输出流
FileOutputStream os = new FileOutputStream(savePath);
// 进行文件保存
byte[] bytes = new byte[1024];
int len;
while ((len = is.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
//资源释放
os.close();
is.close();
return "save: " + savePath;
}
在 SpringBoot 默认限制了请求的最大长度和上传文件的最大长度,可以通过以下两个配置修改其大小:

spring.servlet.multipart.max-file-size=-1
spring.servlet.multipart.max-request-size=-1
cURL 如下:

curl --location --request GET ‘http://localhost:8080/uploadFile’
–form ‘file=@“/D:/test.txt”’
上传多个文件
@SneakyThrows
@GetMapping(“batchUploadFile”)
@ResponseBody
// @RequestParm() 注解来确定上传的文件数组
public Object batchUploadFile(@RequestParam(“file”) MultipartFile[] files) {
// 文件保存本地的地址
String localPath = “D:\uploadFile\”;
List filePathList = new ArrayList<>();
for (MultipartFile file : files) {
// 文件名称
String fileName = file.getOriginalFilename();
// 文件保存路径
String savePath = localPath + fileName;
filePathList.add(savePath);
// 获得文件的输入流
InputStream is = file.getInputStream();
// 创建文件保存的输出流
FileOutputStream os = new FileOutputStream(savePath);
// 进行文件保存
byte[] bytes = new byte[1024];
int len;
while ((len = is.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
os.close();
is.close();
}
return "save: " + filePathList;
}
cURL 如下:

curl --location --request GET ‘http://localhost:8080/batchUploadFile’
–form ‘file=@“/D:/test.txt”’
–form ‘file=@“/D:/test.jpg”’
下载单个文件
说明:

@SneakyThrows
@GetMapping(“downloadFile”)
public void downloadFile(HttpServletResponse response) {
// 文件地址,一般是请求中传递进来的,这里代码演示,直接写死地址
File file = new File(“D:\uploadFile\41_input函数.avi”);
// 重定向:主要用于文件重命名,重定向到下载文件的接口
// URLEncoder 用于解决中文乱码问题
response.sendRedirect(“/downloadFile/” + URLEncoder.encode(file.getName(), “utf-8”));
}

@SneakyThrows
@GetMapping(“downloadFile/{filename}”)
public void downloadFileRedirect(HttpServletResponse response) {
ServletOutputStream sos = response.getOutputStream();
// 文件地址,一般是请求中传递进来的,这里代码演示,直接写死地址
File file = new File(“D:\uploadFile\41_input函数.avi”);
FileInputStream fis = new FileInputStream(file);
byte[] bytes = new byte[1024];
int len;
while ((len = fis.read(bytes)) != -1) {
sos.write(bytes, 0, len);
}
String fileName = file.getName();
response.setHeader(“Content-Disposition”, “attachment;fileName=” + fileName);
response.setHeader(“attachment”, new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
fis.close();
sos.close();
response.sendRedirect(fileName);
}
cURL 如下:

curl --location --request GET ‘http://localhost:8080/downloadFile’
commons-io 工具
Apache Commons IO 库包含了工具类,流的实现, 文件过滤器,文件比较器,endian 转换类,还有其他更多的内容。

Maven 依赖如下:

commons-io commons-io 2.11.0 官方 API 文档如下:https://commons.apache.org/proper/commons-io/javadocs/api-2.7/

下面介绍几个常用的工具类。

IOUtils
IOUtils 包含了用来处理读、写、复制的方法。这些方法基于 InputStream、OutputStream、Reader、Writer 运行。

常用的方法如下:

方法名 说明
buffer() 将参数传入的进行包装,返回缓冲流,并且可以指定缓冲的大小
toBufferedInputStream() 将输入转为带缓存的输入流
toBufferedReader() 将输入转为带缓存的输入流
toByteArray() 将输入流的内容转为字节数组
toCharArray() 将输入流的内容转为字符数组
contentEquals() 比较两个流中的内容是否一致
toString() 获得文件的文本内容
copy() 将输入流中的内容拷贝到输出流中,并可以指定字符编码
copyLarge() 将输入流中的内容拷贝到输出流中,适合大于2G内容的拷贝
read() 将输入流中的部分内容读入到字节数组中
readFully() 将输入流中的所有内容读入到字节数组中
readLine() 读入输入流内容中的一行
write() 向流里面写入内容
writeLine() 向流里面写入一行内容
lineIterator() 返回可以迭代每一行内容的迭代器
close() 释放流资源
closeQuietly() 释放流资源
FileUtils
FileUtils 包含了与 File 对象一起工作的工具方法。这些方法包括读、写、复制、比较文件。

常用的方法如下:

方法名 说明
cleanDirectory() 清空目录,但不删除目录
contentEquals() 比较两个文件的内容是否相同
copyDirectory() 将一个目录内容拷贝到另一个目录。可以通过 FileFilter 过滤需要拷贝的文件
copyFile() 将一个文件拷贝到一个新的地址
copyFileToDirectory() 将一个文件拷贝到某个目录下
copyInputStreamToFile() 将一个输入流中的内容拷贝到某个文件
deleteDirectory() 删除目录
deleteQuietly() 删除文件
listFiles() 列出指定目录下的所有文件
openInputSteam() 打开指定文件的输入流
readFileToString() 将文件内容作为字符串返回
readLines() 将文件内容按行返回到一个字符串数组中
size() 返回文件或目录的大小
write() 将字符串内容直接写到文件中
writeByteArrayToFile() 将字节数组内容写到文件中
writeLines() 将容器中的元素的toString方法返回的内容依次写入文件中
writeStringToFile() 将字符串内容写到文件中


http://www.ppmy.cn/news/1541624.html

相关文章

ElasticSearch基本概念

本文内容参考了田雪松老师编著的《Elastic Stack应用宝典》 对比关系型数据库 索引&#xff08;Index&#xff09;相当于库映射类型&#xff08;Mapping Type&#xff09;相当于表文档&#xff08;Document&#xff09;相当于行文档字段&#xff08;Field&#xff09;相当于列…

教育信息化的挑战与机遇:Spring Boot平台

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

第十七章 Java多线程--线程池-ScheduledThreadPoolExecutor

目录 一、ScheduledThreadPoolExecutor基础概念 主要功能 使用方法 方法 注意事项 二、ScheduledThreadPoolExecutor应用&源码 1 ScheduleThreadPoolExecutor介绍 2 ScheduleThreadPoolExecutor应用 3 ScheduleThreadPoolExecutor源码 3.1 核心属性 3.2 schedul…

【表情识别】Python+卷积神经网络算法+人工智能+深度学习+Django网页界面+算法模型+TensorFlow

表情识别系统&#xff0c;本系统使用Python作为主要编程语言&#xff0c;通过TensorFlow搭建ResNet50卷积神经算法网络模型&#xff0c;通过对7种表情图片数据集&#xff08;‘Neutral’, ‘Anger’, ‘Disgust’, ‘Fear’, ‘Happy’, ‘Sad’, ‘Surprise’&#xff09;进行…

Tailscale自建中转服务器derper搭建笔记(基于docker)

自己搭建derper服务器&#xff0c;让Tailscale中转更流畅。 Tailscale是很好的远程组网工具&#xff0c;在两台机器P2P打洞成功的情况下可以实现网络直连&#xff0c;但如果打洞失败就会进行数据中转&#xff0c;我们的数据要跑到国外再跑回来&#xff0c;这样速度就很慢了。 …

单片机STC8H8K64U开发板_RA6809开发板 驱动彩屏显示

单片机STC8H8K64U开发板&#xff0c;型号RT8H8K001 预留Type C接口&#xff0c;可供电SWD下载&#xff1a; RA6809开发板&#xff0c;型号RT6809CNN01 预留Type C接口供电&#xff0c;预留MCU接口、电容触摸屏接口、液晶屏接口&#xff1a; 双臂合一&#xff0c;驱动和控…

从图像识别到聊天机器人:Facebook AI的多领域应用

随着人工智能技术的快速发展&#xff0c;Facebook已在多个领域内广泛应用AI技术&#xff0c;以提升用户体验、提高效率并推动创新。从图像识别到聊天机器人&#xff0c;Facebook的AI应用涵盖了社交媒体的方方面面&#xff0c;下面我们将深入探讨这些应用的具体实现及其对用户生…

《YOLO 目标检测》—— YOLO v3 详细介绍

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;还未写完&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xf…