Java读取文件的N种方法
1.概述
在这篇文章里, 我们将探索不同的方式从文件中读取数据。
首先, 学习通过标准的的Java类,从classpath、URL或者Jar中加载文件。
然后,学习通用BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream, FileChannel读取文件内容。也会讨论如何读取UTF-8编码的文件。
最后,学习Java7和Java8中新的加载和读取文件的技术。
2.准备
2.1 输入文件
这篇文章的很多示例,从名为fileTest.txt的文件读取文本内容,文件包含
Hello,World!
有少量示例, 我们会读取不同的文件, 示例中会有说明。
2.2 辅助方法
很多示例都会用到共用的方法readFromInputStream, 该方法将InputStream转化String
private String readFromInputStream(InputStream inputStream)throws IOException {StringBuilder resultStringBuilder = new StringBuilder();try (BufferedReader br= new BufferedReader(new InputStreamReader(inputStream))) {String line;while ((line = br.readLine()) != null) {resultStringBuilder.append(line).append("\n");}}return resultStringBuilder.toString();}
3.从Classpath读取文件
3.1 使用标准Java
从src/main/resources读取文件fileTest.txt
@Testpublic void test() throws IOException {String expectedData = "Hello,World!";Class<ReadFileTest> clazz = ReadFileTest.class;InputStream inputStream = clazz.getResourceAsStream("/fileTest.txt");String data = readFromInputStream(inputStream);Assert.assertThat(data, containsString(expectedData));}
在上面的代码中,我们通过当前类的getResourceAsStream方法加载文件,入参是绝对路径。
ClassLoader中相同的方法也可以使用。
ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("fileTest.txt");
String data = readFromInputStream(inputStream);
这两种方法的主要区别是, 当前类的ClassLoader的getResourceAsStream方法,入参路径是从classpath开始。
而类实例的入参是相对于包路径,但路径开始使用'/'符号, 也是绝对路径。
特别要注意的是, 文件打开读取完数据后, 始终需要关闭
inputStream.close();
3.2 使用commons-io库
另一个比较常用的方法是使用commons-io包里的FileUtils.readFileToString方法。
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>1.4</version></dependency>@Testpublic void useCommonIO() throws IOException {String expectedData = "Hello,World!";ClassLoader classLoader = getClass().getClassLoader();File file = new File(classLoader.getResource("fileTest.txt").getFile());String data = FileUtils.readFileToString(file, "UTF-8");assertEquals(expectedData, data.trim());}
该方法入参是File对象。这个工具类的优点是不用编码InputStream实例的相关代码。
这个库还提供了IOUtils类。
@Testpublic void useCommonIO2() throws IOException {String expectedData = "Hello,World!";FileInputStream fis = new FileInputStream("src/test/resources/fileTest.txt");String data = IOUtils.toString(fis, "UTF-8");assertEquals(expectedData, data.trim());}
4.BufferedReader
@Test
public void bufferedReader() throws IOException {String expected_value = "Hello,World!";String file ="src/test/resources/fileTest.txt";BufferedReader reader = new BufferedReader(new FileReader(file));String currentLine = reader.readLine();reader.close();assertEquals(expected_value, currentLine);
}
当读取结束的时候, reader.readLine()会返回null
5.Java NIO
NIO是在JDK7中添加。
5.1读取小文件
首先看一下关于Files.readAllLines的示例
@Testpublic void readSmallFile() throws IOException {String expected_value = "Hello,World!";Path path = Paths.get("src/test/resources/fileTest.txt");String read = Files.readAllLines(path).get(0);assertEquals(expected_value, read);}
入参Path对象,Path可以认为是java.io.File的升级版本,提供一些额外的功能。
如果读取的是二进制文件,可以使用Files.readAllBytes()方法
5.2读取大文件
如果想要读取大文件, 我们可以使用Files类和BufferedReader类。
@Testpublic void readLargeFile() throws IOException {String expected_value = "Hello,World!";Path path = Paths.get("src/test/resources/fileTest.txt");BufferedReader reader = Files.newBufferedReader(path);String line = reader.readLine();assertEquals(expected_value, line);}
5.3Files.lines
在JDK8中,Files类增加了lines方法,这个方法将返回Stream<String>。跟文件操作一样,Stream需要显式调用的close()。Files API提供了很多简单读取文件的方法。
6.Scanner
下面我们将使用Scanner读取文件,使用逗号(,)作为定界符(delimiter)。
@Test
public void whenReadWithScanner_thenCorrect()throws IOException {String file = "src/test/resources/fileTest.txt";Scanner scanner = new Scanner(new File(file));scanner.useDelimiter(",");assertTrue(scanner.hasNext());assertEquals("Hello", scanner.next());assertEquals("World!", scanner.next());scanner.close();
}
Scanner默认的定界符是空格。它适用于从控制台读取输入或者内容有固定定界符的内容时。
7.StreamTokenizer
tokenizer会指出下一个token的类型,String或Number。
tokenizer.nval - 如果类型为Number时,读取该字段
tokenizer.sval - 如果类型为String时,读取该字段
@Test
public void readWithTokenize()throws IOException {String file = "src/test/resources/fileTestTokenizer.txt";FileReader reader = new FileReader(file);StreamTokenizer tokenizer = new StreamTokenizer(reader);// 1tokenizer.nextToken();assertEquals(StreamTokenizer.TT_WORD, tokenizer.ttype);assertEquals("Hello", tokenizer.sval);// 2tokenizer.nextToken();assertEquals(StreamTokenizer.TT_NUMBER, tokenizer.ttype);assertEquals(1, tokenizer.nval, 0.0000001);// 3tokenizer.nextToken();assertEquals(StreamTokenizer.TT_EOF, tokenizer.ttype);reader.close();
}
8.DataInputStream
如果要读取二进制文件或者原生数据,可以使用DataInputStream
@Test
public void whenReadWithDataInputStream() throws IOException {String expectedValue = "Hello,World!";String file ="src/test/resources/fileTest.txt";String result = null;DataInputStream reader = new DataInputStream(new FileInputStream(file));int nBytesToRead = reader.available();if(nBytesToRead > 0) {byte[] bytes = new byte[nBytesToRead];reader.read(bytes);result = new String(bytes);}assertEquals(expectedValue, result);
}package com.pl;import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;public class ccs_2 {public static void main(String[] args) throws IOException {String expectedValue = "";String file = "C:\\Users\\Administrator\\Desktop\\1.txt";//result = null;DataInputStream reader = new DataInputStream(new FileInputStream(file));int nBytesToRead = reader.available();if (nBytesToRead > 0) {byte[] bytes = new byte[nBytesToRead];reader.read(bytes);expectedValue = new String(bytes);}System.out.printf("\n====" + expectedValue);}
}
9.FileChannel
如果读取的是一个大文件,FileChannel速度会超过standard IO。
@Test
public void whenReadWithFileChannel()throws IOException {String expected_value = "Hello,World!";String file = "src/test/resources/fileTest.txt";RandomAccessFile reader = new RandomAccessFile(file, "r");FileChannel channel = reader.getChannel();int bufferSize = 1024;if (bufferSize > channel.size()) {bufferSize = (int) channel.size();}ByteBuffer buff = ByteBuffer.allocate(bufferSize);channel.read(buff);buff.flip();assertEquals(expected_value, new String(buff.array()));channel.close();reader.close();
}package com.pl;import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;public class ccs_2 {public static void main(String[] args) throws IOException {//throws IOException {String expected_value = "";String file = "C:\\Users\\Administrator\\Desktop\\1.txt";RandomAccessFile reader = new RandomAccessFile(file, "r");FileChannel channel = reader.getChannel();int bufferSize = 1024;if (bufferSize > channel.size()) {bufferSize = (int) channel.size();}//}ByteBuffer buff = ByteBuffer.allocate(bufferSize);channel.read(buff);buff.flip();expected_value = new String(buff.array());//assertEquals(expected_value, new String(buff.array()));channel.close();reader.close();System.out.printf("\n====" + expected_value);}
}
10.读取utf-8编码的文件
@Test
public void whenReadUTFEncodedFile()throws IOException {String expected_value = "你好,世界!";String file = "src/test/resources/fileTestUtf8.txt";BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));String currentLine = reader.readLine();reader.close();assertEquals(expected_value, currentLine);
}package com.pl;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;public class ccs_2 {public static void main(String[] args) throws IOException {
// File file = new File("C:\\Program Files");
//
// //System.out.println(file.list());
// String[] A = file.list();
// for (int i = 0; i < A.length; i++) {
// System.out.printf("\n=====" + A[i]);
// }String expected_value = "你好,世界!";String file = "C:\\Users\\Administrator\\Desktop\\1.txt";BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));String currentLine = reader.readLine();reader.close();System.out.printf("\n====" + currentLine);}
}
11.从URL读取数据
@Test
public void readFromURL() throws IOException {URL urlObject = new URL("https://www.baidu.com");URLConnection urlConnection = urlObject.openConnection();InputStream inputStream = urlConnection.getInputStream();String data = readFromInputStream(inputStream);
}
12.从jar包中读取文件
我们的目标是读取junit-4.12.jar包中的LICENSE-junit.txt文件。clazz只需要这个Jar中的类就行。
@Test
public void readFromJar() throws IOException {String expectedData = "Eclipse Public License";Class clazz = Test.class;InputStream inputStream = clazz.getResourceAsStream("/LICENSE-junit.txt");String data = readFromInputStream(inputStream);Assert.assertThat(data, containsString(expectedData));
}
相关文章:
Java读取文件的N种方法
1.概述 在这篇文章里, 我们将探索不同的方式从文件中读取数据。 首先, 学习通过标准的的Java类,从classpath、URL或者Jar中加载文件。 然后,学习通用BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInput…...

子类的构造与析构过程
一、简介 父类,也称基类,其构造方法和析构方法不能被继承; 子类,也称派生类,继承父类的方法和属性,但要加入新的构造和析构函数。 二、构造与析构过程 构造:先调用父类——>再调用子类 析构&…...
位运算相关笔记
位运算 Part 1:基础 左移:左移一位,相当于某数乘以 2 2 2。左移 x x x位,相当于该数乘以 2 x 2^x 2x。 右移:右移一位,相当于某数除以 2 2 2。右移 x x x位,相当于该数除以 2 x 2^x 2x。 与运算&…...

uniapp 安装 u-view 组件库
u-view 组件库安装教程:https://uviewui.com/components/install.html 注:以下使用 HBuilderx 安装 u-view 2.0 版本,不适用于其它版本。 1.安装 u-view 组件库 2、注册并登录 HBuilderx 账号,点击下载 u-view 组件库。 3、点击…...
Go 语言的成功案例:谁在使用 Go?
Go 语言,也被称为 Golang,是一门由Google开发的开源编程语言。自从2009年首次亮相以来,它在编程社区中崭露头角,并吸引了越来越多的开发者和组织。Go 以其高效的并发性、出色的性能和简单易懂的语法而闻名。在本文中,我…...

UG\NX二次开发 实时查看 NX 日志文件
文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 a18037198459 订阅本专栏,非常感谢。 简介 实时查看 NX 日志文件,有助于分析保存时间等。打开WindowsPowerShell并实时获取日志文件内容的小功能。 效果 代…...

ZooKeeper+HBase分布式集群环境搭建
安装版本:hadoop-2.10.1、zookeeper-3.4.12、hbase-2.3.1 一、zookeeper集群搭建与配置 1.下载zookeeper安装包 2.解压移动zookeeper 3.修改配置文件(创建文件夹) 4.进入conf/ 5.修改zoo.cfg文件 6.进入/usr/local/zookeeper-3.4.12/zkdata…...

喜讯!持安科技入选2023年北京市知识产权试点单位!
近日,北京市知识产权局发布了“2023年度北京市知识产权试点示范单位及2020年度北京市知识产权试点示范单位复审通过名单”名单。 经过严格的初审、形式审核和专家评审,北京持安科技有限公司入选“2023年北京市知识产权试点单位”。 北京市知识产权试点示…...
笙默考试管理系统-MyExamTest----codemirror(39)
笙默考试管理系统-MyExamTest----codemirror(39) 目录 一、 笙默考试管理系统-MyExamTest 二、 笙默考试管理系统-MyExamTest 三、 笙默考试管理系统-MyExamTest 四、 笙默考试管理系统-MyExamTest 五、 笙默考试管理系统-MyExamTest 笙默考试…...

抛砖引玉:Redis 与 接口自动化测试框架的结合
接口自动化测试已成为保证软件质量和稳定性的重要手段。而Redis作为一个高性能的缓存数据库,具备快速读写、多种数据结构等特点,为接口自动化测试提供了强大的支持。勇哥这里粗略介绍如何结合Python操作Redis,并将其应用于接口自动化测试框架…...

网站如何才能不被黑,如何做好网络安全
当企业网站受到攻击时,首页文件可能被篡改,百度快照也可能被劫持并重定向到其他网站。首要任务是加强网站的安全防护。然而,许多企业缺乏建立完善的网站安全防护体系的知识。因此,需要专业的网站安全公司来提供相应的保护措施。今…...

人脸写真FaceChain风格写真的试玩(二)
接着上一篇【人脸写真FaceChain的简单部署记录(一)】来试玩一下。 1 无限风格写真 参考:让你拥有专属且万能的AI摄影师AI修图师——FaceChain迎来最大版本更新 1.1 人物形象训练 这里的步骤比较简单,就是选择照片,然…...

PHP 变量
变量 变量的声明、使用、释放 变量定义 形式 $ 变量名;严格区分大小写 $name; $Name; $NAME //三个变量不是同一个变量字母、数字、下划线组成,不能以数字开头,不能包含其他字符(空白字符、特殊字符) 驼峰式命名法、下划线式命名法 $first_name; $fi…...
牛客小白月赛79
给定一个数字n,你可以对它进行接下来的操作—— 选择数字中任意一个数位删除 例如对1024选择操作百位,数字则变成了124;对1024选择操作千位,数字则变成了024 我们称一个数字是干净的,当且仅当数字满足以下任意一种…...

面试算法31:最近最少使用缓存
题目 请设计实现一个最近最少使用(Least Recently Used,LRU)缓存,要求如下两个操作的时间复杂度都是O(1)。 get(key):如果缓存中存在键key,则返回它对应的值…...

如何处理前端SEO(搜索引擎优化)?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

Leetcode—2529.正整数和负整数的最大计数【简单】
2023每日刷题(四) Leetcode—2529.正整数和负整数的最大计数 遍历法实现代码 int maximumCount(int* nums, int numsSize){int i;int neg 0, pos 0;for(i 0; i < numsSize; i) {if(nums[i] < 0) {neg;}if(nums[i] > 0) {pos;}}return (neg…...

数据结构-- 并查集
0. 引入 并查集是来解决等价问题的数据结构。 离散数学中的二元关系。 等价关系需满足自反性、对称性、传递性。 a ∈ S , a R a a R b & b R a a R b ∩ b R c > a R c a \in S, aRa \\ aRb \& bRa \\ aRb \cap bRc >aRc a∈S,aRaaRb&bRaaRb∩bRc>a…...

优维产品最佳实践第12期:IT资源管理首页丰富
背 景 当我们进入平台后,默认跳转至IT资源管理首页,因此该页面的优化与丰富将极大的提高平台使用者的体验和效率。优化后的首页可以更好地展示常用模型、小产品、外部系统、以及保存的所有关系查询和快速查询条件,使用户能够更快捷、方便…...

【Nginx34】Nginx学习:安全链接、范围分片以及请求分流模块
Nginx学习:安全链接、范围分片以及请求分流模块 又迎来新的模块了,今天的内容不多,但我们都进行了详细的测试,所以可能看起来会多一点哦。这三个模块之前也从来都没用过,但是通过学习之后发现,貌似还都挺有…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...