2014-10-27 48 views
0

我想hava一個靜態路徑屬性被掃描的兒童文件,此路徑引用一個zip文件,我不能關閉它,因爲它會被隨機引用。在某些時候,我需要寫入zip文件。問題是我不想關閉文件系統,因爲Path屬性需要打開供將來閱讀,如果我不關閉它,我看不到寫入的更改。如果我嘗試創建另一個引用相同路徑的文件系統,我會得到FileSystemAlreadyExistsException。我可以在寫完後關閉fs,然後再打開它,但有人可以嘗試在此刻讀取Path。 有一種解決方法?爲什麼我不需要關閉默認的FileSystem來查看寫入的文件,而且我確實需要使用Zip FileSystem?寫郵編文件系統與其他fs打開

public static void copyTree(final Path source, final Path targetPath) throws IOException { 
     FileSystem fs = FileSystems.getFileSystem(targetPath.toUri()); 

     Files.walkFileTree(source, new SimpleFileVisitor<Path>() { 
      @Override 
      public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { 
       Files.copy(dir, targetPath, StandardCopyOption.REPLACE_EXISTING); 
       return super.preVisitDirectory(dir, attrs); 
      } 
      @Override 
      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
       Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING); 
       return super.visitFile(file, attrs); 
      } 

     }); 

     //if I don't close the FileSystem here the changes won't appear. 
     fs.close(); 
    } 
+0

'fs'是你的榜樣完全無用的,它什麼都不做,而不是正在使用的任何東西,除了'close' - 基本上,你打開一個文件並再次關閉它而不明確讀取它。 – specializt 2017-01-18 13:02:38

回答

0

您不關閉「文件系統」,您可能會關閉一個文件 - 這些是完全不同的東西。 FileSystemAlreadyExistsException簡直就是不好的名稱 - 不能完全用java,AFAIK關閉/卸載文件系統,請停止對文件使用「文件系統」這個詞,它非常混亂。

要回答你的問題:如果我設法正確解密它,你想知道從幾個線程訪問一個文件,這是正確的嗎?

在這種情況下,最簡單的解決方案是:將對文件的訪問包裝到新類中,使類爲singleton,並且每個寫入方法synchronized。這樣,每個寫入操作都會阻塞,直到最後一個寫入操作完成 - 使用另一種關閉文件的方法,您甚至可以以受控方式關閉應用程序:http://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html,您還可以使用try-with-resources進行nio方法調用,這會拋出異常

我想了.property文件這個小例子可能攜帶的想法:Load Properties File in Singleton Class

+0

感謝您的回答,抱歉讓您感到困惑。我正在討論關閉FileSystem對象,而不是文件,我用一些代碼更新了這個問題,以便更好地解釋。 – Gus 2014-10-27 11:45:15

+0

我可以同步寫入文件系統的所有方法,但問題是我需要同步讀取方法,因爲我需要在寫入之後立即關閉fs對象。 – Gus 2014-10-27 11:48:18

+0

...是的,這幾乎是你需要做的。實際上,建議您在每次讀取操作的開始時鎖定整個文件,並在再次寫入/關閉後才解鎖 - 這是避免競速狀況的唯一方法。我會推薦使用信號量 - 這些都非常高效且易於使用。 – specializt 2014-10-27 11:56:55

相關問題