Ai đó có thể cho tôi biết làm thế nào để sao chép một inputstream, lấy thời gian tạo ít nhất có thể? Tôi cần phải sao chép một inputstream nhiều lần cho nhiều phương pháp để xử lý IS. Tôi đã thử ba cách và mọi thứ không hoạt động vì một lý do nào đó.Làm thế nào để sao chép một inputstream trong java trong thời gian tối thiểu
Phương pháp # 1: Nhờ cộng đồng stackoverflow, tôi thấy liên kết sau hữu ích và đã kết hợp đoạn mã trong chương trình của tôi.
Tuy nhiên, sử dụng mã này có thể mất đến một phút (cho một tập tin 10MB) để tạo ra các inputstreams nhân bản và chương trình của tôi cần phải được càng nhanh càng tốt.
int read = 0;
byte[] bytes = new byte[1024*1024*2];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((read = is.read(bytes)) != -1)
bos.write(bytes,0,read);
byte[] ba = bos.toByteArray();
InputStream is1 = new ByteArrayInputStream(ba);
InputStream is2 = new ByteArrayInputStream(ba);
InputStream is3 = new ByteArrayInputStream(ba);
Phương pháp # 2: Tôi cũng đã thử sử dụng BufferedInputStream để sao chép IS. Điều này nhanh (thời gian tạo chậm nhất == 1ms. Nhanh nhất == 0ms). Tuy nhiên, sau khi tôi gửi is1 để được xử lý, các phương thức xử lý is2 và is3 đã ném một lỗi nói rằng không có gì để xử lý, gần giống như tất cả 3 biến bên dưới tham chiếu cùng một IS.
is = getFileFromBucket(path,filename);
...
...
InputStream is1 = new BufferedInputStream(is);
InputStream is2 = new BufferedInputStream(is);
InputStream is3 = new BufferedInputStream(is);
Phương pháp # 3: Tôi nghĩ trình biên dịch đang nói dối tôi. Tôi đã kiểm tra markSupported() cho is1 cho hai ví dụ trên. Nó trở thành sự thật vì vậy tôi nghĩ tôi có thể chạy
is1.mark()
is1.reset()
hoặc chỉ
is1.reset();
trước khi đi qua các LÀ với các phương pháp tương ứng của tôi. Trong cả hai ví dụ trên, tôi nhận được thông báo lỗi là dấu hợp lệ.
Tôi không còn ý tưởng vì vậy cảm ơn trước vì bất kỳ trợ giúp nào bạn có thể cho tôi.
P.S. Từ những nhận xét tôi nhận được từ mọi người, tôi cần phải làm rõ một vài điều liên quan đến tình huống của mình: 1) Chương trình này đang chạy trên máy ảo 2) Dòng đầu vào đang được truyền vào tôi từ phương pháp khác. Tôi không đọc từ một tập tin địa phương 3) Kích thước của inputstream không biết
Chạy mã cho Phương pháp # 1 mất 18 ms (đối với tệp 10 MB) trên máy tính của tôi. Có gì sai với phần cứng của bạn không? –
Cảm ơn bạn đã trả lời. Tôi không nghĩ có gì sai với phần cứng của mình. Nó chỉ đánh tôi mà tôi quên đề cập đến 2 điều: a) đây là trên một máy ảo và b) inputstream là một tập tin jpg. Tốc độ nhanh nhất được thực hiện là 11 giây nhưng đánh dấu các bài kiểm tra của tôi, nó trung bình như 30 giây hoặc lâu hơn, chậm nhất là khoảng 1 phút (53 giây chính xác). – Classified
Bạn có thể nhận được một tăng nhỏ nếu bạn làm điều này: byte [] ba = new byte [is.available()]; // Hoạt động nếu đó là FileInputStream DataInputStream mới (is) .readFully (ba); –