2011-08-19 38 views
9

Tôi muốn xóa dòng đầu tiên của tệp văn bản trong Java. Tập tin này là vài gigabyte và tôi không muốn làm một bản sao. Sử dụng gợi ý từ this post, tôi đang cố gắng làm như vậy bằng cách sử dụng RandomAccessFile, tuy nhiên nó đang viết quá nhiều.Làm cách nào để thay thế dòng đầu tiên của một tệp lớn trong Java?

Đây là mã của tôi:

RandomAccessFile raInputFile = new RandomAccessFile(inputFile, "rw"); 
origHeaderRow = raInputFile.readLine(); 
raInputFile.seek(0); 
raInputFile.writeChars(Strings.repeat(" ",origHeaderRow.length())); 
raInputFile.close(); 

Và nếu bạn muốn có một số mẫu đầu vào và đầu ra, đây là những gì sẽ xảy ra:

Trước:

first_name,last_name,age 
Doug,Funny,10 
Skeeter,Valentine,9 
Patti,Mayonnaise,11 
Doug,AlsoFunny,10 

Sau:

     alentine,9 
Patti,Mayonnaise,11 
Doug,AlsoFunny,10 

Trong ví dụ này, trong hầu hết các trình chỉnh sửa, tệp bắt đầu chính xác với 24 khoảng trắng, nhưng 48 ký tự (bao gồm cả dòng mới) đã được thay thế. Sau khi dán vào đây tôi thấy những câu hỏi kỳ lạ. Việc thay thế kích thước gấp đôi làm cho tôi điều gì đó liên quan đến mã hóa là nhận được sai lầm nhưng tôi đã thử writeUTF với kết quả tương tự.

+2

Yay để sử dụng tên của tôi! –

+0

Chỉ cần bạn biết, không thể chỉnh sửa tệp "tại chỗ" với hệ thống tệp hiện đại. Một bản sao mới luôn được thực hiện. – toto2

+0

Tệp mã hóa là gì? 1521? UTF8? UCS2? –

Trả lời

8

char bằng Java là 2 byte.

sử dụng writeBytes để thay thế.

raInputFile.writeBytes(Strings.repeat(" ",origHeaderRow.length())); 

Từ JavaDoc trông chính xác những gì bạn đang tìm kiếm.

+0

writeBytes FTW! – Zugwalt

5

Khi bạn đang viết ký tự (trong Java là 16-bit), mỗi ký tự sử dụng hai byte. Tôi khuyên bạn nên thử viết số byte bạn muốn nếu không, không gian của bạn sẽ biến thành nulspace byte.

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