我已经使用下面的成语一段时间了。它似乎是最普遍的,至少在我访问过的网站上是这样。
有没有更好/不同的方法在 Java 中将文件读入字符串?
private String readFile(String file) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader (file));
String line = null;
StringBuilder stringBuilder = new StringBuilder();
String ls = System.getProperty("line.separator");
try {
while((line = reader.readLine()) != null) {
stringBuilder.append(line);
stringBuilder.append(ls);
}
return stringBuilder.toString();
} finally {
reader.close();
}
}
网友回答:
如果您愿意使用外部库,请查看Apache Commons IO(200KB JAR)。它包含一个方法,允许您用一行代码将整个读入 a。org.apache.commons.io.FileUtils.readFileToString()
File
String
例:
import java.io.*;
import java.nio.charset.*;
import org.apache.commons.io.*;
public String readFile() throws IOException {
File file = new File("data.txt");
return FileUtils.readFileToString(file, StandardCharsets.UTF_8);
}
网友回答:
Java 11 添加了 readString() 方法来读取小文件作为 ,保留行终止符:String
String content = Files.readString(path, encoding);
对于 Java 7 和 11 之间的版本,这里有一个紧凑、健壮的习惯用法,包含在一个实用程序方法中:
static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
Java 7 添加了一种方便的方法,将文件读取为文本行,表示为 .这种方法是“有损的”,因为行分隔符是从每行的末尾剥离的。List<String>
List<String> lines = Files.readAllLines(Paths.get(path), encoding);
Java 8 添加了生成 .同样,此方法是有损的,因为行分隔符被剥离了。如果在读取文件时遇到 ,则会将其包装在 中,因为不接受引发检查异常的 lambda。Files.lines()
Stream<String>
IOException
UncheckedIOException
Stream
try (Stream<String> lines = Files.lines(path, encoding)) {
lines.forEach(System.out::println);
}
这确实需要打电话;这在 API 上的记录很差,我怀疑很多人甚至没有注意到有一个方法。请务必使用 ARM 块,如图所示。Stream
close()
Stream
close()
如果要处理文件以外的源,则可以改用 中的方法。lines()
BufferedReader
如果文件相对于可用内存足够小,则一次读取整个文件可能工作正常。但是,如果您的文件太大,一次读取一行,处理它,然后在继续下一行之前丢弃它可能是更好的方法。以这种方式进行流处理可以消除总文件大小作为内存要求的一个因素。
原始帖子中的示例缺少的一件事是字符编码。这种编码通常无法从文件本身确定,并且需要元数据(如 HTTP 标头)来传达此重要信息。
该类为所有 Java 运行时所需的编码定义了一些常量:StandardCharsets
String content = readFile("test.txt", StandardCharsets.UTF_8);
平台默认值可从类本身获得:Charset
String content = readFile("test.txt", Charset.defaultCharset());
在某些特殊情况下,平台默认值是您想要的,但它们很少见。您应该能够证明您的选择是合理的,因为平台默认是不可移植的。读取标准输入或写入标准输出时可能正确的一个例子。
注意:这个答案在很大程度上取代了我的Java 6版本。Java 7 的实用程序安全地简化了代码,并且使用映射字节缓冲区的旧答案阻止了读取的文件被删除,直到映射缓冲区被垃圾回收。您可以通过此答案上的“编辑”链接查看旧版本。
网友回答:
一个非常精益的解决方案,基于:Scanner
Scanner scanner = new Scanner( new File("poem.txt") );
String text = scanner.useDelimiter("\A").next();
scanner.close(); // Put this call in a finally block
或者,如果要设置字符集:
Scanner scanner = new Scanner( new File("poem.txt"), "UTF-8" );
String text = scanner.useDelimiter("\A").next();
scanner.close(); // Put this call in a finally block
或者,使用资源尝试块,这将要求您:scanner.close()
try (Scanner scanner = new Scanner( new File("poem.txt"), "UTF-8" )) {
String text = scanner.useDelimiter("\A").next();
}
请记住,构造函数可以抛出 .并且不要忘记导入和.Scanner
IOException
java.io
java.util
来源:帕特·尼迈耶的博客
模板简介:该模板名称为【有没有更好/不同的方法在 Java 中将文件读入字符串?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。