2009-07-03 36 views
61

Tôi có tệp ở định dạng .gz. Lớp java để đọc tệp này là GZIPInputStream. Tuy nhiên, lớp này không mở rộng lớp BufferedReader của java. Kết quả là, tôi không thể đọc từng dòng một. Tôi cần một cái gì đó như thế nàyGZIPInputStream đọc dòng theo dòng

reader = new MyGZInputStream(some constructor of GZInputStream) 
reader.readLine()... 

Tôi mặc dù tạo lớp của tôi mở rộng lớp Reader hoặc BufferedReader của java và sử dụng GZIPInputStream làm một biến của nó.

import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.Reader; 
import java.util.zip.GZIPInputStream; 

public class MyGZFilReader extends Reader { 

    private GZIPInputStream gzipInputStream = null; 
    char[] buf = new char[1024]; 

    @Override 
    public void close() throws IOException { 
     gzipInputStream.close(); 
    } 

    public MyGZFilReader(String filename) 
       throws FileNotFoundException, IOException { 
     gzipInputStream = new GZIPInputStream(new FileInputStream(filename)); 
    } 

    @Override 
    public int read(char[] cbuf, int off, int len) throws IOException { 
     // TODO Auto-generated method stub 
     return gzipInputStream.read((byte[])buf, off, len); 
    } 

} 

Nhưng, điều này không hoạt động khi tôi sử dụng

BufferedReader in = new BufferedReader(
    new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz")); 
System.out.println(in.readLine()); 

có thể tư vấn một người nào đó làm thế nào để tiến hành ..

+0

xem liên kết này http://stackoverflow.com/q/6717165/779408. Phương pháp nén và giải nén được biểu diễn ở đó. – breceivemail

+0

Vì tình yêu của tất cả những điều tốt đẹp và đúng đắn trong thế giới này và cho sự tỉnh táo của bất kỳ nhà phát triển nào viết mã thậm chí đáng giá từ xa ..... ĐƯỢC CHIA SẺ KHỞI HÀNH NHƯ THẾ NÀO! Anh ấy là câu trả lời duy nhất chỉ ra điều này, khiến tôi muốn khóc. – James

Trả lời

114

Các thiết lập cơ bản của trang trí là như thế này:

InputStream fileStream = new FileInputStream(filename); 
InputStream gzipStream = new GZIPInputStream(fileStream); 
Reader decoder = new InputStreamReader(gzipStream, encoding); 
BufferedReader buffered = new BufferedReader(decoder); 

Vấn đề then chốt trong đoạn này là giá trị của encoding. Đây là mã hóa ký tự của văn bản trong tệp. Có phải là "US-ASCII", "UTF-8", "SHIFT-JIS", "ISO-8859-9", & hellip ;? có hàng trăm khả năng và lựa chọn chính xác thường không thể được xác định từ chính tệp đó. Nó phải được xác định thông qua một số kênh ngoài băng.

Ví dụ: có thể đó là nền tảng mặc định. Tuy nhiên, trong một môi trường mạng, điều này cực kỳ mong manh. Máy đã viết tệp có thể nằm trong ngăn bên cạnh, nhưng có mã hóa tệp mặc định khác.

Hầu hết các giao thức mạng sử dụng tiêu đề hoặc siêu dữ liệu khác để ghi chú rõ ràng mã hóa ký tự.

Trong trường hợp này, nó xuất hiện từ phần mở rộng tệp mà nội dung là XML. XML bao gồm thuộc tính "encoding" trong khai báo XML cho mục đích này. Hơn nữa, XML thực sự cần được xử lý bằng một trình phân tích cú pháp XML, không phải là văn bản. Đọc XML từng dòng có vẻ như một trường hợp đặc biệt mong manh.

Không chỉ định rõ ràng mã hóa là against the second commandment.Sử dụng mã hóa mặc định khi gặp nguy hiểm!

+1

nhờ nó hoạt động ... Tuy nhiên, không cần bước đọc .. chúng ta cũng có thể viết nó là GZIPInputStream gzip = new GZIPInputStream (tệp FileInputStream mới ("F: /gawiki-20090614-stub-meta-history.xml. gz ")); \t \t BufferedReader br = new BufferedReader (new InputStreamReader (gzip)); –

+12

@KapilD nó làm cho tôi buồn rằng bạn hoàn toàn bị mất điểm của mình về mã hóa ... như được hiển thị bởi bình luận của bạn và ví dụ trong bình luận của bạn.Đọc lại câu trả lời của erickson .... có lẽ hơn 30 lần. – James

+0

Lệnh gzip biết mã hóa như thế nào? Tôi muốn đọc rất nhiều tệp từ rất nhiều máy chủ Linux/Unix từ khắp nơi trên thế giới ... vì vậy tôi muốn đảm bảo rằng tôi làm đúng ... Bài đăng đề cập đến mã hóa thường không thể được xác định bởi chính tệp ... nhưng lệnh gzip -d dường như hoạt động trên bất kỳ tệp nào mà không có đầu vào riêng biệt ... (những gì tôi sử dụng bây giờ nhưng muốn phá vỡ) vì vậy tôi tìm hiểu xem gzip có biết mã hóa nào không, có thể làm tương tự. Bất kỳ suy nghĩ/gợi ý bất cứ ai có thể chỉ cho tôi đi đúng hướng? – glyphx

0

gì về:

GZIPInputStream zipReader = new GZIPInputStream(); 
InputStreamReader streamReader = new InputStreamReader(zipReader); 
BufferedReader bufferedReader = new BufferedReader(streamReader); 
34
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz")); 
BufferedReader br = new BufferedReader(new InputStreamReader(gzip)); 
br.readLine(); 

+0

Câu trả lời của bạn thật tuyệt vời. Ngắn gọn và ngắn gọn .. Tuy nhiên, câu trả lời của erickson là chi tiết hơn. –

3
BufferedReader in = new BufferedReader(new InputStreamReader(
     new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz")))); 

String content; 

while ((content = in.readLine()) != null) 

    System.out.println(content); 
Các vấn đề liên quan