Rumah >Java >javaTutorial >Bagaimanakah saya Boleh Membaca daripada Java InputStream dengan Tamat Masa?

Bagaimanakah saya Boleh Membaca daripada Java InputStream dengan Tamat Masa?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-19 22:12:10220semak imbas

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

Membaca daripada InputStream dengan Tamat Masa

Adakah mungkin untuk membaca daripada InputStream dan menentukan tamat masa? Ya, tetapi ia tidak semudah yang disangka. Kaedah InputStream.read() mungkin tidak boleh diganggu dan kaedah InputStream.available() mungkin mengembalikan 0 walaupun data tersedia.

Fakta yang Disokong oleh Dokumentasi Sun

  1. InputStream.read() boleh tidak boleh diganggu.
  2. Menggunakan Pembaca atau Saluran Interruptible tidak akan membantu.
  3. InputStream.available() sentiasa boleh mengembalikan 0.
  4. InputStream.close() boleh menyekat atau tidak berbuat apa-apa.
  5. Tiada cara umum untuk membunuh orang lain benang.

Menggunakan InputStream.available()

InputStream.available() harus mengembalikan anggaran bilangan bait yang tersedia untuk dibaca tanpa menyekat, tetapi adalah penting untuk ambil perhatian bahawa subkelas bertanggungjawab untuk mengatasi kaedah ini. Dalam praktiknya, kelas aliran input konkrit menyediakan nilai yang bermakna untuk available().

Kaveat

  1. Pastikan anda menggunakan carriage-return apabila menaip input dalam Windows.
  2. InputStream.available() akan mengembalikan 0 sehingga data tersedia daripada shell.

Penyelesaian Paling Mudah (Tiada Penyekatan)

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

Penyelesaian Lebih Kaya (Memaksimumkan Isian Penampan Dalam Masa Tamat)

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

Atas ialah kandungan terperinci Bagaimanakah saya Boleh Membaca daripada Java InputStream dengan Tamat Masa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn