首頁 > Java > java教程 > 如何從具有逾時的 Ja​​va 輸入流讀取資料?

如何從具有逾時的 Ja​​va 輸入流讀取資料?

Mary-Kate Olsen
發布: 2024-12-19 22:12:10
原創
244 人瀏覽過

How Can I Read from a Java InputStream with a Timeout?

從具有超時的InputStream讀取

是否可以從InputStream讀取並指定超時?是的,但它並不像看起來那麼簡單。 InputStream.read() 方法可能是不可中斷的,即使資料可用,InputStream.available() 方法也可能傳回 0。

Sun 文件支援的事實

  1. InputStream.read() 可以是不可中斷。
  2. 使用 Reader 或 InterruptibleChannel 不會有幫助。
  3. InputStream.available() 總是可以回傳 0。
  4. InputStream.close() 可以阻塞或什麼都不做。
  5. 沒有通用的方法可以殺死另一個thread.

使用InputStream.available()

InputStream.available() 應該傳回可在不阻塞的情況下讀取的位元組數的估計值,但是需要注意的是,子類別負責重寫此方法。在實務上,具體的輸入流類別確實為 available() 提供了有意義的值。

注意事項

  1. 確保在 Windows 中鍵入輸入時使用回車符。
  2. InputStream.available() 將會傳回0,直到資料可用shell.

最簡單的解決方案(無阻塞)

byte[] inputData = new byte[1024];
int result = is.read(inputData, 0, is.available());
登入後複製

更豐富的解決方案(在超時內最大化緩衝區填充)

public static int readInputStreamWithTimeout(InputStream is, byte[] b, int timeoutMillis)
     throws IOException  {
     int bufferOffset = 0;
     long maxTimeMillis = System.currentTimeMillis() + timeoutMillis;
     while (System.currentTimeMillis() < maxTimeMillis & bufferOffset < b.length) {
         int readLength = java.lang.Math.min(is.available(), b.length - bufferOffset);
         int readResult = is.read(b, bufferOffset, readLength);
         if (readResult == -1) break;
         bufferOffset += readResult;
     }
     return bufferOffset;
 }
登入後複製

以上是如何從具有逾時的 Ja​​va 輸入流讀取資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板