2014-04-11 78 views
2

我試圖將文件從一個目錄複製到另一個目錄,但我希望阻止該調用,以便程序只在整個文件傳輸後才執行。Files.copy的阻止/同步版本

目前我使用Files.copy(),它使用非阻塞IO並立即返回。還有什麼其他選擇(最好是內置於Java標準庫中)我必須解決這個問題嗎?

非常感謝, 加雷思

+1

我在['Files.copy' javadoc](http://docs.oracle.com /javase/8/docs/api/java/nio/file/Files.html#copy-java.nio.file.Path-java.nio.file.Path-java.nio.file.CopyOption...-)說操作是異步的。通常情況下,異步操作接受某種形式的回調(lambda或實現它將調用的接口的對象),或者返回可用於檢查是否完成的內容。 'Files.copy'只是返回一個'Path'。由於尊重,我認爲你已經在使用你想要的東西,只是誤解了一些東西。 –

+0

我是新來的java,所以我可能會誤解一些東西。 [此](http://stackoverflow.com/a/106807/1199721)prevoius回答說,它將請求延遲到操作系統,它所在的NIO軟件包也讓我相信它是非阻塞的 –

+1

@ Gareth:我剛剛檢查過 - 「Files.copy」在複製完成之前不會返回。 –

回答

8

Files.copy不是異步的,直到複製完成纔會返回。

通常情況下,如果一個方法是異步的,JavaDoc將非常清楚,並且該方法將接受某種形式的回調(一個lambda或實現接口的對象和它將調用的方法等) ,或者返回可用於檢查完成(或錯誤)的內容。 Files.copy沒有這樣做,它的Javadoc沒有說它是異步的,所以沒有理由懷疑它是異步的。 (我只是做了一個快速測試以確保它,直到複製完成纔會返回。)

+0

感謝您的信息 - 我的問題必須在其他地方! –

+0

@GarethWebber即使我面臨類似的問題,但一直未能找出原因。你還記得你面臨的問題嗎? – Limit

+0

@Limit與你在同一條船。你有沒有找到罪魁禍首?我正在使用java API文件WatchService。在我調用'Files.copy'後,watchservice會觸發一個新的文件事件,但此時文件是空的。幾秒鐘後文件就完成了。 – flakes

0

java.io包爲您解答。據我所知,那裏的File類操作是阻塞的。