2012-03-04 28 views
6

Tôi đang cố gắng viết một hàm nhận các đối tượng File, các tham số mảng offset và byte và ghi mảng byte đó vào đối tượng File trong Java.Java OutputStream Skip (offset)

Vì vậy, các chức năng sẽ trông như thế

public void write(File file, long offset, byte[] data) 

Nhưng vấn đề là các thông số bù đắp là loại dài, vì vậy tôi không thể sử dụng ghi) chức năng (của OutputStream, trong đó có số nguyên là giờ chênh lệch.

Không giống như InputStream, đã bỏ qua (dài), có vẻ như OutputStream không có cách nào để bỏ qua byte đầu tiên của tệp.

Có cách nào tốt để giải quyết vấn đề này không?

Cảm ơn bạn.

+0

Số lớn nhất bạn có thể đặt trong 'int' là 2.147,483,647. Các mảng bạn muốn viết lớn hơn + - 2GB? –

+0

Chỉ cần làm rõ: bù trừ chỉ áp dụng cho vị trí trong mảng *, không phải luồng đầu ra, phải không? Với OutputStream, bạn không thể bỏ qua các vị trí. –

+0

@TheNail offset đề cập đến bù đắp từ đầu tệp, chứ không phải phần đầu của mảng. Và trừ khi bạn đang sử dụng FAT như một hệ thống tập tin bạn thực sự có thể có các tập tin lớn hơn 2Gb. – Dunes

Trả lời

11
try { 
    FileOutputStream out = new FileOutputStream(file); 
    try { 
     FileChannel ch = out.getChannel(); 
     ch.position(offset); 
     ch.write(ByteBuffer.wrap(data)); 
    } finally { 
     out.close(); 
    } 
} catch (IOException ex) { 
    // handle error 
} 
4

Điều đó liên quan đến ngữ nghĩa của các luồng. Với luồng đầu vào, bạn chỉ đang nói rằng bạn đang loại bỏ n byte dữ liệu đầu tiên. Tuy nhiên, với một cái gì đó OutputStream phải được ghi vào dòng. Bạn không thể chỉ yêu cầu luồng giả định n byte dữ liệu được viết, nhưng không thực sự viết chúng. Lý do là vì không phải tất cả các luồng đều có thể tìm kiếm được. Dữ liệu đến qua mạng không thể tìm kiếm được - bạn nhận dữ liệu một lần và chỉ một lần. Tuy nhiên, điều này không phải như vậy với các tập tin bởi vì chúng được lưu trữ trên một ổ đĩa cứng và nó rất dễ dàng để tìm kiếm bất kỳ vị trí trên ổ đĩa cứng.

Giải pháp: Sử dụng FileChannels hoặc RandomAccessFile insteead.

1

Nếu bạn muốn viết ở cuối tệp, hãy sử dụng chế độ nối thêm (FileOutputStream (Tên chuỗi, boolean chắp thêm)). Theo ý kiến ​​khiêm tốn của tôi, có một phương thức bỏ qua trong FileOutputStream, nhưng bây giờ bạn nếu bạn muốn đi đến một vị trí cụ thể trong một tập tin để viết thì bạn phải sử dụng FileChannel tìm kiếm hoặc RandomAccessFile (vì nó đã được được đề cập bởi những người khác).

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