在java中不使用循环读取完整文件

Posted

技术标签:

【中文标题】在java中不使用循环读取完整文件【英文标题】:read complete file without using loop in java 【发布时间】:2012-12-19 15:07:59 【问题描述】:

可能重复:How to create a Java String from the contents of a fileWhole text file to a String in Java

我正在尝试使用 FileReader 读取文件的内容。但我想在不逐行读取的情况下读取文件。是否可以在没有循环的情况下读取整个文件。 我正在使用以下代码

 try
 
     File ff=new File("abc.txt");
     FileReader fr=new FileReader(ff);

     String s;
     while(br.read()!=-1)
     
          s=br.readLine();
     
 

 catch(Exception ex)
 
     ex.printStackTrace();
 

【问题讨论】:

此代码一开始无法编译。 有一个 Java 11 的单行解决方案:***.com/a/52301018/942774 【参考方案1】:

Java 7 单行解决方案

List<String> lines = Files.readAllLines(Paths.get("file"), StandardCharsets.UTF_8);

 String text = new String(Files.readAllBytes(Paths.get("file")), StandardCharsets.UTF_8);

【讨论】:

无法在 android 中找到该文件。 并非所有 Java 答案都必须适合 Android,@akauppi!只需从另一个答案中寻找 Android 支持的解决方案! String text = Files.readString(Paths.get("file")); 甚至更短,假设您想要一个 UTF-8 字符串输出。 如果你已经有了File对象,你可以在readAllBytes里面做file.toPath() 对 Android 很重要:Call requires API level 26: java.nio.file.Files#readAllBytes - readString 也是如此。【参考方案2】:

如果文件,你可以一次读取整个数据:

File file = new File("a.txt");
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();

String str = new String(data, "UTF-8");

【讨论】:

不适用于 InputStream 的 s.a. Android 资源(无长度) “小”有多小? @silver 文件的全部内容将存储在内存中。所以,避免像这样读取 5GB 文件 :-) 注意:file.length() 可能会为 /proc 下的文件返回 0。在这些情况下,这个 sn-p 将返回一个空字符串。 另外read 可能不会填满整个缓冲区。它可能适用于大多数 JRE,但 API 中无法保证。【参考方案3】:

如果您使用的是JDK5或更高版本,您可以尝试使用Scanner。

Scanner scan = new Scanner(file);  
scan.useDelimiter("\\Z");  
String content = scan.next(); 

或者你也可以使用Guava

String data = Files.toString(new File("path.txt"), Charsets.UTF8);

【讨论】:

请注意,使用后应关闭扫描仪。 String data = Files.toString(new File("path.txt"), Charsets.UTF_8);。只是一个小错字。 :-) 这段带有Scanner的代码只从文件中读取前1024个字节。看源代码。它读取缓冲区并用这个正则表达式检查它。这始终有效 - 然后它返回所有缓冲区内容。默认缓冲区大小为 1024 字节。 这是不好的方法。正确的解决方案(对于 Java 1.7 及更高版本)是Files.readAllLines()。对于旧版 JRE,FileInputStream.read() 可能是最好的。我不确定它是否可移植到所有平台(即 Ctl-Z 随处可见),并且很容易错过 Scanner.close()【参考方案4】:

如果您使用的是 Java 5/6,则可以使用 Apache Commons IO 将文件读取为字符串。 org.apache.commons.io.FileUtils 类包含多个读取文件的方法。

例如使用方法FileUtils#readFileToString:

File file = new File("abc.txt");
String content = FileUtils.readFileToString(file);

【讨论】:

这可能是使用 3rd-party 库的最简单的解决方案。 编写最少的代码;更多库要添加到项目中。 不推荐使用 FileUtils 类型的 readFileToString(File) 方法【参考方案5】:

从 Java 11 开始,您可以更简单地做到这一点:

import java.nio.file.Files;

Files.readString(Path path);
Files.readString​(Path path, Charset cs)

来源:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/Files.html#readString(java.nio.file.Path)

【讨论】:

以上是关于在java中不使用循环读取完整文件的主要内容,如果未能解决你的问题,请参考以下文章

Java 循环读取文件导致内存溢出!

java 怎么循环读取文件内容

用C#读取XML文件,怎么可以循环读取

在Eclipse环境下,用java程序怎么读取XML Schema文件?

如何使用 Qt 在 Linux 中读取文件设备?

用java的poi类读取一个excel表格的内容后再写入到一个新excel表格中的完整代码