Как исправить ошибку «Поток закрыт» при использовании потоков в Java - PullRequest
0 голосов
/ 17 февраля 2019

Проблема: Когда я запускаю проверку сонара (чтобы проанализировать мой код на наличие ошибок) в приведенном ниже коде, он жалуется, что FileInputStream в ClassA -> createFile () не закрыт.Я понимаю, что это утечка ресурсов и должна быть закрыта.Однако, если я использую try с ресурсами или закрываю поток в блоке finally, ClassB жалуется, что он не может прочитать поток, поскольку он был закрыт.

Как лучше всего решить эту проблему?

Блок кода:

public ClassA{
    public ClassB createFile(){
        return new ClassB(new FileInputStream(new File("filePath")), revision, .. other arguments);
    }
}

public ClassB{
    public ClassB(InputStream fileInputStream, String revision, other arguments){
        // save the arguments in class variables. Do something with stream
    }
}

1 Ответ

0 голосов
/ 17 февраля 2019

Для ресурсов (вещи, которые нужно закрыть) вы получаете три варианта:

1) Вы создаете его здесь, вы закрываете его здесь: Используйте конструкцию try-with-resources.

2) Вы передаете ресурс объекту, а затем этот объект сам по себе является закрываемым ресурсом;когда этот ресурс закрыт, он закрывает ресурс внутри него.

3) Странные вещи, не рекомендуемые, такие линтеры, как sonar, будут помечать его как проблемный, трудный для отладки и т. д.

Естественно, вы должны избегать # 3, насколько это возможно.

Здесь, похоже, у вас есть 2 возможных варианта:

  1. Сделайте ClassB реализующим AutoClosable и сделайте так, чтобыinputtream в своем методе close или

  2. вместо передачи inputtream, передайте вещь, из которой может быть получен inputtream, так что код ClassB, который его использует, может выполнить попытку-существо с ресурсамиПредположительно, вы могли бы передать объект Path или File вместо InputStream.

...