Java BufferedWriter-在程序执行期间流过早关闭

Java BufferedWriter-在程序执行期间流过早关闭,java,io,bufferedwriter,Java,Io,Bufferedwriter,我正在开发的类中定义缓冲编写器,但有问题 在类构造函数中,我定义: public class RestHandler { public static BufferedWriter rest_logger; public RestHandler(parsedXMLConfigData _config, BufferedWriter writer) { rest_logger = writer; try { rest_logger.write("RestHandl

我正在开发的类中定义缓冲编写器,但有问题

在类构造函数中,我定义:

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_记录器时:

    @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();
}

为清晰起见,删除异常处理程序后,代码将执行以下操作:

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

你马上就要扔掉那个新的BufferedWriter了。这没有多大意义。rest_logger将设置为在该构造函数调用中移交给您的任何内容。当它关闭时,rest\u logger也将关闭。

为了清晰起见,删除异常处理程序,您的代码会:

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

你马上就要扔掉那个新的BufferedWriter了。这没有多大意义。rest_logger将设置为在该构造函数调用中移交给您的任何内容。当它关闭时,rest\u logger也将关闭。

您的代码有几个问题:

rest_logger变量不应是静态的 您不应该将它初始化为一个新的BufferedWriter,只是为了在之后丢弃它,并使用您无法控制的writer参数重新初始化它 你不应该忽略例外情况。如果您不知道如何处理它们,请让您的方法抛出IOException,并让调用方决定如何处理 您不应该使用终结器 您不应关闭尚未创建的编写器。让作者的开场白把它合上。
除此之外,由于您的代码没有多大意义,因此很难理解代码应该做什么。

您的代码有几个问题:

rest_logger变量不应是静态的 您不应该将它初始化为一个新的BufferedWriter,只是为了在之后丢弃它,并使用您无法控制的writer参数重新初始化它 你不应该忽略例外情况。如果您不知道如何处理它们,请让您的方法抛出IOException,并让调用方决定如何处理 您不应该使用终结器 您不应关闭尚未创建的编写器。让作者的开场白把它合上。
除此之外,由于您的代码没有多大意义,因此很难理解代码应该做什么。

我不太确定我是否理解您的问题,但是:

为什么要覆盖新创建的BufferedWriter

rest_logger = writer;

也许你应该调查一下…

我不太确定我是否理解你的问题,但是:

为什么要覆盖新创建的BufferedWriter

rest_logger = writer;

也许你应该调查一下…

你没有修复任何东西,你改变了它。我们无法判断您的问题是什么,我们不知道writer是什么,它来自哪里,或者何时关闭。您没有修复任何东西,而是更改了它。我们无法判断您的问题是什么,我们不知道writer是什么,它来自哪里,或者何时关闭@MichaelA-除了上面提到的所有事情之外,问题的唯一原因是将BufferedWriter设置为静态,然后在finalize方法中关闭它。请记住,finalize是一个实例级方法,在该方法中,您正在操作一个类级变量。+1@MichaelA-除了上面提到的所有事情之外,问题的唯一原因是将BufferedWriter设置为静态,然后在finalize方法中关闭它。请记住,finalize是一个实例级方法,在这个方法中,您正在操作一个类级变量。据我所知,现在您根本没有实例化BufferedWriter,而是通过构造函数传递它。它是在哪里创建的?这可能是问题的根源……好吧,如果没有任何上下文,就不可能知道你的问题在哪里。据我所知,现在您根本没有实例化BufferedWriter,而是通过构造函数传递它。它是在哪里创建的?这可能是问题的根源。。。