2011-03-08 40 views
2

在Java 1.4之前,通常會在不同的InputStreams/OutputStreams之間移動字節來處理文件。使用文件和文件系統:在NIO之前,將來使用NIO和將來使用NIO2

從Java 1.4開始,添加了NIO,建議使用Channels來完成相同的操作。

隨着NIO2在Java 7中,將有在支持像

val source = Paths.get("fooDir/fooFile.txt") 
val target = Paths.get("barDir/barFile.txt") 
source moveTo target 
source createLinkTo target 

做事java.nio.file另一個API是older ones more or less useless現在對文件系統操作,除非你想手動觸摸字節?

+0

我懷疑NIO2不會取代以前的功能,而是擴展它。我沒有檢查過,但我不認爲你可以單獨使用NIO2做任何事情。 – 2011-03-08 11:15:09

+0

據我所知,NIO2確實取代了很多。例如,你不再需要'java.io.File'。 – 2011-03-25 06:50:28

回答

6

對於大多數操作,NIO2會讓你做得更好/更好。

使用傳統API(某些屬性,ACL,文件更改通知,更好的錯誤處理...),某些操作是不可能的。

最重要的是:這並不一定比較困難。

要回答你的問題:當你可以用兩種不同的API做一些操作時,我沒有看到任何使用情況,舊的情況下可以做得更好。

已經有一些討論:

Java NIO FileChannel versus FileOutputstream performance/usefulness http://mailinator.blogspot.com/2008/02/kill-myth-please-nio-is-not-faster-than.html

但我要說最新的API 設計要快。如果他們沒有在某些情況下,如果你使用的是更新的API,那麼期望一個jvm更新來恢復情況,而不必更改任何代碼。

5

最好的做法是儘可能使用較新的API。他們通常更擅長處理像符號鏈接這樣的角落案例。它們也更有可能直接建立在OS原語上,這將提供更好的硬件利用率。所以你的問題的簡短答案是「是的,舊的幾乎沒用」。新apis的一大缺點是它們需要安裝更新的JRE。

5

我會在這裏添加我的2美分。 @Ymajoros和@Matt總結得很好。

當然,新的NIO會比前輩好。舊的文件io類有很多限制。我已經從C++移到了後臺,發現即使Apis更易於使用,但它們缺乏很多功能。現在,如果您查看類,如果您嘗試查詢遠程目錄,則可能會看到一些緩慢或JVM可能掛起。這在7中得到修復。另外需要注意的是,一些文件系統支持符號鏈接,並且提供了處理該文件的規定。迭代器被添加用於目錄列表,並且它將支持POSIX和ACL控制模型。