BufferedWriter - поток преждевременно закрыт во время выполнения программы - PullRequest
0 голосов
/ 18 февраля 2012

Я определяю буферизованного писателя в разрабатываемом классе, но у меня возникают проблемы с ним.

В конструкторе класса я определяю:

public class RestHandler  {
public static BufferedWriter rest_logger;

public RestHandler(parsedXMLConfigData _config, BufferedWriter writer) {
    rest_logger = writer;
    try {
        rest_logger.write("RestHandler instance finished init and ready to receive calls!" + "\n");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Это работает и печатаеттекст в мой файл.Но когда я пытаюсь использовать тот же rest_logger в другом методе моего класса:

    @POST
@Path("{subResources: [a-zA-Z0-9_/]+}")
public void postHandler
(
        @Context final UriInfo uriInfo,
        @PathParam("subResources") String subResources) {

    try {
        rest_logger.write("TEXT...");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

Это дает мне исключение для закрытого потока!Я должен упомянуть, что я использую это, чтобы закрыть поток:

    protected void finalize() throws Throwable {
    rest_logger.close();
}

Ответы [ 3 ]

4 голосов
/ 18 февраля 2012

Есть несколько проблем с вашим кодом:

  • переменная rest_logger не должна быть статической
  • вы не должны инициализировать ее новым BufferedWriter, просто чтобы впоследствии его сбросить и повторно инициализироватьэто с аргументом писателя (что вы не можете контролировать)
  • вы не должны игнорировать исключения.Если вы не знаете, что с ними делать, заставьте свои методы генерировать IOException и позвольте вызывающей стороне решить, что делать
  • , вам не следует использовать финализаторы
  • , вы не должны закрывать программу записи, которую выне создали.Пусть открыватель писателя закроет его.

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

1 голос
/ 18 февраля 2012

Я не совсем уверен, что понял ваш вопрос, НО:

почему именно вы перезаписываете свой недавно созданный BufferedWriter?

rest_logger = writer;

возможно, вам следует разобраться в этом ...

1 голос
/ 18 февраля 2012

Удаляя обработчики исключений для ясности, ваш код делает:

rest_logger = new BufferedWriter(new FileWriter("rest_logger.txt"));
rest_logger = writer;

Вы немедленно выбрасываете новое BufferedWriter.Это не имеет особого смысла.rest_logger будет установлено на то, что было передано вам в этом вызове конструктора.Когда это закроется, rest_logger тоже будет закрыто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...