簡體   English   中英

Java - 通過頻道傳輸大文件 - NIO

[英]Java - Transferring big files over channels - NIO

我必須使用NIO通過ServerSocket傳輸~100MB的數據,但我無法弄清楚如何在沒有傳輸中斷的情況下執行此操作/保持傳輸狀態。

我的第一個想法是發送文件的大小,顯然我無法發送大文件的大小,因為它甚至不能立即適應RAM。 然后我想,為什么不只是轉移直到沒有收到,但那是問題進來時。

即使我一直在編寫服務器端數據

        FileChannel fc = new FileInputStream(f).getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        while(fc.read(buffer) > 0) {
            buffer.flip();
            while(channel.write(buffer) > 0);
            buffer.clear();
        }

但是因為文件傳輸必須中斷一段時間不斷地讀取數據並且在沒有任何可用的情況下斷開是不好的主意。

我無法弄清楚我怎么可能告訴客戶端是否仍有數據可用而不必將每個數據片作為帶有操作碼等的新數據包發送,或者甚至可能?

我也想知道是否有更好的方式發送整個緩沖區而不是下面

while(channel.write(buffer) > 0);

也許你正在尋找這個:

channel.transferFrom(0, fc.size(), fc);

通過緩沖區復制通道的正確方法如下:

while (in.read(buffer) >= 0 || buffer.position() > 0)
{
  buffer.flip();
  out.write(buffer);
  buffer.compact();
}

這將處理所有極端情況,包括讀取長度!=寫入長度並在輸入結束時保留數據。

NB表示阻塞模式。 如果處於非阻塞模式,則read()或write()返回零時應返回select()循環。

如果您不能依賴套接字保持打開狀態,則無法在協議中構建恢復和繼續機制。 至於告訴客戶端需要多少字節,您可以使用File.length找到文件的大小而無需將其讀入內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM