2010-09-25 44 views
10

Làm cách nào để tìm kiếm (thay đổi vị trí) của một số ByteArrayInputStream (java.io)? Nó là một cái gì đó rất rõ ràng, nhưng tôi dường như không thể tìm thấy một phương pháp cho bất cứ nơi nào (mark/reset là không đủ, tôi cần phải đặt vị trí bất cứ nơi nào trên InputStream).Tìm kiếm ByteArrayInputStream bằng cách sử dụng java.io

Nếu nó không thể được thực hiện bằng java.io và tôi phải chuyển sang java.nio và sử dụng một ByteBuffer, làm thế nào tôi có thể nhận được một cái gì đó tương tự như một DataOutputStream gói một ByteArrayOutputStream sử dụng java.nio? Tôi không tìm thấy bất kỳ loại bộ đệm tự động thay đổi kích thước.

EDIT: Tôi đã tìm thấy một cách để đạt được những gì tôi đang cố gắng thực hiện, nhưng hơi lộn xộn một chút. ImageIO.createImageInputStream tạo ra một ImageInputStream, đó là chính xác những gì tôi muốn (có thể tìm kiếm và đọc nguyên thủy). Tuy nhiên, sử dụng một ByteArrayInputStream trả về một FileCacheImageInputStream, về cơ bản có nghĩa là nó sao chép mảng byte vào một tệp chỉ để tìm kiếm.

Đây là lần đầu tiên tôi cố gắng sử dụng các lớp Java IO và nó đã hoàn toàn tiêu cực. Tính năng này thiếu một số tính năng cơ bản (IMO) và có nhiều cách để làm điều tương tự (ví dụ: đọc nguyên thủy từ tệp bạn có thể sử dụng RandomAccessFile, DataInputStream + FileInputStream, FileImageInputStream, FileChannel + ByteBuffer và thậm chí nhiều hơn).

+0

bạn có thấy vấn đề gì khi sử dụng 'tìm kiếm' không? –

+4

@Vilay Mathew: Phương pháp 'tìm kiếm' là gì? Tôi không thấy bất kỳ trên ByteArrayInputStream. – asdfghjkl

+0

File i/o trong java là một mớ hỗn độn lớn. Tôi dạy nó cho học sinh năm nhất và cố gắng làm cho nó đơn giản, nhưng nó luôn luôn là một điểm của sự nhầm lẫn. – Fixee

Trả lời

8

Bạn muốn sử dụng reset()/skip(). Tôi không thể nói đó là API đẹp nhất trên thế giới, nhưng nó cũng làm việc:

public void seek(ByteArrayInputStream input, int position) 
    throws IOException 
{ 
    input.reset(); 
    input.skip(position); 
} 

Tất nhiên, đó là giả định rằng không ai đã kêu gọi mark().

+0

nếu đánh dấu không được gọi là sau đó giá trị mặc định của vị trí đánh dấu là 0 do đó gọi lại di chuyển con trỏ đến 0 và sau đó bỏ qua chức năng di chuyển con trỏ đến vị trí nhất định –

+0

@SumitKumarSaha: Có ... Tôi không chắc chắn về điểm bình luận của bạn. –

+0

Tôi vừa thêm vào câu trả lời của bạn –

1

Có một hàm tạo ByteArrayInputStream(byte(), int, int) sẽ cung cấp cho bạn luồng đầu vào sẽ đọc đến một số byte nhất định bắt đầu từ một giá trị đã cho. Bạn có thể sử dụng điều này để mô phỏng tìm kiếm một bù đắp tùy ý trong luồng.

Bạn phải đối phó với thực tế là "tìm kiếm" cung cấp cho bạn một đối tượng luồng mới và điều này có thể khó xử. Tuy nhiên, cách tiếp cận này không liên quan đến việc sao chép bất kỳ byte hoặc lưu chúng vào một tập tin, và nó sẽ an toàn để không bận tâm với việc đóng các đối tượng ByteArrayInputStream.

4

Nếu bạn đang tạo ByteArrayInputStream để chuyển sang nơi khác, hãy mở rộng lớp và thao tác pos (một thành viêncủa ByteArrayInputStream) như bạn muốn.

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