发布日期:2018-03-26
在java中如何通过读取文件内容来创建string对象?+ 查看更多
在java中如何通过读取文件内容来创建string对象?
+ 查看更多
发布日期:2018-03-10 13:54
分类:JAVA
浏览次数:137
我使用下面的写法有一段时间了。至少在我访问过的网站,它似乎是最广泛的写法。有没有更好的/不同的方式将文件内容读取到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(); } }
回答
从文件中读取所有内容
java 7中有一种非常简洁、健壮的写法,封装在一个实用的方法里
static String readFile(String path, Charset encoding) throws IOException { byte[] encoded = Files.readAllBytes(Paths.get(path)); return new String(encoded, encoding); }一次读取一行内容
Java 7添加了一个方便的方法来将文件读取为文本行,使用List
Listlines = Files.readAllLines(Paths.get(path), encoding);
内存利用率
第一种方法,也就是保留换行符的那种方法,要求内存的大小是文件大小的数倍。因为在短时间内原始文件内容(字节数组)和解码字符(每个都是16位,即使在文件里编码为8位)同时驻留在内存中。因此,将它应用于那些文件大小相对于可用内存大小较小的文件是最为安全的。
第二种方法,也就是读取行的那种方法,通常有更高效的内存使用。因为用于解码的输入字节缓冲区不需要包含整个文件。但是,它不适合用于文件大小相对于可用内存非常大的文件。
对于读取大文件,你需要重新设计你的程序,设计成能够从流中读取一块文本,处理它,然后移动到下一块文本,重用相同的固定大小的内存块。这里,“大”取决于计算机规格。现在,这个阈值可能是几千兆字节的RAM。
字符编码
在原始回答的实例中我并没有提到字符编码的问题。在一些特殊的情况下平台默认的就是你想要的,但这毕竟是少数情况,更多的你应该要确定你的选择是正确的。
StandardCharsets类为所有Java运行时所需的编码定义了一些常量:
String content = readFile("test.txt", StandardCharsets.UTF_8);平台默认值可以从Charset类获得:
String content = readFile("test.txt", Charset.defaultCharset());注意:这个答案在很大程度上取代了我的Java 6版本。 Java 7的实用程序安全地简化了代码,旧版本中,使用映射字节缓冲区防止了被读取的文件,在映射缓冲区被垃圾回收之前删除。你可以通过此答案上的“已编辑”链接查看旧版本。