從具有超時的InputStream讀取
是否可以從InputStream讀取並指定超時?是的,但它並不像看起來那麼簡單。 InputStream.read() 方法可能是不可中斷的,即使資料可用,InputStream.available() 方法也可能傳回 0。
Sun 文件支援的事實
使用InputStream.available()
InputStream.available() 應該傳回可在不阻塞的情況下讀取的位元組數的估計值,但是需要注意的是,子類別負責重寫此方法。在實務上,具體的輸入流類別確實為 available() 提供了有意義的值。
注意事項
最簡單的解決方案(無阻塞)
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; }
以上是如何從具有逾時的 Java 輸入流讀取資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!