1

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

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

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

3 回答 3

4

您的代码有几个问题:

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

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

于 2012-02-18T10:10:39.713 回答
1

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

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

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

于 2012-02-18T10:10:20.280 回答
1

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

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

rest_logger = writer;

也许你应该调查一下...

于 2012-02-18T10:14:44.203 回答