Home >Java >javaTutorial >How to Read from a Java InputStream with a Timeout?

How to Read from a Java InputStream with a Timeout?

Barbara Streisand
Barbara StreisandOriginal
2024-12-14 03:08:17862browse

How to Read from a Java InputStream with a Timeout?

Reading from an 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.

Specific Considerations for Java's InputStream

Solving this problem requires understanding Java's InputStream class:

  • Its read() method cannot be generally interrupted.
  • Wrapping InputStream into Reader or InterruptibleChannel classes does not extend the available options.
  • available() may return 0 at any time.
  • close() may block or do nothing.
  • Terminating another thread unconditionally is not possible.

Input Availability Check with available()

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.

The Most Basic Solution

This straightforward approach does not impose any blocking or timeout constraints:

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

Timeout-Aware Solution

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

Solution Utilization

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn