好问题
Good  Question
  • 首 页
  • 问题
    • PHP
    • JAVA
    • CPlusPlus
    • C#
    • SQL
  • 关 于
  • 联 系
在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 。这种方法是“有损”的,因为每行末尾的换行符不会读取。
List lines = 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的实用程序安全地简化了代码,旧版本中,使用映射字节缓冲区防止了被读取的文件,在映射缓冲区被垃圾回收之前删除。你可以通过此答案上的“已编辑”链接查看旧版本。
上一篇如何将堆栈跟踪转换为字符串?
JavaBean到底是什么下一篇
下一篇JavaBean到底是什么

最新文章

  • 函数`__construct`用来干嘛的
    发布日期:2018-03-26
  • 通过访客的IP得到他们的地区
    发布日期:2018-03-26
  • 合并两个PHP对象的最好的方法是什么?
    发布日期:2018-03-26
  • 该如何把一该如何把一个对象转化成数组?
    发布日期:2018-03-26
  • 什么是输出缓冲区?
    发布日期:2018-03-26
  • 在PHP中怎么把用逗号分隔的字符串分隔在一个数组里?
    发布日期:2018-03-26
  • 在PHP中使用foreach循环时查找数组的最后一个元素
    发布日期:2018-03-26
关于好问
收集整理一些有用的问题和回答,造福中国的程序旺和IT喵们!
友情链接
起飞页 
相关信息
版权声明
Copyright © 2016 - 2022  苏州卡达网络科技有限公司 备案号:苏ICP备09008221号