Java:如何在不使字符串池膨胀的情况下读取文件?

Java:如何在不使字符串池膨胀的情况下读取文件?,java,garbage-collection,jvm,string-pool,Java,Garbage Collection,Jvm,String Pool,请查看以下代码段: public static void main(String[] args) { BufferedReader reader; try { reader = new BufferedReader(new FileReader( "myfile.txt")); String line = reader.readLine(); while

请查看以下代码段:

public static void main(String[] args) {
        BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader(
                    "myfile.txt"));
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                // read next line
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
如您所见,文件的每一行都被读取并存储在“line”变量中。
因为“line”是string类型,所以它的内容存储在字符串池中。 存储在字符串池中的字符串不会被Java垃圾回收器收集,并在程序的整个生命周期中一直保留在那里


如果文件很大,字符串池可能会膨胀。您知道如何读取文件而不将其所有行存储在字符串池中吗?我只是将文件行存储为任意对象,这意味着在不需要时它将从堆中删除

默认情况下,只有字符串文本存储在SpringPool中,除非调用string对象的.interm()方法


在上面的示例中,变量“line”是一个string对象,不是StringPool的一部分。您使用了字符串文字“myfile.txt”,它将成为StringPool的一部分

您是否分析了代码以记录字符串池“膨胀”导致的问题?如果不是,这不是可能的过早优化吗?注意——我从未听说过字符串池“膨胀”。你有关于这个问题的参考资料的链接吗?@azurefrog或
String
(s)可以明确地告诉你。OP应该使用(但是显式的
reader.close()
让我很困扰)。“因为'line'是string类型,它的内容存储在字符串池中”这是完全错误的。字符串不会存储在字符串池中,除非它们是编译时常量,或者对它们调用
intern
。@HovercraftFullOfEels在过去,字符串池确实存在两个问题。首先,曾经有一段时间,所有池字符串都放在固定大小的PermGen中,这随着Java7的改变而改变(自从Java8以来,甚至不再有PermGen)。此外,池是一个固定大小的哈希表,过度使用会导致许多冲突,但在Java7Update40中,它从1009更改为60013(不是开玩笑),这减轻了影响。但即使在旧版本中,
intern()
也不能阻止垃圾收集,因此在其中放入临时字符串只会降低代码的速度。