Сохранение выходного потока открытым - PullRequest
0 голосов
/ 12 ноября 2018

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

private boolean needsFlush;

private void write(byte[] data) throws IOException {
    assert Display.getInstance().isEdt();
    out.write(data);
    if (!needsFlush) {
        needsFlush = true;
        Display.getInstance().callSerially(this::flush);
    }
}

private void flush() {
    try {
        out.flush();
        needsFlush = false;
    } catch (final IOException e) {
        throw new RuntimeException(e); // UGLY!
    }
}

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

  • Это нормально?Есть ли лучший способ обработки очистки потока?
  • Правильно ли они закрываются после завершения работы приложения?
  • Нужно ли добавлять код закрытия потока в stop() "main"класс?
  • Или только на destroy()?
  • А как насчет уродливой попытки-ловли?

1 Ответ

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

Я бы предложил закрыть поток вывода на stop() и снова открыть его на start(). Обратите внимание, что если поток указывает на FileSystemStorage, вы можете добавить к концу потока, используя CN: OutputStream os = openFileOutputStream(filePath, lengthOfFile);.

Вам нужно закрыть на stop(), так как приложение отправляется в фоновом режиме. В этом состоянии вы должны избегать открытых соединений, так как они могут быть внезапно прерваны операционной системой. Все приложение может быть убито из-за своенравного потока.

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

...