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

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

Barbara Streisand
Barbara Streisand原創
2024-12-14 03:08:17864瀏覽

How to Read from a Java InputStream with a Timeout?

從具有超時的輸入流中讀取

特定問題需要量身定制的解決方案。本題旨在建構一個方法,在給定的時間限制內從 InputStream 中檢索數據,如果超過則優雅地失敗並顯示錯誤代碼。

Java InputStream 的具體注意事項

解決此問題需要理解Java的InputStream類:

  • 它的read()方法不能通用
  • 將InputStream 包裝到Reader 或InterruptibleChannel 類別中不會擴充可用選項。
  • available() 可能隨時回傳 0。
  • close() 可能會阻塞或什麼都不做。
  • 無條件終止另一個執行緒不是

使用available() 檢查輸入可用性

與問題陳述中的說法相反,InputStream.available() 並不總是返回0。它提供了一個容易的估計可用資料無阻塞。但是,它可能會低估真實的數據計數。

最基本的解決方案

這種簡單的方法不會施加任何阻塞或超時約束:

byte[] inputData = new byte[1024];
int result = is.read(inputData, 0, is.available());

超時感知解決方案

為了進行更精細的控制,方法可以在指定的範圍內用可用資料填充緩衝區timeout:

public static int readInputStreamWithTimeout(InputStream is, byte[] b, int timeoutMillis)
     throws IOException  {
     int bufferOffset = 0;
     long maxTimeMillis = System.currentTimeMillis() + timeoutMillis;
     while (System.currentTimeMillis() < maxTimeMillis &amp;&amp; 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;
 }

解決方案利用率

byte[] inputData = new byte[1024];
int readCount = readInputStreamWithTimeout(System.in, inputData, 6000);  // 6 second timeout

這提供了一種從InputStream 讀取阻塞和非阻塞輸入來源的逾時的方法。

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn