【问题标题】:BufferedWriter - Stream closed prematurely during program executionBufferedWriter - 程序执行期间流过早关闭
【发布时间】:2012-03-09 13:27:53
【问题描述】:

我在我正在开发的一个类中定义一个缓冲写入器,但遇到了问题。

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

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

【问题讨论】:

    标签: java io bufferedwriter


    【解决方案1】:

    你的代码有几个问题:

    • rest_logger 变量不应是静态的
    • 您不应该将其初始化为新的 BufferedWriter 以在之后丢弃它并使用 writer 参数(您无法控制)重新初始化它
    • 您不应忽略异常。如果您不知道如何处理它们,请让您的方法抛出 IOException 并让调用者决定如何处理
    • 你不应该使用终结器
    • 您不应关闭尚未创建的写入程序。让作家的开启者关闭它。

    除此之外,由于您的代码没有多大意义,因此很难理解代码应该做什么。

    【讨论】:

    • +1。 @MichaelA - 除了 JB Nizet 提到的所有事情之外,您的问题的一个单一原因是使您的 BufferedWriter 静态,然后在 finalize() 方法中关闭它。请记住,finalize 是一个 instance 级别的方法,您在其中操作一个 class 级别的变量。
    【解决方案2】:

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

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

    你会立即扔掉那个新的BufferedWriter。这没有多大意义。 rest_logger 将设置为在构造函数调用中交给您的任何内容。当它关闭时,rest_logger 也将关闭。

    【讨论】:

    • 你没有“修复”任何东西,你改变了它。我们无法告诉您您的问题是什么,我们不知道writer 是什么,它来自哪里,或者它什么时候关闭。
    【解决方案3】:

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

    您究竟为什么要覆盖新创建的 BufferedWriter?

    rest_logger = writer;
    

    也许你应该调查一下……

    【讨论】:

    • 好吧,如果没有任何上下文,就不可能知道您的问题出在哪里。据我所知,现在您根本没有实例化 BufferedWriter,而是通过构造函数将其传入。它是在哪里创建的?这可能是问题的根源...
    猜你喜欢
    • 2021-11-12
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多