2016-07-04 2 views
5

Глядя на документацию Font#loadFont я наткнулся на это замечание:Почему «loadFont» не закрывает поток ввода? Должен ли я закрыть его?

Этот метод не закрывает входной поток.

К сожалению, это не объяснено и не расширилось. Поэтому мой вопрос:

  1. Возможные причины, по которым API не будет закрывать входной поток? Возможно, вы хотели бы повторно использовать поток? я в основном использовать этот метод, как это:

    Font.loadFont(getClass().getResourceAsStream("path/to/font"), 13.0); 
    

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

  2. Должен ли я сам закрыть входной поток? Должен ли я ожидать каких-либо проблем, если я не закрываю входной поток? В прошлом у меня были проблемы с загрузкой шрифта таким образом, где некоторые метки, настроенные с этим шрифтом, начали показывать квадраты, в то время как другие (на одной сцене!) Работали нормально. Может ли это быть связано с не закрытием входного потока?
+6

Это хорошее эмпирическое правило, что вы не должны закрывать поток, который вы не открыли. В этом случае метод не открывает его, поэтому он не закрывает его. Например, нет причин, по которым вы не могли бы пройти в стандартном потоке ввода: если метод закрыл поток параметров, вы были бы набиты, если бы вам нужно было открыть что-то другое после. –

+0

И нет, вы не должны закрывать его самостоятельно: используйте попытку с ресурсами. –

+1

@ AndyTurner - использование try-with-resources эквивалентно его закрытию, просто синтаксическому сахару. Я имел в виду, должен ли я быть ответственным за его закрытие, или это законно открыть его и никогда не закрывать. – Itai

ответ

1

Документация по каждому API, включающая ограниченные или внешние ресурсы (например, дескрипторы файлов или потоки), даст понять, чья ответственность заключается в том, чтобы очистить (в этом случае закрыть поток). Это иногда называют «собственностью».

В этом случае в документации указано, что метод loadFont не принимает на себя ответственность за поток. Поэтому он все еще принадлежит вам: ваша ответственность - закрыть поток.

Описание try-with-resources - лучший способ сделать это.