在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中不使用循环读取完整文件的主要内容,如果未能解决你的问题,请参考以下文章