2013-05-06 77 views
0

作爲一個學校練習,我用Java編寫了一個方法來搜索文件中的一個字符。這裏是代碼:此文件對象保持打開狀態嗎?

public static void countLetter(char needle, String hayStack) throws IOException { 

     File f = new File(hayStack);           
     try (Scanner in = new Scanner(f)) {          
      String str = null;             
      while (in.hasNext()){            
       str += in.next();            
      }                 
      char[] charArr = str.toCharArray();         
      int counter = 0;             
      for (char c: charArr) {            
       if (c == needle){            
        counter++;             
       }                
      }                 
      System.out.println(counter);          
     }                  
    } 

這就是我需要它,但我有一個問題。 文件對象是否曾打開過?如果是,它是否關閉?我在Scanner對象上使用了try-with-resources,所以我很確定我不必明確地關閉它,但是文件對象呢?

回答

4

文件對象只是一個路徑名的抽象表示,它與打開文件無關。所以它不能關閉。

+0

相關的問題http://stackoverflow.com/questions/4752266/why-java-io-file-doesnt-have-a-close-method – 2013-05-06 01:32:45

+0

我想你在這裏的東西。 – noel 2013-05-06 01:33:44

+0

據我可以告訴這是它歸結爲什麼。感謝您的觀點Mukesh。 – noel 2013-05-06 02:05:46

0

由於該變量對您的函數是局部的,所以一旦該函數存在,它就會超出範圍,最終垃圾收集。對你的問題的回答是否定的,在你的情況下文件對象不會被打開。

+0

我不認爲這是很好的依靠突發事件要關閉文件。我可能會誤解。 – noel 2013-05-06 01:27:34

+0

理想情況下,您應該關閉它。 – 2013-05-06 01:29:13

1

File對象無法打開(因此無法關閉),因爲它是文件路徑的表示而不是文件的表示。

Scanner類將打開您的文件以便讀取它。你的程序不會調用in.close(),所以當你的方法返回時Scanner不會被垃圾收集,因爲它仍然有一個打開文件的引用。您可能還會鎖定文件,具體取決於文件如何由Scanner打開。

爲了使類有資格自動關閉try-resource塊中的資源,該類必須實現java.lang.AutoCloseable(或java.io.Closeable)。 Scanner沒有實現這些接口,所以當你退出try-resource塊時,它不會調用close()方法。

改變代碼:

public static void countLetter(char needle, String hayStack) throws IOException { 

    File f = new File(hayStack);           
    try (Scanner in = new Scanner(f)) {          
     String str = null;             
     while (in.hasNext()){            
      str += in.next();            
     }                 
     char[] charArr = str.toCharArray();         
     int counter = 0;             
     for (char c: charArr) {            
      if (c == needle){            
       counter++;             
      }                
     }                 
     System.out.println(counter); 
     in.close(); 
    } 
} 
+0

看看Scanner.java:348 – noel 2013-05-06 02:32:26

+0

你在看什麼版本的「Scanner.java:348」,這是我的評論專欄。您可能指的是評論中的一段說掃描儀將關閉Closable's,但您必須先關閉,因爲掃描儀本身*不可*關閉。 Scanner內部打開的文件不在範圍內,因此在退出try-resource塊時不會關閉。 – 2013-05-06 10:59:49

相關問題