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

可能重复:
How to create a Java String from the contents of a file
Whole 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 file io


【解决方案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)

【讨论】:

    猜你喜欢
    • 2017-03-08
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多