Где утечка в моем коде Java 7? Это ложный положительный результат? (Использование FileChannel для записи 771kb ByteBuffer (fileFinal) - PullRequest
0 голосов
/ 19 октября 2019

Я пишу Java 7-совместимую программу в Eclipse, и часть написанного мной кода говорит о утечке памяти. Вот мой код:

FileChannel output1 = 
    -->new FileOutputStream(System.getProperty("user.home")+"\\Desktop\\file\\output\\data.bin")<--
    .getChannel();
output1.write(fileFinal);
output1.close();
FileChannel output2 =
    -->new FileOutputStream(System.getProperty("user.home")+"\\Desktop\\file\\output\\data0.bin")<--
    .getChannel();
output2.write(fileFinal);
output2.close();
FileChannel output3 =
    -->new FileOutputStream(System.getProperty("user.home")+"\\Desktop\\file\\output\\data1.bin")<--
    .getChannel();
output3.write(fileFinal);
output3.close();
FileChannel output4 =
    -->new FileOutputStream(System.getProperty("user.home")+"\\Desktop\\file\\output\\data2.bin")<--
    .getChannel();
output4.write(fileFinal);
output4.close();

Части между стрелками дают мне ошибку («Утечка ресурса:« (opencaret) unassigned Closeable value (closecaret) 'никогда не закрывается »). Обратите внимание, как я закрываю data.bin (output1) и data0.bin через data2.bin (output2 через output4) сразу после их записи. Что здесь происходит? Это ложный положительный результат или есть что-то более техническое в игре?

Примечание. Я заменил каретки в ошибке на (opencaret) и (closecaret), потому что редактор сообщений считает, что это HTML, и не будетпоказать каретки или их содержимое. Я могу понять, почему вы, ребята, для начала блокировали HTML (внедрение вредоносного кода), но должен быть более элегантный способ его обнаружения, не блокирующий ничего между каретками.

Я запускаю eclipse 2019-06 (4.12.0) в Windows 10 Pro с установленными JDK 1.8.0_221 и JRE 1.8.0_221, и в проекте используется соответствие компилятора Java 1.7 (для совместимости со старыми установками Java, поскольку некоторые системы, которые запускают это, могут толькозапускать .jars как апплеты в браузере, и большинство браузеров отключили поддержку плагинов NPAPI и, таким образом, предотвратили обновления плагинов для Java-браузеров.)Это рабочий код:

            try (FileOutputStream fos1 = new FileOutputStream(System.getProperty("user.home")+"\\Desktop\\file\\output\\data.bin");
                FileChannel output1 = fos1.getChannel())
            {
                output1.write(fileFinal);
                output1.close();
            }
            catch (IOException i)
            {
            }
            fileFinal.position(0);
            try (FileOutputStream fos2 = new FileOutputStream(System.getProperty("user.home")+"\\Desktop\\file\\output\\data0.bin");
                FileChannel output2 = fos2.getChannel())
            {
                output2.write(fileFinal);
                output2.close();
            }
            catch (IOException j)
            {
            }
            fileFinal.position(0);
            try (FileOutputStream fos3 = new FileOutputStream(System.getProperty("user.home")+"\\Desktop\\file\\output\\data1.bin");
                FileChannel output3 = fos3.getChannel())
            {
                output3.write(fileFinal);
                output3.close();
            }
            catch (IOException k)
            {
            }
            fileFinal.position(0);
            try (FileOutputStream fos4 = new FileOutputStream(System.getProperty("user.home")+"\\Desktop\\file\\output\\data2.bin");
                FileChannel output4 = fos4.getChannel())
            {
                output4.write(fileFinal);
                output4.close();
            }
            catch (IOException l)
            {
            }

Спасибо @holger за исправление.

1 Ответ

0 голосов
/ 19 октября 2019

Пока вы думали о нормальном случае, вам также нужно беспокоиться о том, что происходит, когда возникает исключение при записи содержимого файла

Можно открыть файл без ошибок, а затем во время записи получить "ioException: недостаточно места на диске "

Для обработки закрытия в этих ситуациях лучше всего использовать попытку с ресурсами:

try (FileChannel output1 = new FileOutputStream(System.getProperty("user.home")+"\\Desktop\\file\\output\\data0.bin") .getChannel()) {
     output2.write(fileFinal);
}
...