Java经过多次迭代,为什么会赢';字符串变量是否包含完整文件名?

Java经过多次迭代,为什么会赢';字符串变量是否包含完整文件名?,java,memory,memory-management,file-upload,memory-leaks,Java,Memory,Memory Management,File Upload,Memory Leaks,下面是我将归档文件上传到服务器的Java代码的简要概述。这几年来一直运作良好。但它通常一次只上传少量文件。现在它需要上传成百上千个。经过大量的迭代,它失败了 public class BatchUploader implements Runnable { private int processUploads() { String myFilename; try { BufferedReader input = new Buffer

下面是我将归档文件上传到服务器的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)
02/20 23:17:05.314 java.io.FileNotFoundException:/home/baz(没有这样的文件或目录):java.io.FileInputStream.open(本机方法)
java.io.FileInputStream。(FileInputStream.java:137)
java.io.FileReader.(FileReader.java:72)
bk.a(源文件:41)
bk.d(源文件:123)
aU.e(源文件:181)
aU.run(源文件:24)
run(Thread.java:679)
问题是包含文件路径的字符串(保存在字符串var myFilename中)被截断。而不是
/home/baz
is应该是
/home/bazillion/data/filename.arc

在这个循环中似乎有些东西内存不足。我不知道发生了什么事。有人能提个建议吗

在某个计数后打破while循环,然后在几分钟后恢复,会有帮助吗


雪上加霜的是,在此异常之后,要上载的文件名列表将被删除。我确信在我的代码中有一个简单的修复方法,但我不知道它是什么。我不怎么用Java工作。

我不认为这是内存管理;如果是的话,你就可以摆脱记忆错误;在任何情况下,它都不会被截断


查看
FileHelper.getFileFromFullyQualifiedName()
会很有趣,问题很可能就在那里。或者,在你的数据文件中

在一个特定的计数之后打破while循环,然后在几分钟后恢复,会有帮助吗

绝对不是。如果由我决定,我会把它定为重罪。我们必须防御性地编程:如果你认为你可能有一个bug,调试它,找到它的确切原因并修复它;不要把它藏在地毯下面,然后把它留给可怜的维护程序员,他们将在凌晨3点调试一个十年后10000倍大的代码库

如果您的错误是可复制的,那么添加一个带有字符串比较的“If”语句,并打印或记录所有变量以查看实际情况。更好的方法是使用调试器,当字符串以
/home/baz
开头时,在那里设置一个条件断点,然后逐步检查所有变量并查看发生了什么

要在抛出异常后获得可见的值,可以将其分配给字段变量(在
公共类…{
行之后定义的变量)


祝你好运!

听起来你的输入文件有问题。我会仔细验证它们。@jeremyjjbrown-我已经验证了它们。我尽可能确定输入文件没有问题。
FileHelper.getFileFromFullyQualifiedName()
是一个非常薄的包装器,它只做
File File File=new File(myFilename);
。我不应该在我的示例代码中使用包装器,因为它太薄了,这不可能是问题所在。问题也不是数据文件。但我对你建议的好主意投了赞成票。谢谢!它原来是一个竞争条件。祝贺你成功调试了竞争条件,这些都很困难!我很高兴这是怎么发生的,字符串分配是原子的,代码中没有截断。我想知道更多。可能是另一个线程在读取文件时写入了文件?哦,我现在明白了,错误堆栈来自另一个未显示的线程。顺便说一句,用fir命名类是Java命名约定st大写字母。