>Java >java지도 시간 >시간 초과가 있는 Java InputStream에서 어떻게 읽을 수 있습니까?

시간 초과가 있는 Java InputStream에서 어떻게 읽을 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-19 22:12:10220검색

How Can I Read from a Java InputStream with a Timeout?

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

입력 스트림에서 읽고 시간 제한을 지정할 수 있습니까? 예, 하지만 보이는 것만큼 간단하지는 않습니다. InputStream.read() 메서드는 중단 불가능할 수 있으며, 데이터를 사용할 수 있는 경우에도 InputStream.available() 메서드는 0을 반환할 수 있습니다.

Sun 문서에서 지원하는 사실

  1. InputStream.read()는 다음과 같습니다. 중단할 수 없습니다.
  2. 리더나 InterruptibleChannel을 사용해도 도움이 되지 않습니다.
  3. InputStream.available()은 항상 0을 반환할 수 있습니다.
  4. InputStream.close()는 차단하거나 아무것도 하지 마세요.
  5. 다른 사람을 죽이는 일반적인 방법은 없습니다. thread.

InputStream.available()

InputStream.available()을 사용하면 차단 없이 읽을 수 있는 바이트 수의 추정치를 반환해야 하지만, 하위 클래스가 이 메서드를 재정의한다는 점에 유의하는 것이 중요합니다. 실제로 구체적인 입력 스트림 클래스는 available()에 대해 의미 있는 값을 제공합니다.

주의 사항

  1. Windows에서 입력을 입력할 때 캐리지 리턴을 사용해야 합니다.
  2. InputStream.available()은 다음에서 데이터를 사용할 수 있을 때까지 0을 반환합니다. shell.

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

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 InputStream에서 어떻게 읽을 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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