Java读取文件方式

news/2025/1/16 1:42:53/

IO流读取

文本内容

 

按行读取文件内容

指定编码格式(推荐)

 public static void main(String[] args) throws UnsupportedEncodingException {read("D:\\test.txt");}public static void read(String path) {BufferedReader reader = null;try {reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}}

 注意,如果控制台输出为乱码,需要度idea进行配置,依次选择file-Setting-editor-File Encoding

 不指定编码格式

 public static void main(String[] args) throws IOException {read("D:\\test.txt");}public static void read(String path) throws IOException {BufferedReader reader = new BufferedReader(new FileReader(path));String line;while ((line = reader.readLine()) != null){System.out.println(line);}reader.close();}

可能出现乱码。

按字符读取文件内容

 public static void read(String path) throws IOException {Reader reader = new InputStreamReader(new FileInputStream(path));int tempchar;while ((tempchar = reader.read()) != -1) {System.out.print((char) tempchar);}reader.close();}

按字节读取文件内容

常用于读取图片,声音,影像等

单字节读取

 public static void read(String path) throws IOException {FileInputStream reader = new FileInputStream(path);int tempchar;while ((tempchar = reader.read()) != -1) {System.out.print((char) tempchar);}reader.close();}

多字节读取

 public static void read(String path) throws IOException {FileInputStream reader = new FileInputStream(path);byte[] tempByte = new byte[1024];int len = 0 ;while((len = reader.read(tempByte))!= -1){for (int i = 0; i <len; i++) {System.out.print((char)tempByte[i]);}}reader.close();}

Scanner

第一种方式是Scanner,从JDK1.5开始提供的API,特点是可以按行读取、按分割符去读取文件数据,既可以读取String类型,也可以读取Int类型、Long类型等基础数据类型的数据。

  public static void read(String path) throws IOException {try (Scanner sc = new Scanner(new FileReader(path))) {while (sc.hasNextLine()) {  //按行读取字符串String line = sc.nextLine();System.out.println(line);}}}

JDK1.7提供的NIO读取文件

小文件

 public static void read(String path) throws IOException {final String CHARSET_NAME = "UTF-8";List<String> content = new ArrayList<>(0);try {content = Files.readAllLines(Paths.get(path), Charset.forName(CHARSET_NAME));} catch (Exception e) {e.printStackTrace();}content.forEach(System.out::println);}

大文件

 public static void read(String path) throws IOException {final String CHARSET_NAME = "UTF-8";List<String> content = new ArrayList<>(0);try (BufferedReader br = Files.newBufferedReader(Paths.get(path), Charset.forName(CHARSET_NAME))) {String line;while ((line = br.readLine()) != null) {content.add(line);}} catch (Exception e) {e.printStackTrace();}content.forEach(System.out::println);}

JDK1.4提供的NIO读取文件(适用于超大文件)

public static void read(String path) throws IOException {final String CHARSET_NAME = "UTF-8";final int ASCII_LF = 10; // 换行符final int ASCII_CR = 13; // 回车符List<String> content = new ArrayList<>();try (FileChannel fileChannel = new RandomAccessFile(path, "r").getChannel()) {ByteBuffer byteBuffer = ByteBuffer.allocate(1024 * 100);byte[] lineByte;byte[] temp = new byte[0];while (fileChannel.read(byteBuffer) != -1) {// 获取缓冲区位置,即读取长度int readSize = byteBuffer.position();// 将读取位置置0,并将读取位置标为废弃byteBuffer.rewind();// 读取内容byte[] readByte = new byte[readSize];byteBuffer.get(readByte);// 清除缓存区byteBuffer.clear();// 读取内容是否包含一整行boolean hasLF = false;int startNum = 0;for (int i = 0; i < readSize; i++) {if (readByte[i] == ASCII_LF) {hasLF = true;int tempNum = temp.length;int lineNum = i - startNum;// 数组大小已经去掉换行符lineByte = new byte[tempNum + lineNum];System.arraycopy(temp, 0, lineByte, 0, tempNum);temp = new byte[0];System.arraycopy(readByte, startNum, lineByte, tempNum, lineNum);String line = new String(lineByte, 0, lineByte.length, CHARSET_NAME);content.add(line);// 过滤回车符和换行符if (i + 1 < readSize && readByte[i + 1] == ASCII_CR) {startNum = i + 2;} else {startNum = i + 1;}}}if (hasLF) {temp = new byte[readByte.length - startNum];System.arraycopy(readByte, startNum, temp, 0, temp.length);} else {// 单次读取的内容不足一行的情况byte[] toTemp = new byte[temp.length + readByte.length];System.arraycopy(temp, 0, toTemp, 0, temp.length);System.arraycopy(readByte, 0, toTemp, temp.length, readByte.length);temp = toTemp;}}// 最后一行if (temp.length > 0) {String lastLine = new String(temp, 0, temp.length, CHARSET_NAME);content.add(lastLine);}} catch (Exception e) {e.printStackTrace();}content.forEach(System.out::println);}

 JDK1.7 Files.readAllBytes

 public static void read(String path) throws IOException {byte[] bytes = Files.readAllBytes(Paths.get(path));String content = new String(bytes, StandardCharsets.UTF_8);System.out.println(content);}

 JDK1.8 Stream流

可能会出现内存溢出问题 java.lang.OutOfMemoryError

Files.lines

public static void read(String path) throws IOException {// 读取文件内容到Stream流中,按行读取Stream<String> lines = Files.lines(Paths.get(path));// 随机行顺序进行数据处理lines.forEach(System.out::println);}

forEach获取Stream流中的行数据不能保证顺序,但速度快。如果你想按顺序去处理文件中的行数据,可以使用forEachOrdered,但处理效率会下降。


lines.forEachOrdered(System.out::println);

或者利用CPU多和的能力,进行数据的并行处理parallel(),适合比较大的文件


lines.parallel().forEachOrdered(System.out::println);

Files.readAllLines

public static void read(String path) throws IOException {// 读取文件内容到Stream流中,按行读取List<String> lines =  Files.readAllLines(Paths.get(path),StandardCharsets.UTF_8);// 随机行顺序进行数据处理lines.forEach(System.out::println);
}

 JDK 11 Files.readString()

文件不能超过2G,同时要注意你的服务器及JVM内存。这种方法适合快速读取小文本文件。

     System.out.println(Files.readString(Paths.get(path))); 

依赖hutool

IoUtil工具类

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId><version>5.8.10</version>
</dependency>或者:
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.10</version>
</dependency>
 public static void read(String path) throws IOException {final String CHARSET_NAME = "UTF-8";List<String> content = new ArrayList<>();try {IoUtil.readLines(new FileInputStream(path), CharsetUtil.charset(CHARSET_NAME), content);} catch (Exception e) {e.printStackTrace();}content.forEach(System.out::println);}

 FileUtil工具类

public static void fileOfHutool() {final String CHARSET_NAME = "UTF-8";List<String> content = FileUtil.readLines(path, CHARSET_NAME);content.forEach(System.out::println);}

依赖cmmons-io

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version>
</dependency>

FileUtils工具类

    public static void read(String path) throws IOException {final String CHARSET_NAME = "UTF-8";List<String> content = new ArrayList<>(0);try {content = FileUtils.readLines(new File(fileName), CHARSET_NAME);} catch (Exception e) {e.printStackTrace();}content.forEach(System.out::println);}

IOUtils工具类

public static void read(String path) throws IOException {final String CHARSET_NAME = "UTF-8";List<String> content = new ArrayList<>(0);try {content = IOUtils.readLines(new FileInputStream(fileName), CHARSET_NAME);} catch (Exception e) {e.printStackTrace();}content.forEach(System.out::println);}


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

相关文章

DNS服务器 - 理论

DNS服务器 1. 概念2. DNS域名结构3. 域名的分级4. 域名服务器4.1 层次结构4.2 DNS服务类型 5. 域名解析过程5.1 递归查询与迭代查询5.2 解析流程1. 迭代查询2. 递归查询 6. 高速缓存7. 加上主机缓存后的DNS解析流程8. 常见的域名解析记录9. DNS正向解析和反向解析10. 配置文件介…

Ubuntu上跑通PaddleOCR

书接上文。刚才说到我已经在NUC8里灌上了Windows Server 2019。接下来也顺利的启用了Hyper-V角色并装好了一台Ubuntu 22.04 LTS 的虚机。由于自从上回在树莓派上跑通了Paddle-Lite-Demo之后想再研究一下PaddleOCR但进展不顺&#xff0c;因此决定先不折腾了&#xff0c;还是从x6…

vs = VirtualService

VirtualService 您是正确的。我混淆了Kubernetes中的资源类型。"vs"是Istio服务网格中的资源类型&#xff0c;代表Virtual Service&#xff08;虚拟服务&#xff09;。 Virtual Service是Istio中的一种路由规则&#xff0c;它定义了如何将请求路由到服务的不同版本…

2023年 中国制造业这三大趋势不可忽视

政府要掏1个亿奖励制造企业搞发展&#xff0c;我国制造业大翻身的时代来了吗&#xff1f; 4月12日成都日报电&#xff0c;为支持制造业创新发展&#xff0c;支持制造业数字化、智能化和绿色化转型升级&#xff0c;培育高精尖特企业&#xff0c;政府给扶持政策不说&#xff0c;…

如何快速查找下载外文文献,哪个文献下载网站好用

​​如何高效获取到自己需要的外文文献&#xff0c;最好的办法就是去文献来源数据库中查找&#xff0c;你需要的文献来源数据库有可能是Elsevier&#xff08;sciencedirect&#xff09;、也可能是Wiley Online Library、也有可能是IEEE等等&#xff0c;外文数据库机构太多了。这…

C语言入门篇——数据篇

目录 1、变量与常量 1.1变量 1.2常量 1.2.1#define 定义的标识符常量 1.2.2枚举常量 2、数据类型关键字 3、整数 4、浮点数 5、基本数据类型 5.1、int型数据 5.2、char型数据 5.3、_Bool类型 5.4、float、double和long double 5.5、复数和虚数类型 6、总结 1、变…

Springboot基础学习之(二十三):实现定时任务

定时任务&#xff1a;在开发过程中是经常能够使用到的&#xff1a;定时发布邮件等等 先了解一下什么时cron表达式&#xff1f; 它是定义执行任务时间的一种时间表达式&#xff0c;使用方法 Scheduled(cron "0/2 * * * * ? ")&#xff0c;这里代码的含义是每两秒执行…

Linux 内核原理摘录

文章目录 一、Linux 内核设计与实现1、进程管理&#xff08;1&#xff09;调度2、内核数据结构&#xff08;1&#xff09;kfifo 3、中断 一、Linux 内核设计与实现 本章主要用来摘录《Linux 内核设计与实现》一书中学习知识点&#xff0c;其基于 Linux 2.6.34 。 1、进程管理 …