>Java >java지도 시간 >시간 초과가 있는 Java InputStream에서 읽는 방법은 무엇입니까?

시간 초과가 있는 Java InputStream에서 읽는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-14 03:08:17861검색

How to Read from a Java InputStream with a Timeout?

시간 제한이 있는 입력 스트림에서 읽기

특정 문제에는 맞춤형 솔루션이 필요합니다. 이 질문은 주어진 시간 제한 내에 입력 스트림에서 데이터를 검색하고 초과할 경우 오류 코드와 함께 정상적으로 실패하는 메서드를 구성하는 방법을 모색합니다.

Java의 입력 스트림에 대한 특정 고려 사항

이 문제를 해결하려면 이해가 필요합니다. Java의 InputStream 클래스:

  • 해당 read() 메소드는 일반적으로 중단되었습니다.
  • InputStream을 Reader 또는 InterruptibleChannel 클래스로 래핑해도 사용 가능한 옵션이 확장되지 않습니다.
  • available()은 언제든지 0을 반환할 수 있습니다.
  • close()는 차단되거나 아무것도 하지 마세요.
  • 다른 스레드를 무조건 종료하는 것은 아닙니다. 가능합니다.

available()을 사용한 입력 가용성 확인

문제 설명의 주장과 달리, InputStream.available()은 항상 0을 반환하지 않습니다. 차단 없이 데이터를 사용할 수 있습니다. 그러나 실제 데이터 수를 과소평가할 수 있습니다.

가장 기본적인 솔루션

이 간단한 접근 방식은 차단 또는 시간 초과 제약 조건을 부과하지 않습니다.

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

시간 초과 인식 솔루션

보다 세부적인 제어를 위해 메서드는 지정된 범위 내에서 사용 가능한 데이터로 버퍼를 채울 수 있습니다. 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;
 }

솔루션 활용

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

이는 차단 및 비차단 입력 소스 모두에 대한 시간 초과를 사용하여 InputStream에서 읽는 방법을 제공합니다.

위 내용은 시간 초과가 있는 Java InputStream에서 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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