2012-02-18 40 views
0

我正在定義一個正在開發的類中的緩衝作者,但遇到問題。BufferedWriter - 流在程序執行過程中過早關閉

在類的構造函數我定義:

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

有幾個問題與您的代碼:

  • 的rest_logger變量不應該是靜態
  • 你不應該把它初始化爲一個新的BufferedWriter只是事後丟棄它,並與作家的說法重新初始化(你無法控制)
  • 你不應該忽略異常。如果您不知道如何處理它們,請讓您的方法拋出IOException並讓來電者決定要做什麼
  • 您不應該使用終結器
  • 您不應該關閉您尚未創建的作者。讓作者的揭幕人關閉它。

除此之外,由於代碼沒有多大意義,所以很難理解代碼應該做什麼。

+0

我修復了mycode(這是我的舊版本) – 2012-02-18 10:33:42

+2

+1。 @MichaelA - 除了JB Nizet提到的所有事情之外,導致您的問題的唯一原因是使您的BufferedWriter變爲靜態,然後在'finalize()'方法中關閉它。請記住,finalize是一個***實例***級別的方法,您可以在其中操作*** class ***級別變量。 – Perception 2012-02-18 10:43:40

1

取出異常處理程序清晰,你的代碼的作用:

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

你把自己的新BufferedWriter立即出現。這沒有多大意義。 rest_logger將被設置爲在該構造函數調用中交給你的任何內容。當它被關閉時,rest_logger也將被關閉。

+0

我固定我的代碼,但仍是同樣的問題。現在看看 – 2012-02-18 10:34:30

+0

你沒有「修復」任何東西,你改變了它。我們沒有辦法告訴你的問題是什麼,我們不知道「作家」是什麼,它來自何處,何時關閉。 – Mat 2012-02-18 10:35:54

1

我不太確定我明白你的問題,而是:

爲什麼你到底是覆蓋新創建的BufferedWriter?

rest_logger = writer; 

也許你應該考慮這樣做......

+0

我修復了我的代碼,但仍然是同樣的問題。現在看看 – 2012-02-18 10:34:18

+0

好吧,不可能在沒有任何上下文的情況下判斷問題出在哪裏。據我所知,現在你根本沒有實例化一個'BufferedWriter',而是通過構造函數傳遞它。它在哪裏創建?這可能是問題的根源...... – silflow 2012-02-18 10:46:11