J'ai un fichier au format .gz. La classe java pour lire ce fichier est GZIPInputStream. Cependant, cette classe n'étend pas la classe BufferedReader de java. Par conséquent, je ne peux pas lire le fichier ligne par ligne. J'ai besoin de quelque chose comme ça
reader = new MyGZInputStream( some constructor of GZInputStream)
reader.readLine()...
J'ai pensé à créer ma classe qui étend la classe Reader ou BufferedReader de java et utilise GZIPInputStream comme l'une de ses variables.
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);
}
}
Mais cela ne fonctionne pas quand j'utilise
BufferedReader in = new BufferedReader(
new MyGZFilReader("F:/gawiki-20090614-stub-meta-history.xml.gz"));
System.out.println(in.readLine());
Quelqu'un peut-il conseiller comment procéder ...
java
file-io
filereader
gzipinputstream
Kapil D
la source
la source
Réponses:
La configuration de base des décorateurs est la suivante:
InputStream fileStream = new FileInputStream(filename); InputStream gzipStream = new GZIPInputStream(fileStream); Reader decoder = new InputStreamReader(gzipStream, encoding); BufferedReader buffered = new BufferedReader(decoder);
Le problème clé de cet extrait de code est la valeur de
encoding
. Il s'agit du codage des caractères du texte du fichier. Est-ce "US-ASCII", "UTF-8", "SHIFT-JIS", "ISO-8859-9",…? il existe des centaines de possibilités et le choix correct ne peut généralement pas être déterminé à partir du fichier lui-même. Il doit être spécifié via un canal hors bande.Par exemple, c'est peut-être la plate-forme par défaut. Dans un environnement en réseau, cependant, cela est extrêmement fragile. La machine qui a écrit le fichier peut se trouver dans la cellule voisine, mais avoir un codage de fichier par défaut différent.
La plupart des protocoles réseau utilisent un en-tête ou d'autres métadonnées pour noter explicitement le codage des caractères.
Dans ce cas, il ressort de l'extension de fichier que le contenu est XML. XML inclut l'attribut "encoding" dans la déclaration XML à cet effet. De plus, XML devrait vraiment être traité avec un analyseur XML, pas sous forme de texte. La lecture de XML ligne par ligne semble être un cas particulier et fragile.
Ne pas spécifier explicitement le codage est contraire au deuxième commandement. Utilisez l'encodage par défaut à vos risques et périls!
la source
GZIPInputStream gzip = new GZIPInputStream(new FileInputStream("F:/gawiki-20090614-stub-meta-history.xml.gz")); BufferedReader br = new BufferedReader(new InputStreamReader(gzip)); br.readLine();
la source
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);
la source
Vous pouvez utiliser la méthode suivante dans une classe util et l'utiliser chaque fois que nécessaire ...
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; }
la source
voici avec une ligne
try (BufferedReader br = new BufferedReader( new InputStreamReader( new GZIPInputStream( new FileInputStream( "F:/gawiki-20090614-stub-meta-history.xml.gz"))))) {br.readLine();}
la source