Могу ли я использовать try-with-resources с уже созданным InputStream? - PullRequest
0 голосов
/ 20 ноября 2018

Вот так:

public void myMethod(InputStream fileIn){
    try (InputStream in = fileIn)  {
        do stuff....
    }
}

Кажется, работает.Это безопасно?

1 Ответ

0 голосов
/ 20 ноября 2018

Кажется, что работает

Это сработает, если вы добавите InputStream (или некоторый супертип InputStream) до in: спецификация языка требует Вы можете либо объявить переменную для каждого ресурса.

try (InputStream in = fileIn) { ... }

, либо просто обратиться непосредственно к fileIn, в Java 9 +:

try (fileIn) { ... }

И нет причин, почемуне должно работать: с формой объявления переменной вы назначаете выражение для переменной (новый класс, результат вызова метода, элемент массива и т. д.).Ресурс не может видеть, получает ли он «новый» экземпляр или нет: это просто вещь со значением правильного типа.

это безопасно?

Зависит от того, что именно вы подразумеваете под "безопасным".

Это, безусловно, безопасно в том смысле, что он будет работать без ошибок в этом коде, и in.close() будет вызываться в конце блока.

Однако, это нарушает эмпирическое правило, что «если вы не открывали поток, не закрывайте его».Таким образом, это может быть небезопасно в том смысле, что оно вызывает неожиданные сбои в других частях программы, которые ожидают, что поток все еще будет открыт после вызова метода.

...