devstory

Le Tutoriel de Java Reader

  1. Reader
  2. read()
  3. read(char[])
  4. read(char[], int, int)
  5. read(java.nio.CharBuffer)
  6. close()
  7. skip(long)
  8. transferTo(Writer)
  9. markSupported()
  10. mark(int)
  11. reset()
  12. ready()

1. Reader

Reader est une classe du package java.io, qui est une classe de base représentant un flux de caractères (stream of characters) obtenu lors de la lecture d'une certaine source de données, comme un fichier texte, par exemple.
public abstract class Reader implements Readable, Closeable
En règle générale, vous ne pouvez pas utiliser directement la classe Reader, car il s'agit d'une classe abstraite. Mais dans un cas particulièrement spécifique, vous pouvez utiliser l'une de ses sous-classes.
Observer un scénario de lecture d'un fichier texte avec le codage UTF-8:
utf-8-file.txt
JP日本-八洲
UTF-8 utilise 1, 2, 3 ou 4 bytes pour stocker un caractère. L'image ci-dessous démontre les bytes dans le fichier susmentionné.
FileReader est une sous-classe de Reader souvent utilisée pour lire des fichiers texte et on obtiendra un flux de caractères. D'une manière ou d'une autre, les caractères UTF-8 seront convertis en caractères Java.
Remarque: le type char (caractère) en Java a une taille de 2 bytes. Par conséquent, les caractères de FileReader sont des caractères de 2 bytes.
Voir aussi mon explication sur la manière dont Java convertit les caractères UTF-8 en caractères Java:
Reader Methods
public static Reader nullReader()   

public int read(java.nio.CharBuffer target) throws IOException  

public int read() throws IOException  

public int read(char cbuf[]) throws IOException  

public int read(char cbuf[], int off, int len) throws IOException  

public long skip(long n) throws IOException  

public boolean ready() throws IOException   

public boolean markSupported()  

public void mark(int readAheadLimit) throws IOException  

public void reset() throws IOException   

public void close() throws IOException  

public long transferTo(Writer out) throws IOException

2. read()

public int read() throws IOException
La méthode read() permet de lire un caractère, ce qui renvoie le nombre de caractères qui vient d'être lu (Un entier compris entre 0 et 65535), ou -1 s'il a atteint la fin du flux (the stream).
Cette méthode sera bloquée jusqu'à ce que le caractère disponible ou qu'une erreur IO se produise, ou ait atteint la fin du flux.
Par exemple:
Reader_read_ex1.java
package org.o7planning.reader.ex;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Reader_read_ex1 {

    public static void main(String[] args) throws IOException {
        // StringReader is a subclass of Reader.
        Reader reader = new StringReader("JP日本-八洲");

        int charCode;
        while((charCode = reader.read()) != -1) {
            System.out.println((char)charCode + " " + charCode);
        }
        reader.close();
    }
}
Output:
J 74
P 80
日 26085
本 26412
- 45
八 20843
洲 27954

3. read(char[])

public int read(char[] cbuf) throws IOException
La méthode read(char[]) lit les caractères et affecte les éléments du tableau et renvoie le nombre de caractères que vous venez de lire. Cette méthode renvoie -1 si elle a atteint la fin du flux.
Cette méthode sera bloquée jusqu'à ce que les caractères soient disponibles ou qu'une erreur IO se produise, ou ait atteint la fin du flux.
En règle générale, l'utilisation de la méthode read(char[]) donne une meilleure performance que la méthode read(), car elle réduit le nombre de fois qu'elle doit lire à partir du flux.
Reader_read_ex1.java
package org.o7planning.reader.ex;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Reader_read_ex2 {

    public static void main(String[] args) throws IOException {
        // StringReader is a subclass of Reader.
        Reader reader = new StringReader("123456789-987654321-12345");
 
        // Create a temporary char array.
        char[] temp = new char[10];
        int charCount = -1;
         
        while ((charCount = reader.read(temp)) != -1) {
            String s = new String(temp, 0, charCount);
            System.out.println(s);
        }
        reader.close();
    }
}
Output:
123456789-
987654321-
12345

4. read(char[], int, int)

public int read(char[] cbuf, int offset, int len) throws IOException
La méthode read(char[],int,int) lit les caractères et affecte les éléments du tableau de l'indice offset à l'indice offset+len, et renvoie le nombre de caractères que vous venez de lire. Cette méthode renvoie -1 si elle a atteint la fin du flux.
Cette méthode sera bloquée jusqu'à ce que les caractères soient disponibles ou qu'une erreur IO se produise, ou atteigne la fin du flux.

5. read(java.nio.CharBuffer)

public int read(java.nio.CharBuffer target) throws IOException
La méthode read(CharBuffer) est utilisée pour lire des caractères dans un objet CharBufffer et renvoyer le nombre de caractères lus à partir du flux ou -1 s'il a atteint la fin du flux.
Cette méthode sera bloquée jusqu'à ce que les caractères soient disponibles ou qu'une erreur IO se produise, ou ait atteint la fin du flux.
Reader_read_ex3.java
package org.o7planning.reader.ex;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.nio.CharBuffer;

public class Reader_read_ex3 {

    public static void main(String[] args) throws IOException {
        // StringReader is a subclass of Reader.
        Reader reader = new StringReader("123456789-987654321-12345");
 
        CharBuffer cb = CharBuffer.allocate(10);
    
        // Read for the first time
        reader.read(cb);
        System.out.println(cb.flip().toString());
        
        // Read for the second time
        reader.read(cb);
        System.out.println(cb.flip().toString());
        
        // Read for the third time.
        reader.read(cb);
        System.out.println(cb.flip().toString());
        
        reader.close();  
    }
}
Output:
123456789-
987654321-
12345
  • Le Tutoriel de Java CharBuffer

6. close()

public void close() throws IOException
Fermer le flux et libérer toutes les ressources du système qui lui sont associées. Lorsque le flux est fermé, les autres appels read(), ready(), mark(), reset() ou skip() lèveront une IOException. La fermeture d'un flux précédemment fermé n'a aucun effet.
public interface Closeable extends AutoCloseable
La classe Reader implémente une interface Closeable. Si vous écrivez le code selon les règles d'AutoCloseable, le système fermera automatiquement le flux sans avoir à appeler directement la méthode close().
Reader_close_ex1.java
package org.o7planning.reader.ex;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Reader_close_ex1 {
    
    // Or Windows path: C:/Somefolder/utf8-file-without-bom.txt
    private static final String file_path = "/Volumes/Data/test/utf8-file-without-bom.txt";

    public static void main(String[] args) throws IOException {
        
        // (Reader class implements Closeable)
        // (Closeable interface extends AutoCloseable)
        // try block will automatically close stream for you.
        try (Reader fileReader= new FileReader(file_path)) {
            int code;
            while((code = fileReader.read()) !=  -1)  {
                System.out.println((char)code);
            }
        } // end try
    }
}
  • Le Tutoriel de Java Closeable

7. skip(long)

public long skip(long n) throws IOException
La méthode skip(long) saute le caractère "n".
Cette méthode sera bloquée jusqu'à ce que les caractères soient disponibles ou qu'une erreur IO se produise, ou ait atteint la fin du flux.
Reader_skip_ex1.java
package org.o7planning.reader.ex;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Reader_skip_ex1 {

    public static void main(String[] args) throws IOException {
        // StringReader is a subclass of Reader.
        Reader reader = new StringReader("123456789-987654321-ABCDE");

        int firstCharCode = reader.read();
        int secondCharCode = reader.read();

        System.out.println("First character: " + (char) firstCharCode);
        System.out.println("Second character: " + (char) secondCharCode);

        reader.skip(18); // Skips 18 characters.

        int code;
        while ((code = reader.read()) != -1) {
            System.out.println((char) code);
        }
        reader.close();
    }
}
Output:
First character: 1
Second character: 2
A
B
C
D
E

8. transferTo(Writer)

// Java 10+
public long transferTo(Writer out) throws IOException
La méthode transferTo(Writer) est utilisée pour lire tous les caractères de l'actuel Reader et les écrire dans l'objet Writer spécifié, et renvoyer le nombre de caractères transférés vers Writer. Une fois terminé, l'actuel objet Reader se trouvera à la fin du flux. Cette méthode ne fermera pas l'actuel objet Reader ou l'objet Writer.
Reader_transferTo_ex1.java
package org.o7planning.reader.ex;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.Writer;

public class Reader_transferTo_ex1 {

    public static void main(String[] args) throws IOException {
        // StringReader is a subclass of Reader.
        Reader reader = new StringReader("123456789-987654321-ABCDE");

        // Or Windows path: C:/Somepath/out-file.txt
        File file = new File("/Volumes/Data/test/out-file.txt");
        // Create parent folder.
        file.getParentFile().mkdirs();

        Writer writer = new FileWriter(file);

        reader.skip(10); // Skips 10 characters.

        reader.transferTo(writer);

        reader.close();
        writer.close();
    }
}
Output:
out-file.txt
987654321-ABCDE

9. markSupported()

public boolean markSupported()
La méthode markSupported() est utilisée pour vérifier si l'actuel objet Reader prend en charge l'opération mark(int). (Voir aussi méthode mark(int))
Reader
markSupported()?
StringReader
true
CharArrayReader
true
BufferedReader
true
LineNumberReader
true
FilterReader
true or false
InputStreamReader
false
FileReader
false
PushbackReader
false

10. mark(int)

public void mark(int readAheadLimit) throws IOException
La méthode mark(int) vous permet de marquer la position actuelle sur le flux. Vous pouvez continuer à lire le caractère suivant et appeler la méthode reset() pour revenir à la position précédemment marquée, dans laquelle readAheadLimit est le nombre maximal de caractères pouvant être lus après le marquage sans perdre la position marquée.
Remarque: Tous les Reader(s) ne prennent pas en charge l'opération mark(int). Pour vous rassurer, il faut convoquer la méthode markSupported() pour vérifier si l'actuel objet Reader prend en charge cette opération.
Reader_mark_ex1.java
package org.o7planning.reader.ex;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Reader_mark_ex1 {

    public static void main(String[] args) throws IOException {
        // StringReader is a subclass of Reader.
        Reader reader = new StringReader("123456789-987654321-ABCDE");

        reader.skip(10); // Skips 10 characters.

        System.out.println("StringReader markSupported? " + reader.markSupported()); // true
        
        reader.mark(9);
        
        int code1 = reader.read();
        int code2 = reader.read();
        
        System.out.println((char) code1); // '9'
        System.out.println((char) code2); // '8'
        reader.skip(5);
        
        System.out.println("Reset");
        reader.reset(); // Return to the marked position.
        
        int code;
        while((code = reader.read())!= -1) {
            System.out.println((char)code);
        }
        reader.close();
    }
}
Output:
StringReader markSupported? true
9
8
Reset
9
8
7
6
5
4
3
2
1
-
A
B
C
D
E

11. reset()

public void reset() throws IOException
Si cet objet Reader prend en charge le marquage de la position actuelle via la méthode mark(int), alors reset() est utilisé pour revenir à la position marquée.

12. ready()

public boolean ready() throws IOException
La méthode ready() renvoie true s'il y a un caractère disponible sur le flux à lire sans avoir à attendre, sinon elle renvoie false.

Tutoriels Java IO

Show More