Home >Java >javaTutorial >How to Read from a Java InputStream with a Timeout?
Specific problems require tailored solutions. This question seeks to construct a method that retrieves data from an InputStream within the given time limit, failing gracefully with an error code if exceeded.
Solving this problem requires understanding Java's InputStream class:
Contrary to the claim in the problem statement, InputStream.available() does not always return 0. It provides an estimation of readily available data without blocking. However, it may underestimate the true data count.
This straightforward approach does not impose any blocking or timeout constraints:
byte[] inputData = new byte[1024]; int result = is.read(inputData, 0, is.available());
For more fine-tuned control, a method can fill a buffer with available data within a specified 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 && 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
This provides a way to read from an InputStream with a timeout for both blocking and non-blocking input sources.
The above is the detailed content of How to Read from a Java InputStream with a Timeout?. For more information, please follow other related articles on the PHP Chinese website!