簡體   English   中英

我是否需要在每個新輸入流上調用close()?

[英]do i need call close() on every new inputstream?

這是代碼。

public static void main(String[] args) throws IOException {

    FileInputStream fis = null;

    fis = new FileInputStream(new File("D:\\za180s.ser"));
    // do something
    fis = new FileInputStream(new File("D:\\za185s.ser"));
    // do something
    fis = new FileInputStream(new File("D:\\za186s.ser"));
    // do something
    fis = new FileInputStream(new File("D:\\za187s.ser"));
    // do something
    fis.close();

}

問題是:需要我在每次“做某事”之后調用fis.close()方法,或者我畢竟只是一次調用fis.close()一次。

忽略最后的close()位置和代碼是否需要try catch。

全部。

是的,您需要在每個單獨的InputStream上調用close。 代碼的問題是每次創建新流時都要重新分配變量fis 換句話說: fis不再指向舊的InputStream ,因此調用close不會關閉前一個流。

有關更多信息,請檢查https://stackoverflow.com/a/40523/8819761

您還可以使用Java 7的try-with-resources語法,一旦退出try塊,該語法將自動關閉流:

try (InputStream fis = new FileInputSteam(yourFile)) {
  // Do something
}

try (InputStream fis = new FileInputSteam(yourFile)) {
  // Do something else
}

每次使用InputStream完成時,您都必須關閉。

在Java中,如果您分配

 fis = new FileInputStream(new File("D:\\za180s.ser"));

fis將指向新對象,因此當您調用fis.close()時,舊流不會受到影響。 而且沒有辦法將其關閉。

您每次都需要調用close方法,但是現在不必擔心。在Java SE 7中,您可以使用try-with-resources 根據Java-Oracle文檔,

try-with-resources語句是一個try語句,用於聲明一個或多個資源。 資源是程序完成后必須關閉的對象。 try-with-resources語句可確保在語句末尾關閉每個資源。 任何實現java.lang.AutoCloseable的對象(包括所有實現java.io.Closeable的對象)都可以用作資源。

請看例子。

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
}

在此示例中,在try-with-resources語句中聲明的資源是BufferedReader。 聲明語句出現在try關鍵字之后的括號內。 Java SE 7和更高版本中的BufferedReader類實現接口java.lang.AutoCloseable。 因為BufferedReader實例是在try-with-resource語句中聲明的,所以無論try語句是正常完成還是突然完成(由於BufferedReader.readLine方法引發IOException),它都將關閉。

有關更多詳細信息,請查看Oracle-Java文檔try-with-resources

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM