У меня есть файл в формате .gz. Класс Java для чтения этого файла - GZIPInputStream. Однако этот класс не расширяет класс BufferedReader для java. В результате я не могу читать файл построчно. Мне нужно что-то вроде этого
reader = new MyGZInputStream( some constructor of GZInputStream)
reader.readLine()...
Я хотел создать свой класс, который расширяет класс Java Reader или BufferedReader и использует GZIPInputStream в качестве одной из его переменных.
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);
}
}
Но это не работает, когда я использую
BufferedReader in = new BufferedReader(
new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz"));
System.out.println(in.readLine());
Может кто-нибудь посоветует, как действовать ..
java
file-io
filereader
gzipinputstream
Капил Д
источник
источник
Ответы:
Базовая настройка декораторов такая:
InputStream fileStream = new FileInputStream(filename); InputStream gzipStream = new GZIPInputStream(fileStream); Reader decoder = new InputStreamReader(gzipStream, encoding); BufferedReader buffered = new BufferedReader(decoder);
Ключевой вопрос в этом фрагменте - значение
encoding
. Это кодировка текста в файле. Это «US-ASCII», «UTF-8», «SHIFT-JIS», «ISO-8859-9»,…? существуют сотни возможностей, и правильный выбор обычно не может быть определен из самого файла. Он должен быть указан через какой-то внеполосный канал.Например, это платформа по умолчанию. Однако в сетевой среде это чрезвычайно хрупко. Машина, написавшая файл, может находиться в соседнем отсеке, но имеет другую кодировку файла по умолчанию.
Большинство сетевых протоколов используют заголовок или другие метаданные, чтобы явно указать кодировку символов.
В этом случае из расширения файла видно, что это содержимое XML. Для этой цели XML включает в декларацию XML атрибут "кодировка". Более того, XML действительно следует обрабатывать с помощью анализатора XML, а не как текст. Построчное чтение XML кажется хрупким, частным случаем.
Отсутствие явного указания кодировки противоречит второй заповеди. Используйте кодировку по умолчанию на свой страх и риск!
источник
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz")); BufferedReader br = new BufferedReader(new InputStreamReader(gzip)); br.readLine();
источник
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);
источник
Вы можете использовать следующий метод в классе util и использовать его при необходимости ...
public static List<String> readLinesFromGZ(String filePath) { List<String> lines = new ArrayList<>(); File file = new File(filePath); try (GZIPInputStream gzip = new GZIPInputStream(new FileInputStream(file)); BufferedReader br = new BufferedReader(new InputStreamReader(gzip));) { String line = null; while ((line = br.readLine()) != null) { lines.add(line); } } catch (FileNotFoundException e) { e.printStackTrace(System.err); } catch (IOException e) { e.printStackTrace(System.err); } return lines; }
источник
вот с одной строкой
try (BufferedReader br = new BufferedReader( new InputStreamReader( new GZIPInputStream( new FileInputStream( "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) {br.readLine();}
источник