首頁 >Java >java教程 >Java的InputStream可以逾時讀取嗎?

Java的InputStream可以逾時讀取嗎?

DDD
DDD原創
2024-12-25 18:21:15319瀏覽

Can Java's InputStream be Read with a Timeout, and How?

可以從具有超時的輸入流中讀取資料嗎?

問題的中心是開發一種可以從輸入流讀取資料的方法指定的逾時時間。這樣的方法 MaybeRead 的目標是,當在指定時間內有數據可用時,傳回與 InputStream 中的 read() 方法相同的結果;如果沒有可用數據,則傳回 -2。挑戰在於確保任何產生的執行緒在執行期間終止。

Java 輸入流限制

在探索潛在的解決方案之前,必須先了解Java 輸入流的具體限制:

  1. read () 可能是不可中斷的,防止資料傳輸期間中斷
  2. 將InputStream 包裝在Reader 或InterruptibleChannel 中沒有提供任何解決方案,因為它們只依賴 InputStream 方法。
  3. available() 可以合法地傳回 0,即使資料存在。
  4. close() 可能會阻塞或無效。
  5. 不存在終止其他方法的固有機制

對抗限制

利用InputStream.available()

利用InputStream.available()

利用InputStream.available()

利用InputStream.available()

利用InputStream.available()

儘管文件聲明可用() 可以返回0,證據表明它提供了可用數據的準確估計。具體的InputStream子類別策略性地覆寫available()以提供有意義的資訊。

特定於平台的警告

Windows/Cygwin:
byte[] inputData = new byte[1024];
int result = is.read(inputData, 0, is.available());  // Reads as much data as immediately available
僅在以下情況下提供輸入按「返回」。否則,InputStream.available() 按預期傳回 0。

簡單解決方案(無阻塞)

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;
 }

綜合解(最大資料)取得)

byte[] inputData = new byte[1024];
int readCount = readInputStreamWithTimeout(System.in, inputData, 6000);  // 6 second timeout
綜合解用法:

以上是Java的InputStream可以逾時讀取嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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