Java-经过多次迭代后,为什么字符串变量不会保存完整的文件名?

时间:2014-02-22 05:27:31

标签: java memory memory-management file-upload memory-leaks

以下是将存档文件上传到服务器的Java代码的简要概述。它已经工作了好几年了。但它通常一次只上传少量文件。现在它需要上传数百或数千。并且在经过大量迭代后失败。

public class BatchUploader implements Runnable {

    private int processUploads() {
        String myFilename;
        try {
            BufferedReader input = new BufferedReader(new FileReader(infile));
            try {
                while (!stopRunning && (myFilename = input.readLine()) != null) {
                    if (myFilename.trim().isEmpty()) {
                        continue;
                    }
                    myFile = FileHelper.getFileFromFullyQualifiedName(myFilename);
                    upload(myFile);
                }
            } finally {
                input.close();
                isUploading = false;
            }

        }
    }
}

上传几百到几千后,我收到如下错误:

02/20 23:17:05.314  java.io.FileNotFoundException: /home/baz (No such file or directory): java.io.FileInputStream.open(Native Method)
java.io.FileInputStream.<init>(FileInputStream.java:137)
java.io.FileReader.<init>(FileReader.java:72)
bk.a(SourceFile:41)
bk.d(SourceFile:123)
aU.e(SourceFile:181)
aU.run(SourceFile:24)
java.lang.Thread.run(Thread.java:679)

问题是包含文件路径的字符串(保存在String var myFilename中)被截断。而不是/home/baz应该是/home/bazillion/data/filename.arc

在这个循环中似乎内存不足。我不知道发生了什么事。任何人都可以提出建议吗?

在某个计数之后突然退出while循环,然后在几分钟后恢复会有帮助吗?

要添加侮辱伤害,在此异常后将删除要上载的文件名列表。我确信在我的代码中有一个简单的解决方法,但我不知道它是什么。我不太习惯用Java工作。

1 个答案:

答案 0 :(得分:2)

我认为这不是内存管理;如果是的话,你会得到OutOfMemoryError;无论如何,它不会被截断。

FileHelper.getFileFromFullyQualifiedName()会很有意思,问题很可能就在那里。或者,也许,在您的数据文件中?

  

在一定数量的计数后,是否有助于突破while循环,几分钟后重新开始恢复?

绝对不是。如果这取决于我,我会把它变成严重的重罪。我们必须采取防御性的方案:如果你认为你可能有一个bug,请调试它,找到它的确切原因并修复它;不要把它刷在地毯下面,然后把它交给那个差劲的维护程序员,他将在凌晨3点调试代码库,这是十年之后的大十倍。

如果您的错误是可重现的,请添加带有字符串比较的“if”语句,并打印或记录所有变量以查看实际发生的情况。更好的是,使用调试器,并在字符串以/home/baz开头时设置条件断点,并逐步检查所有变量并查看发生的情况。

要在抛出异常后显示值,您可以将其分配给字段变量(在public class ... {行之后定义的字段变量。

祝你好运!