 |
 |
11) Le système d’E/S de Java |
|
 |
|
Texte original |
 |
Traducteur : Armel FORTUN |
|
 |
|
 |
 |
 |
 |
 |
 |
|
 |
|
 |
 |
 |
4. File output
|
 |
4. Sortie de Fichier
|
 |
 |
 |
This example also shows how to write data
to a file. First, a
FileWriter is created to
connect to the file. You’ll virtually always want to buffer the output by
wrapping it in a
BufferedWriter (try
removing this wrapping to see the impact on the performance—buffering
tends to dramatically increase performance of I/O operations). Then for the
formatting it’s turned into a
PrintWriter. The data
file created this way is readable as an ordinary text file.
|
 |
Cet exemple aussi montre comment écrire des données vers un fichier.
Premièrement, un FileWriter est crée pour se connecter au fichier. Vous voudrez
toujours mettre en tampon la sortie en l'emballant[wrapping it] dans un
BufferedWriter (essayez de retirer cet emballage pour voir l'impact sur les
performances — le tampon tend à accroître dramatiquement les performance des
opérations d'E/O). Puis le formatage est changé en un PrintWriter. Le fichier de données ainsi crée
est lisible comme un fichier texte normal.
|
 |
 |
 |
As the lines are written to the file,
line numbers are added. Note that LineNumberInputStream is not
used, because it’s a silly class and you don’t need it. As shown
here, it’s trivial to keep track of your own line
numbers.
|
 |
Comme les lignes sont écrites vers le fichier, les numéros de lignes sont
ajoutés. Notez que LineNumberInputStream n'est pas utilisé, parce que
c'est une classe idiote et que vous n'en avez pas besoin. Comme il est montré ici, il est
superficiel de garder trace de vos propres numéros de lignes.
|
 |
 |
 |
When
the input stream is exhausted,
readLine( ) returns
null. You’ll see an explicit close( ) for out1,
because if you don’t call close( ) for all your output files,
you might discover that the buffers don’t get flushed so they’re
incomplete.
|
 |
Quand le flux d'entrée épuisé, readLine( ) renvoie null.
Vous verrez close( ) explicite pour out1, car si vous ne faites
pas appel à close( ) pour tous vos fichiers de sortie, vous pourrez découvrir que
les tampons ne seront pas libérés sans qu'ils seront incomplets.
|
 |
 |
 |
Output streams
|
 |
Flux de sortie
|
 |
 |
 |
The two primary kinds of output streams
are separated by the way they write data: one writes it for human consumption,
and the other writes it to be reacquired by a
DataInputStream. The
RandomAccessFile stands
alone, although its data format is compatible with the DataInputStream
and
DataOutputStream.
|
 |
Les deux types de flux de sortie sont séparés par la manière dont ils
écrivent les données : un les écrit pour une consommation humaine, l'autre les écrit pour une
reacquisition par un DataInputStream. Le RandomAccessFile se
tient seul, bien que son format de données soit compatible avec DataInputStream et
DataOutputStream.
|
 |
 |
 |
5. Storing and recovering
data
|
 |
5. Stocker et récupérer des données
|
 |
 |
 |
A PrintWriter formats data so
it’s readable by a human. However, to output data so that it can be
recovered by another stream, you use a DataOutputStream to write the data
and a DataInputStream to recover the data. Of course, these streams could
be anything, but here a file is used, buffered for both reading and writing.
DataOutputStream and DataInputStream are byte-oriented and
thus require the InputStreams and OutputStreams.
|
 |
Un PrintWriter formate les données afin qu'elles soient
lisibles par un humain. Cependant, pour sortir des données qui puissent être récupérées par un
autre flux, on utilise un DataOutputStream pour écrire les données et un
DataInputStream pour récupère les données. Bien sûr, ces flux pourraient être
n'importe quoi, mais ici c'est un fichier qui est employé, mis en mémoire tampon pour à la fois
lire et écrire. DataOutputStream et DataInputStream sont
orientés-byte et nécessitent ainsi des InputStreams and
OutputStreams.
|
 |
 |
 |
If you use a DataOutputStream to
write the data, then Java guarantees that you can accurately recover the data
using a DataInputStream—regardless of what different platforms
write and read the data. This is incredibly valuable, as anyone knows who has
spent time worrying about platform-specific data issues. That problem vanishes
if you have Java on both
platforms[58].
|
 |
Si vous employez un DataOutputStream pour écrire les
données, alors Java se porte garant de l'exacte récupération des
données en employant un DataInputStream — sans se soucier du type de
plate-forme qui écrit et lit les données. Ce qui est incroyablement valable, comme chacun sait
ayant passé du temps a s'inquiéter de la distribution de donnée à des plates-formes spécifiques. Ce
problème disparaît si l'on a Java sur les deux plates-formes [58].
|
 |
 |
 |
Note
that the character string is written using both writeChars( ) and
writeBytes( ). When you run the program, you’ll discover that
writeChars( ) outputs 16-bit Unicode characters. When you read the
line using readLine( ), you’ll see that there is a space
between each character, because of the extra byte inserted by Unicode. Since
there is no complementary “readChars” method in
DataInputStream, you’re stuck pulling these characters off one at a
time with
readChar( ). So for
ASCII, it’s easier to write the characters as bytes followed by a newline;
then use readLine( )
to read back the bytes as a regular ASCII line.
|
 |
Notez que les caractères de la chaîne de caractère sont écrit en utilisant
à la fois writeChars() et writeBytes(). Quand vous exécuterez le
programme, vous découvrirez que writeChars() donne en sortie des caractères
Unicode 16-bit. Lorsque l'on lit la ligne avec readLine(), vous remarquerez qu'il
y a un espace entre chaque caractère, à cause du byte (ndt : octet ?) supplémentaire inséré par
Unicode. Comme il n'y a pas de méthode complémentaire « readChars » dans
DataInputStream, vous êtes coincés à retirer ces caractères un par un avec
readChar(). Ainsi pour l'ASCII, il est plus facile d'écrire les caractères sous la
forme de bytes suivit par un saut de ligne; employez alors readLine() pour relire
les bytes comme des lignes régulières ASCII.
|
 |
 |
 |
The
writeDouble( )
stores the double number to the stream and the complementary
readDouble( )
recovers it (there are similar methods for reading and writing the other types).
But for any of the reading methods to work correctly, you must know the exact
placement of the data item in the stream, since it would be equally possible to
read the stored double as a simple sequence of bytes, or as a
char, etc. So you must either have a fixed format for the data in the
file or extra information must be stored in the file that you parse to determine
where the data is located.
|
 |
Le writeDouble() stocke les nombres
double pour le flux et le readDouble() complémentaire les
récupère (il y a des méthodes similaires pour lire et écrire les autres types). Mais pour que
n'importe quelle méthode de lecture fonctionne correctement, vous devrez connaître l'emplacement
exact des éléments de donnée dans le flux, puisqu'il serait possible de lire les
double stockés comme de simple séquences de bytes, ou comme des
chars, etc. Donc vous devrez soit avoir un format fixé pour les données dans le
fichier ou des informations supplémentaires devront êtres stockés dans le fichier et que vous
analyserez pour déterminer l'endroit où les données sont stockées.
|
 |
 |
 |
6. Reading and writing random access files
|
 |
6. Accés aléatoire en lecture et écriture aux fichiers
|
 |
 |
 |
As previously noted, the
RandomAccessFile is almost totally isolated from the rest of the I/O
hierarchy, save for the fact that it implements the DataInput and
DataOutput interfaces. So you cannot combine it with any of the aspects
of the InputStream and OutputStream subclasses. Even though it
might make sense to treat a ByteArrayInputStream as a random access
element, you can use RandomAccessFile to only open a file. You must
assume a RandomAccessFile is properly buffered since you cannot add
that.
|
 |
Comme il a été noté précédemment, le RandomAccessFile est
presque totalement isolé du reste de la hiérarchie d'E/S, protègé par le fait qu'il implémente les
interfaces DataInput et DataOutput. Donc vous ne pouvez
l'associer avec un des point des sous-classes InputStream et
OutputStream. Quoiqu'il pourrait sembler raisonnable de traiter un
ByteArrayInputStream comme un élément d'accès aléatoire, vous pouvez employer un
RandomAccessFile pour ouvrir simplement un fichier. Vous devez supposer qu'un
RandomAccessFile est correctement mis en mémoire tampon puisque vous ne pouvez pas
ajouter cela.
|
 |
 |
 |
The one option you have is in the second
constructor argument: you can open a RandomAccessFile to read
(“r”) or read and write
(“rw”).
|
 |
La seule option disponible est dans le second argument du constructeur :
vous pouvez ouvrir un RandomAccessFile pour lire (« r ») ou
lire et écrire (« rw »).
|
 |
 |
 |
Using a RandomAccessFile is like
using a combined DataInputStream and DataOutputStream (because it
implements the equivalent interfaces). In addition, you can see that
seek( ) is used to
move about in the file and change one of the
values.
|
 |
Utiliser un RandomAccessFile est comme utiliser une
combinaison de DataInputStream et DataOutputStream (parce que
cela implémente les interfaces équivalentes). En plus, vous pouvez remarquer que
seek() est utilisé pour errer dans le fichier et changer une des
valeurs.
|
 |
 |
 |
A bug?
|
 |
Un bogue ?
|
 |
 |
 |
If you look at section 5, you’ll
see that the data is written before the text. That’s because a
problem was introduced in Java 1.1 (and persists in Java 2) that sure seems like
a bug to me, but I reported it and the bug people at JavaSoft said that this is
the way it is supposed to work (however, the problem did not occur in
Java 1.0, which makes me suspicious). The problem is shown in the following
code:
|
 |
Si vous regardez la partie 5, vous verrez que les données sont écrites
avant le texte. C'est à cause d'un problème qui a été introduit dans Java 1.1 ( et
persiste dans Java 2) qui apparaît vraiment comme un bogue pour moi, mais j'en ai rendu compte et
les debogueurs de JavaSoft ont dit que c'était la manière dont il était supposé fonctionner
(pourtant, le problème n'apparaissait pas dans Java 1.0, ce qui me rend suspicieux). Le problème
est montré dans le code suivant :
|
 |
 |
 |
//: c11:IOProblem.java // Java 1.1 and higher I/O Problem. import java.io.*;
public class IOProblem { // Throw exceptions to console: public static void main(String[] args) throws IOException { DataOutputStream out = new DataOutputStream( new BufferedOutputStream( new FileOutputStream("Data.txt"))); out.writeDouble(3.14159); out.writeBytes("That was the value of pi\n"); out.writeBytes("This is pi/2:\n"); out.writeDouble(3.14159/2); out.close();
DataInputStream in = new DataInputStream( new BufferedInputStream( new FileInputStream("Data.txt"))); BufferedReader inbr = new BufferedReader( new InputStreamReader(in)); // The doubles written BEFORE the line of text // read back correctly: System.out.println(in.readDouble()); // Read the lines of text: System.out.println(inbr.readLine()); System.out.println(inbr.readLine()); // Trying to read the doubles after the line // produces an end-of-file exception: System.out.println(in.readDouble()); } } ///:~
|
 |
//: c11:IOProblem.java // Problème dans Java 1.1 et supérieur. import java.io.*;
public class IOProblem { // Lance les exeptions vers la console : public static void main(String[] args) throws IOException { DataOutputStream out = new DataOutputStream( new BufferedOutputStream( new FileOutputStream("Data.txt"))); out.writeDouble(3.14159); out.writeBytes("C'était la valeur de pi\n"); out.writeBytes("C'est pi/2:\n"); out.writeDouble(3.14159/2); out.close();
DataInputStream in = new DataInputStream( new BufferedInputStream( new FileInputStream("Data.txt"))); BufferedReader inbr = new BufferedReader( new InputStreamReader(in)); // Les doubles écrit AVANT la ligne de texte // sont renvoyés correctement : System.out.println(in.readDouble()); // Lit le lignes du texte : System.out.println(inbr.readLine()); System.out.println(inbr.readLine()); // Tenter de lire les doubles après la ligne // produit une eexeption de fin de ligne : System.out.println(in.readDouble()); } } ///:~
|
 |
 |
 |
It appears that anything you write after
a call to writeBytes( ) is not recoverable. The answer is apparently
the same as the answer to the old vaudeville joke: “Doc, it hurts when I
do this!” “Don’t do
that!”
|
 |
Il apparaît que tout ce que vous écrivez après un appel à
writeBytes() n'est pas récupérable. La réponse est apparament la même que la
réponse à la vieille blague de vaudeville : « Docteur, cela fait mal quand je fais cela ! »
« Ne fait pas cela ! ».
|
 |
 |
 |
Piped streams
|
 |
Flux Piped
|
 |
 |
 |
The PipedInputStream,
PipedOutputStream, PipedReader and PipedWriter have been
mentioned only briefly in this chapter. This is not to suggest that they
aren’t useful, but their value is not apparent until you begin to
understand multithreading, since the piped streams are used to communicate
between threads. This is covered along with an example in Chapter
14.
|
 |
Les PipedInputStream, PipedOutputStream,
PipedReader et PipedWriter sont mentionnés de manière brève dans
ce chapitre. Ce qui n'insinue pas qu'il ne sont pas utiles, mais leur importance n'est pas évidente
jusqu'à ce que vous ayez commencé a comprendre le multithreading, étant donné quel les flux piped
sont employés pour communiquer entre les threads. Ceci est abordé avec un exemple au chapitre
14.
|
 |
 |
 |
Standard
I/O
|
 |
Standard E/S
|
 |
 |
 |
The term standard I/O refers to
the Unix concept (which is reproduced in some form in Windows and many other
operating systems) of a single stream of information that is used by a program.
All the program’s input can come from standard input, all its
output can go to standard output, and all of its error messages can be
sent to standard error. The value of standard I/O is that programs can
easily be chained together and one program’s standard output can become
the standard input for another program. This is a powerful
tool.
|
 |
Le terme d'E/S standard se réfere au concept d'Unix (qui est
reproduit sous une certaine forme dans Windows et bien d'autres systèmes d'exploitations) d'un
simple flux d'information qui est utilisé par un programme. Toutes les entrées du programme peuvent
provenir d'une entrée standard, toutes ses sorties peuvent aller vers une sortie
standard, et tous les messages d'erreur peuvent être envoyés à une erreur standard.
L'importance de l'E/S standard est que le programme peut être facilement mis en chaîne
simultanément et la sortie standard d'un programme peut devenir l'entrée standard pour un autre
programme. C'est un outil puissant.
|
 |
 |
 |
Reading from standard input
|
 |
Lire depuis une entrée standard
|
 |
 |
 |
Following the standard I/O model, Java
has System.in, System.out, and System.err. Throughout this
book you’ve seen how to write to standard output using System.out,
which is already prewrapped as a PrintStream object. System.err is
likewise a PrintStream, but System.in is a raw InputStream,
with no wrapping. This means that while you can use System.out and
System.err right away, System.in must be wrapped before you can
read from it.
|
 |
Suivant le modèle d'E/S standard, Java possède System.in,
System.out, et System.err. Tout au long de ce livre vous avez vu
comment écrire vers une sortie standard en utilisant System.out, qui est déjà
pré-envellopé comme un objet PrintStream. System.err est semblable a
PrintStream, mais System.in est un InputStream
brut, sans emballage. Ceci signifie que bien que vous pouvez utiliser System.out
et System.err immédiatement, System.in doit être envellopé avant
de pouvoir lire depuis celui-ci.
|
 |
 |
 |
Typically, you’ll want to read
input a line at a time using readLine( ), so you’ll want to
wrap System.in in a BufferedReader. To do this, you must convert
System.in to a Reader using InputStreamReader. Here’s
an example that simply echoes each line that you type in:
|
 |
Typiquement, vous désirerez lire l'entrée une ligne à la fois en utilisant
readLine(), donc vous devrez envelloper System.in dans un
BufferedReader. Pour cela, vous devrez convertir System.in en un
Reader par l'usage d'InputStreamReader. Voici un exemple qui fait
simplement écho de chaque ligne que vous tapez :
|
 |
 |
 |
//: c11:Echo.java // How to read from standard input. import java.io.*;
public class Echo { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); String s; while((s = in.readLine()).length() != 0) System.out.println(s); // An empty line terminates the program } } ///:~
|
 |
//: c11:Echo.java // Comment lire depuis l'entrée standard. import java.io.*;
public class Echo { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); String s; while((s = in.readLine()).length() != 0) System.out.println(s); // Une ligne vide met fin au programme. } } ///:~
|
 |
 |
 |
The reason for the exception
specification is that
readLine( ) can
throw an IOException. Note that System.in should usually be
buffered, as with most streams.
|
 |
Le sens de l'instruction d'exception est que readLine()
peut lancer une IOException. Notez que pourra généralement être mit en tampon,
comme avec la majorité des fluxs
|
 |
 |
 |
Changing System.out to a PrintWriter
|
 |
Modifier System.out en un PrintWriter
|
 |
 |
 |
System.out is a
PrintStream, which is an OutputStream. PrintWriter has a
constructor that takes an OutputStream as an argument. Thus, if you want
you can convert System.out into a PrintWriter using that
constructor:
|
 |
System.out est un PrintStream, qui est un
OutputStream. PrintWriter a un constructeur qui prend un
OutputStream comme argument. Ainsi, si vous le désirez vous pouvez convertir
System.out en un PrintWriter en utilisant ce constructeur
:
|
 |
 |
 |
//: c11:ChangeSystemOut.java // Turn System.out into a PrintWriter. import java.io.*;
public class ChangeSystemOut { public static void main(String[] args) { PrintWriter out = new PrintWriter(System.out, true); out.println("Hello, world"); } } ///:~
|
 |
//: c11:ChangeSystemOut.java // Tourne System.out en un PrintWriter. import java.io.*;
public class ChangeSystemOut { public static void main(String[] args) { PrintWriter out = new PrintWriter(System.out, true); out.println("Hello, world"); } } ///:~
|
 |
 |
 |
It’s important to use the
two-argument version of the PrintWriter constructor and to set the second
argument to true in order to enable automatic flushing, otherwise you may
not see the output.
|
 |
Il est important d'utiliser la version à deux arguments du constructeur
PrintWriter et de fixer le deuxième argument a true afin de
permettre un vidage automatique, sinon vous ne verriez pas la sortie.
|
 |
 |
 |
Redirecting standard
I/O
|
 |
Réorienter l'E/S standard
|
 |
 |
 |
The Java System class allows you
to redirect the standard input, output, and error I/O streams using simple
static method calls:
|
 |
La classe Java System vous permet de rediriger l'entrée,
la sortie, et l'erreur standard des flux d'E/S en employant un simple appel aux méthodes statiques
:
|
 |
 |
 |
setIn(InputStream)
setOut(PrintStream) setErr(PrintStream)
|
 |
setIn(InputStream)
setOut(PrintStream)
setErr(PrintStream)
|
 |
 |
 |
Redirecting output is especially useful
if you suddenly start creating a large amount of output on your screen and
it’s scrolling past faster than you can read
it.[59] Redirecting
input is valuable for a command-line program in which you want to test a
particular user-input sequence repeatedly. Here’s a simple example that
shows the use of these methods:
|
 |
Réorienter la sortie est particulierement utile si vous commencez
soudainement a créer une grande quantité de sortie sur l'écran et qu'il défile jusqu'à la fin plus
vite que vous ne pouvez le lire. [59] Réorienter l'entrée est
précieux pour un programme en ligne de commande dans lequel vous désirez tester un ordre d'
entrée-utilisateur particulièr à plusieurs reprises. Voici un exemple simple qui montre
l'utilisation de ces méthodes :
|
 |
 |
 |
//: c11:Redirecting.java // Demonstrates standard I/O redirection. import java.io.*;
class Redirecting { // Throw exceptions to console: public static void main(String[] args) throws IOException { BufferedInputStream in = new BufferedInputStream( new FileInputStream( "Redirecting.java")); PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream("test.out"))); System.setIn(in); System.setOut(out); System.setErr(out);
BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String s; while((s = br.readLine()) != null) System.out.println(s); out.close(); // Remember this! } } ///:~
|
 |
//: c11:Redirecting.java // Demonstration de reorientation d'E/S standard. import java.io.*;
class Redirecting { // Lance les exeptions vers la console : public static void main(String[] args) throws IOException { BufferedInputStream in = new BufferedInputStream( new FileInputStream( "Redirecting.java")); PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream("test.out"))); System.setIn(in); System.setOut(out); System.setErr(out);
BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String s; while((s = br.readLine()) != null) System.out.println(s); out.close(); // Rappelez-vous de ça ! } } ///:~
|
 |
 |
 |
This program attaches standard input to a
file, and redirects standard output and standard error to another
file.
|
 |
Ce programme attache la sortie standard à un ficher, et redirige la sortie
standard et l'erreur standard vers un autre fichier.
|
 |
 |
 |
I/O redirection manipulates streams of
bytes, not streams of characters, thus InputStreams and
OutputStreams are used rather than Readers and
Writers.
|
 |
La redirection d'E/S manipule les fluxs de bytes, mais pas les fluxs de
caractères, ainsi InputStreams et OutputStreams sont plus
utilisés que les Readers et Writers.
|
 |
 |
 |
Compression
|
 |
Compression
|
 |
 |
 |
The Java I/O library contains classes to
support reading and writing streams in a compressed format. These are wrapped
around existing I/O classes to provide compression
functionality.
|
 |
La librairie (ndt : ou bibliothèque) d'E/S Java contient des classes pour
supporter la lecture et l'écriture de flux dans des formats compressés. Ceux-ci sont envellopés
autour des classes existantes d'E/S pour fournir des fonctionnalités de compression.
|
 |
 |
 |
These classes are not derived from the
Reader and Writer classes, but instead are part of the
InputStream and OutputStream hierarchies. This is because the
compression library works with bytes, not characters. However, you might
sometimes be forced to mix the two types of streams. (Remember that you can use
InputStreamReader and OutputStreamWriter to provide easy
conversion between one type and another.)
|
 |
Ces classes ne sont pas dérivée des classes Reader et
Writer, mais à la place font partie des hiérarchies d'InputStream
et OutputStream. Ceci parcque la libraire de compression fonctionne avec des
bytes, pas des caractères. Cependant, vous serez parfois forcés de mixer les deux types de fluxs.
(Rappellez-vous que vous pouvez utiliser InputStreamReader et
OutputStreamWriter pour fournirune conversion facile entre un type et un
autre.)
|
 |
 |
 |
Compression class
|
Function
|
CheckedInputStream
|
GetCheckSum( ) produces
checksum for any InputStream (not just decompression).
|
CheckedOutputStream
|
GetCheckSum( ) produces
checksum for any OutputStream (not just compression).
|
DeflaterOutputStream
|
Base class for compression
classes.
|
ZipOutputStream
|
A DeflaterOutputStream that
compresses data into the Zip file format.
|
GZIPOutputStream
|
A DeflaterOutputStream that
compresses data into the GZIP file format.
|
InflaterInputStream
|
Base class for decompression
classes.
|
ZipInputStream
|
An InflaterInputStream that
decompresses data that has been stored in the Zip file format.
|
GZIPInputStream
|
An InflaterInputStream that
decompresses data that has been stored in the GZIP file format.
|
|
 |
Classe de compression
|
Fonction
|
CheckedInputStream
|
GetCheckSum() fait une checksum (vérification du nombre de
bits transmis afin de deceler des erreurs de transmition) pour n'importe quel
InputStream (non pas une simple décompression).
|
CheckedOutputStream
|
GetCheckSum() fait une checksum pour n'importe quel
OutputStream (non pas une simple
compression).
|
DeflaterOutputStream
|
Classe de base pour les classes de compression.
|
ZipOutputStream
|
Un DeflaterOutputStream qui compresse les données au
format Zip.
|
GZIPOutputStream
|
Un DeflaterOutputStream qui compresse les données au
format GZIP.
|
InflaterInputStream
|
Classe de base pour les classes de décompression.
|
ZipInputStream
|
Un InflaterInputStream qui décompresse les données qui
sont stockées au format Zip.
|
GZIPInputStream
|
Un InflaterInputStream qui décompresse les données qui
sont stockées au format GZIP.
|
|
 |
 |
 |
Although there are many compression
algorithms, Zip and GZIP are possibly the most commonly used. Thus you can
easily manipulate your compressed data with the many tools available for reading
and writing these formats.
|
 |
Bien qu'il y ait de nombreux algorithmes de compression, Zip et GZIP sont
peut-être ceux employés le plus courament. Ainsi vous pouvez facilement manipuler vos données
compressées avec les nobreux outils disponibles pour écrire et lire ces formats.
|
 |
 |
 |
Simple compression with GZIP
|
 |
Compression simple avec GZIP
|
 |
 |
 |
The GZIP interface is simple and thus is
probably more appropriate when you have a single stream of data that you want to
compress (rather than a container of dissimilar pieces of data). Here’s an
example that compresses a single file:
|
 |
L'interface GZIP est simple et est ainsi la plus appropriée quand vous avez
un simple flux de donnée que vous désirez compresser (plutôt qu'un récipient (container) de pièces
différentes de données. Voici un exemple qui compresse un simple fichier :
|
 |
 |
 |
//: c11:GZIPcompress.java // Uses GZIP compression to compress a file // whose name is passed on the command line. import java.io.*; import java.util.zip.*;
public class GZIPcompress { // Throw exceptions to console: public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader( new FileReader(args[0])); BufferedOutputStream out = new BufferedOutputStream( new GZIPOutputStream( new FileOutputStream("test.gz"))); System.out.println("Writing file"); int c; while((c = in.read()) != -1) out.write(c); in.close(); out.close(); System.out.println("Reading file"); BufferedReader in2 = new BufferedReader( new InputStreamReader( new GZIPInputStream( new FileInputStream("test.gz")))); String s; while((s = in2.readLine()) != null) System.out.println(s); } } ///:~
|
 |
//: c11:GZIPcompress.java // Utilise la compression GZIP pour compresser un fichier // dont le nom est passé en ligne de commande. import java.io.*; import java.util.zip.*;
public class GZIPcompress { // Lance les exceptions vers la console : public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader( new FileReader(args[0])); BufferedOutputStream out = new BufferedOutputStream( new GZIPOutputStream( new FileOutputStream("test.gz"))); System.out.println("Writing file"); int c; while((c = in.read()) != -1) out.write(c); in.close(); out.close(); System.out.println("Reading file"); BufferedReader in2 = new BufferedReader( new InputStreamReader( new GZIPInputStream( new FileInputStream("test.gz")))); String s; while((s = in2.readLine()) != null) System.out.println(s); } } ///:~
|
 |
 |
 |
The use of the compression classes is
straightforward—you simply wrap your output stream in a
GZIPOutputStream or ZipOutputStream and your input stream in a
GZIPInputStream or ZipInputStream. All else is ordinary I/O
reading and writing. This is an example of mixing the char-oriented
streams with the byte-oriented streams: in uses the Reader
classes, whereas GZIPOutputStream’s constructor can accept only an
OutputStream object, not a Writer object. When the file is opened,
the GZIPInputStream is converted to a
Reader.
|
 |
L'emploi des classes de compression est simple — vous envellopez
simplement votre flux de sortie dans un GZIPOutputStream ou un
ZipOutputStream et votre flux d'entrée dans un GZIPInputStream ou
un ZipInputStream. Tout le reste étant de l'écriture normale d'entrée et de
sortie. C'est un exemple de mélange de fluxs orientés-char avec des fluxs
orientés-byte : in utilise la classe Reader, vu
que le constructeur de GZIPOutputStream peut seulement accepter un objet
OutputStream, et non pas un objet Writer. Quand le fichier est
ouvert, le GZIPInputStream est convertit en un Reader.
|
 |
 |
 |
 |
 |
 |
 |
 |
|
 |
 |
 |