2012-07-31 44 views
6

tôi cần để có được kích thước tính bằng byte của một InputStream mà không cần tạo một trường hợp tập tin. Có cách nào để làm điều đó bằng cách sử dụng Java NIO?Java InputStream kích thước

+2

Tại sao bạn sẽ cần điều này? – Jeffrey

+3

Hợp đồng của 'InputStream' không nói gì về việc bắt buộc nó là hữu hạn. – oldrinb

+1

Hoặc liên quan đến việc nó được xác định trước. – EJP

Trả lời

24

Trong một vị tướng InputStream? Bạn sẽ phải tiếp tục đọc và đọc (ví dụ: vào cùng một bộ đệm, hết lần này đến lần khác) đếm số byte bạn đã đọc cho đến khi bạn đến cuối luồng.

Tất nhiên, sau đó bạn sẽ không có khả năng đọc dữ liệu riêng của mình ... nếu bạn muốn làm điều đó, bạn sẽ cần phải giữ cho dữ liệu khi bạn đọc nó, ví dụ bằng cách sao chép nó vào một số ByteArrayOutputStream.

(Nếu bạn có thể xử lý dữ liệu cùng một lúc khi làm việc chiều dài, chỉ cần làm điều đó - khi bạn đọc nó bằng cách sử dụng vòng lặp, đọc vào cùng một bộ đệm mỗi lần, chỉ cần tăng bộ đếm để ghi lại . bao nhiêu bạn đã đọc bạn chưa thực sự cung cấp cho chúng bất kỳ thông tin về những gì bạn muốn làm gì với dòng)

+1

Hoặc chỉ sao chép nó đến đích khi bạn đi, loại bỏ việc đếm, và ByteArrayOutputStream, và độ trễ, và không gian lãng phí bằng cách sẵn sàng tất cả vào bộ nhớ. – EJP

+0

@EJP: Điều đó phụ thuộc vào những gì bạn sẽ làm gì với nó sau đó. Bạn có thể không sao chép nó đến đích. –

+0

Vì vậy, chỉ cần đọc nó và xử lý nó trong khi bạn đang làm như vậy. Tôi rất nghi ngờ về 'giải pháp' mà bắt đầu bằng cách đọc toàn bộ đầu vào, trừ khi nó được biết rằng đầu vào là rất nhỏ, trong trường hợp này bạn hầu như không cần biết kích thước của nó là gì, phải không? – EJP

1

Một vài tùy chọn bổ sung:.

tùy thuộc vào chặn bản chất của luồng đầu vào, bạn có thể gọi available() trên luồng.

Nếu các luồng nhỏ, bạn có thể viết chúng vào PushbackInputStream s, đếm byte và sau đó tua lại.

+1

-1. available() không * không * trả về kích thước của một luồng, và có một cảnh báo cụ thể trong Javadoc đã nói như vậy. Và * tất cả * luồng đầu vào đang chặn. – EJP

+6

Phải mâu thuẫn. Kiểm tra JavaDoc. http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#available%28%29. Giá trị trả về của available() chỉ định rằng nó là số byte có thể đọc ** mà không có ** chặn. Hơn nữa, "Trong một số trường hợp, đọc không chặn (hoặc bỏ qua) có thể bị chặn khi nó chỉ chậm, ví dụ khi đọc các tệp lớn trên các mạng chậm". Và trong trường hợp FileInputStreams, nó thường là một chỉ số đáng tin cậy về kích thước. – Nicholas

+2

Đó chính xác là những gì tôi đã nói. Nó chính xác là * đối lập * của những gì bạn nói.Bạn nói có sẵn() có thể được sử dụng để trả về kích thước của luồng đầu vào, đó là chủ đề của câu hỏi này. Đó không phải là điều tương tự như số lượng byte có thể được đọc mà không bị chặn. Hãy xem xét một ổ cắm. Phần sau 'xa hơn' không có sự liên quan rõ ràng. Có một câu khác mà bạn không trích dẫn cụ thể cảnh báo chống lại việc sử dụng trong câu cuối cùng của bạn, và không có gì trong câu hỏi về FileInputStream. – EJP

6

Nó không phải là có thể biết được về nguyên tắc (xem xét một peer mà không bao giờ dừng lại văn bản), và bạn không cần nó. Chỉ cần đọc và viết trong một vòng lặp bằng cách sử dụng một bộ đệm kích thước cố định. NIO không cung cấp bất kỳ giải pháp kỳ diệu nào.

-2

bạn có thể nhận được kích thước của InputStream sử dụng getBytes (InputStream) của Utils.java kiểm tra liên kết này sau

Get Bytes from Inputstream

+0

Nói cách khác, chỉ cần đọc luồng cho đến cuối luồng, hoặc dựa vào các thuộc tính không có giấy tờ của ByteArrayInputStream. Liên kết chất lượng rất kém và không sử dụng NIO được chỉ định trong câu hỏi. -1 – EJP

Các vấn đề liên quan