Tôi đang cố gắng đọc một tệp đơn từ java.util.zip.ZipInputStream
và sao chép nó vào một java.io.ByteArrayOutputStream
(để tôi có thể tạo một java.io.ByteArrayInputStream
và trao cho thư viện của bên thứ ba sẽ kết thúc luồng và tôi không muốn đóng cửa ZipInputStream
của mình).Đọc từ một ZipInputStream thành một ByteArrayOutputStream
Tôi có thể bị thiếu một cái gì đó cơ bản ở đây, nhưng tôi không bao giờ bước vào vòng lặp while ở đây:
ByteArrayOutputStream streamBuilder = new ByteArrayOutputStream();
int bytesRead;
byte[] tempBuffer = new byte[8192*2];
try {
while ((bytesRead = zipStream.read(tempBuffer)) != -1) {
streamBuilder.write(tempBuffer, 0, bytesRead);
}
} catch (IOException e) {
// ...
}
tôi đang thiếu gì đó sẽ cho phép tôi để sao chép các dòng?
Edit:
Tôi có nên nói trước đó rằng ZipInputStream
này không đến từ một tập tin, vì vậy tôi không nghĩ rằng tôi có thể sử dụng một ZipFile
. Nó đến từ một tập tin được tải lên thông qua một servlet.
Ngoài ra, tôi đã gọi getNextEntry()
trên số ZipInputStream
trước khi đến đoạn mã này. Nếu tôi không thử sao chép tệp vào một số InputStream
khác (thông qua số OutputStream
được đề cập ở trên) và chỉ cần chuyển ZipInputStream
vào thư viện của bên thứ 3, thư viện đóng luồng và tôi không thể làm gì khác, như xử lý các tệp còn lại trong luồng.
Có thể bạn không quan tâm, nhưng ** bạn có thể tránh sao chép tất cả dữ liệu ** và tránh thư viện bên thứ ba đóng luồng nếu bạn quấn luồng đầu vào ban đầu (zipStream) và ghi đè phương thức đóng . 1) Tạo lớp công khai DontCloseInputStream mở rộng FilterInputStream. 2) Tạo một hàm tạo (InputStream in) gọi super (in) 3) Ghi đè lên phương thức close và không làm gì cả 4) Tạo mới DontCloseInputStream (zipStream) 5) chuyển nó vào thư viện. Và * với lá * – helios
Và để sao chép một InputStream vào một OutputStream có một lớp tiện ích được gọi là Streams trong thư viện commons-fileupload (Apache). Bạn làm Streams.copy (trong, ngoài, đóng?) Và nó được thực hiện. – helios
Vì vậy, zipEntry.getSize() trả về những gì? –