Как правильно реализовать InputStream.mark (), когда mark не поддерживается - PullRequest
0 голосов
/ 30 января 2019

Это вопрос о правильной реализации интерфейса Java InputStream.

У меня есть реализация, которая не поддерживает функциональность пометки / сброса.Поэтому он возвращает false из метода markSupported.Как мне реализовать метод mark в этом случае?То есть, если кто-то звонит mark, несмотря на то, что ему сказали, что отметка не поддерживается, как это сделать?

Два очевидных варианта: (а) игнорировать ее и ничего не делать;или (б) бросить UnsupportedOperationException.API JavaDocs не предлагает никаких руководств, которые предпочтительнее.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Похоже, что типичные реализации в JDK ничего не делают и выдают IOException, если вызывается reset:

java.util.zip.InflaterInputStream:

public synchronized void mark(int readlimit) {
}

public synchronized void reset() throws IOException {
    throw new IOException("mark/reset not supported");
}

java.io.PushbackInputStream:

public synchronized void mark(int readlimit) {
}

public synchronized void reset() throws IOException {
    throw new IOException("mark/reset not supported");
}
0 голосов
/ 30 января 2019

Я бы предложил сделать то же самое, что и класс InputStream, то есть

  • mark(): ничего не делать, как указано в javadoc "Метод метки InputStream ничего не делает".
  • reset(): выдать исключение ввода-вывода, как указано в javadoc "Сброс метода для класса InputStream ничего не делает, кроме выброса IOException."

Ссылка Javadoc: https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html

...