Кажется, что работает
Это сработает, если вы добавите InputStream
(или некоторый супертип InputStream
) до in
: спецификация языка требует Вы можете либо объявить переменную для каждого ресурса.
try (InputStream in = fileIn) { ... }
, либо просто обратиться непосредственно к fileIn
, в Java 9 +:
try (fileIn) { ... }
И нет причин, почемуне должно работать: с формой объявления переменной вы назначаете выражение для переменной (новый класс, результат вызова метода, элемент массива и т. д.).Ресурс не может видеть, получает ли он «новый» экземпляр или нет: это просто вещь со значением правильного типа.
это безопасно?
Зависит от того, что именно вы подразумеваете под "безопасным".
Это, безусловно, безопасно в том смысле, что он будет работать без ошибок в этом коде, и in.close()
будет вызываться в конце блока.
Однако, это нарушает эмпирическое правило, что «если вы не открывали поток, не закрывайте его».Таким образом, это может быть небезопасно в том смысле, что оно вызывает неожиданные сбои в других частях программы, которые ожидают, что поток все еще будет открыт после вызова метода.