可以從具有超時的輸入流中讀取資料嗎?
問題的中心是開發一種可以從輸入流讀取資料的方法指定的逾時時間。這樣的方法 MaybeRead 的目標是,當在指定時間內有數據可用時,傳回與 InputStream 中的 read() 方法相同的結果;如果沒有可用數據,則傳回 -2。挑戰在於確保任何產生的執行緒在執行期間終止。
Java 輸入流限制
在探索潛在的解決方案之前,必須先了解Java 輸入流的具體限制:
對抗限制
利用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中文網其他相關文章!