是否存在複製文件(緩衝區,流或其他)的本機JDK代碼?複製文件的原生JDK代碼
回答
如果 「本土」 你的意思是「Java標準的一部分API「(而不是依賴於平臺的代碼,在Java世界中通常被稱爲」本機「),而」複製文件「則意味着」採用文件和目標路徑並生成文件內容副本的單一方法「那麼不,標準API中沒有這樣的方法。您必須打開一個InputStream
和一個OutputStream
(可以選擇更高效的FileChannel
s)並使用緩衝區來傳輸字節。在Apache Commons IO中可以找到方便的單一方法。
更新:由於Java 7,文件複製功能已經成爲了標準API的一部分java.nio.file.Files
你最好的選擇是使用Java NIO:
http://java.sun.com/javase/6/docs/api/java/nio/package-summary.html
對於緩衝區看到:
http://java.sun.com/javase/6/docs/api/java/nio/package-summary.html#buffers
對於流然而,看看下面的文章:
http://java.sun.com/docs/books/tutorial/essential/io/file.html#readStream
有建立在此之上的框架,即米娜和Netty的:
- 米娜 - http://mina.apache.org/
- Netty的 - http://www.jboss.org/netty
謝謝!並添加到您的列表Apache Commons IO,它非常好! – 2010-03-31 12:44:59
這是複製一個文件,因爲JDK 1.4和首選方式後
public static void copyFile(final File sourceFile, final File destFile) throws IOException
{
if (!destFile.exists())
{
destFile.createNewFile();
}
FileChannel source = null;
FileChannel destination = null;
try
{
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
destination.transferFrom(source, 0, source.size());
}
finally
{
source.close();
destination.close();
}
}
...這種方法可能比一個簡單的循環更有效 從此通道讀取並寫入目標通道 。許多操作 系統可以將文件系統緩存中的字節 直接傳輸到目標通道 ,而實際上並不需要 將其複製。 ...
你確定你不需要循環嗎? transferFrom()返回「實際傳輸的字節數,可能爲零」,就像InputStream.read() – 2010-03-30 20:54:05
@Michael:Nope,'source.size()'指定需要傳輸的字節數。 @fuzzy:在這個例子中,'source.close()'拋出'IOException'時不會關閉'destination'。 – BalusC 2010-03-30 21:27:47
@BalusC是的,但API文檔明確指出,該方法實際上可能不會傳輸那麼多字節。 – 2010-03-30 21:52:04
只是要補充一點,JDK7在java.nio.file.Files中定義了多個複製方法,包括複製文件和將文件複製到流中/從流中複製文件。
- 1. java jdk替換原生類文件
- 2. WP7原生代碼?
- 3. BitmapRegionDecoder原生代碼
- 4. Trigger.io原生插件和源代碼控制
- 5. 如何強制SilverLight在生成的代碼文件夾中生成代碼?
- 6. 代碼分析生成的代碼生成文件 - 如何抑制警告?
- 7. Android C++原生代碼
- 8. 使用Visual Studio代碼複製構建內容文件代碼
- 9. 強大的原子文件複製
- 10. Corona會生成原生代碼嗎?
- 11. 如何恢復Dreamweaver CS4中的原生JavaScript代碼着色?
- 12. 如何推動最新的代碼複製到特定的iOS升級手機與反應原生代碼推
- 13. 使用cruisecontrol只是複製文件夾中的代碼,生成後
- 14. NSFileManager:以原子方式複製文件?
- 15. 以其原始權限複製文件
- 16. jquery代碼複製
- 17. 如何從原生android代碼(代號1)訪問默認包中的文件
- 18. 適應舊的反應原生代碼
- 19. 在低級文件複製程序中使用gotoxy()時產生錯誤代碼
- 20. Makefile生成的文件不被複制
- 21. MSBUild:使用基於原始文件的名稱複製文件
- 22. 複製和替換xcode4代碼中的文件夾
- 23. 複製ASP.NET代碼的項目文件到服務器
- 24. 原生代碼Typescript編譯器
- 25. 反應原生代碼does not execute
- 26. 單點觸摸和原生iOS代碼
- 27. JVM如何處理原生代碼
- 28. 原生facebook應用程序代碼
- 29. Android JNI原生C++代碼GetPrimitiveArrayCritical()問題
- 30. 你如何從原生Android代碼
糾正我,如果我錯了,但本機在Java世界通常意味着依賴於平臺的代碼... – Jon 2010-03-30 20:19:04
nope,Java世界中的「本地」意味着它的平臺相關的代碼,也就是代碼被編譯並在平臺上本地運行。雖然標準API是獨立於平臺的,通常用Java編寫,但該代碼將作爲JVM中的字節代碼運行 - 理論上,至少字節代碼始終是相同的,無論您處於何種平臺。 – KingInk 2010-03-30 20:32:30
@Jon,KingInk:* I *知道 - 但它懷疑湯姆沒有。 – 2010-03-30 20:51:31