>Java >java지도 시간 >시간 초과로 Java의 InputStream을 읽을 수 있으며 어떻게 읽을 수 있습니까?

시간 초과로 Java의 InputStream을 읽을 수 있으며 어떻게 읽을 수 있습니까?

DDD
DDD원래의
2024-12-25 18:21:15315검색

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

시간 제한이 있는 입력 스트림에서 데이터를 읽을 수 있습니까?

질문은 지정된 제한 시간. MaybeRead라는 메소드는 할당된 시간 내에 데이터가 사용 가능하면 InputStream의 read() 메소드와 동일한 결과를 반환하고, 데이터가 없으면 -2를 반환하는 것을 목표로 합니다. 문제는 생성된 스레드가 실행 중에 종료되는지 확인하는 것입니다.

Java 입력 스트림 제한

잠재적인 솔루션을 탐색하기 전에 Java 입력 스트림의 특정 제한을 인정하는 것이 중요합니다.

  1. read()는 중단 불가능할 수 있어 데이터 도중 중단을 방지할 수 있습니다. 검색.
  2. Reader 또는 InterruptibleChannel에서 InputStream을 래핑하는 것은 InputStream 메서드에만 의존하기 때문에 해결책을 제공하지 않습니다.
  3. available()은 데이터가 있는 경우에도 합법적으로 0을 반환할 수 있습니다.
  4. close()는 차단되거나 효과가 없을 수 있습니다.
  5. 다른 것을 종료하는 고유한 메커니즘은 없습니다. 스레드.

제한 극복

InputStream.available() 활용

사용 가능하다고 명시한 문서에도 불구하고 ()는 0을 반환할 수 있으며 증거에 따르면 사용 가능한 데이터의 정확한 추정치를 제공합니다. 구체적인 InputStream 하위 클래스는 available()을 전략적으로 재정의하여 의미 있는 정보를 제공합니다.

플랫폼 관련 주의 사항

Windows/Cygwin: 입력은 다음 경우에만 제공됩니다. "돌아가기"를 누르세요. 그렇지 않은 경우, InputStream.available()은 예상대로 0을 반환합니다.

간단한 솔루션(차단 없음)

byte[] inputData = new byte[1024];
int result = is.read(inputData, 0, is.available());  // Reads as much data as immediately 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;
 }

사용방법:

byte[] inputData = new byte[1024];
int readCount = readInputStreamWithTimeout(System.in, inputData, 6000);  // 6 second timeout

위 내용은 시간 초과로 Java의 InputStream을 읽을 수 있으며 어떻게 읽을 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.