Les programmes incluent très souvent une exigence d'écrire rapidement des données dans un fichier ou ailleurs. Et cela soulève des questions : comment devrions-nous faire cela ? Quelle classe doit-on choisir ? Aujourd'hui, nous allons faire connaissance avec un candidat approprié pour ce rôle - la classe BufferedWriter .

Pourquoi avons-nous besoin de BufferedWriter ?

BufferedWriter est une classe qui écrit des caractères mis en mémoire tampon dans un flux. Il vous permet de réduire le nombre de fois où vous accédez à des supports physiques. Autrement dit, au lieu d'écrire un seul caractère à chaque fois, il écrit des données dans un tampon, puis écrit tous les caractères sur le support en une seule fois.

Cela augmente considérablement les vitesses d'écriture. La taille de tampon par défaut est de 8 192 caractères, mais cela peut être modifié en spécifiant une nouvelle taille dans le constructeur :


BufferedWriter(Writer in, int sz)

Ici, le premier argument du constructeur est un flux qui recevra les données que nous écrivons. Et il s'avère que sz est la taille du nouveau tampon.

Java a également une classe BufferedReader : elle est utilisée pour la lecture tamponnée des données.

Qu'est-ce qu'un tampon exactement ? Prenons un exemple concret. Un tampon est comme un panier ou un caddie dans un supermarché. Au lieu de marcher jusqu'à la caisse avec un seul article, de le payer, de le mettre dans le coffre de votre voiture, puis de revenir pour un autre article, nous pouvons prendre un panier, y mettre tout ce que nous voulons, puis payer à la caisse. C'est exactement comme ça qu'un tampon fonctionne : il collecte des données puis prend tout et l'écrit, au lieu d'écrire chaque fragment séparément.

Constructeurs et méthodes de la classe BufferedWriter

Examinons maintenant de plus près la classe BufferedWriter . Il existe deux constructeurs pour créer un objet :


public BufferedWriter(Writer out) 
public BufferedWriter(Writer out, int sz)

out dans les deux constructeurs est le flux dans lequel écrire, et sz , comme déjà mentionné, est la taille du tampon.

La classe BufferedWriter a également plusieurs méthodes. Nous allons en détailler certains aujourd'hui :

écrire (tableau de caractères []) Écrit un tableau de caractères dans le tampon
écrire (chaîne s, int off, int len) Écrit une partie d'une chaîne dans le tampon
ajouter (caractère c) Écrire un caractère dans le tampon
ajouter(CharSequence csq, int début, int fin) Écrit une partie d'un tableau dans le tampon
nouvelle ligne() Écrit un séparateur de ligne
affleurer() Vide le flux

Écrivons un programme qui écrira une valeur dans un fichier. Pour leÉcrivainparamètre, nous allons passer unFileWriterau constructeur. Il est utilisé pour écrire des fichiers texte et dispose de plusieurs constructeurs pour initialiser les objets :

FileWriter(Fichier fichier)
FileWriter(Fichier fichier, ajout booléen)
FileWriter(FileDescriptor fd)
FileWriter(String fileName)
FileWriter(String fileName, ajout booléen)

Pour notre exemple, nous allons utiliser un constructeur qui prend un nom de fichier :


try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message);
	bufferedWritter.flush();
}
catch(IOException ex){
System.out.println(ex.getMessage());
 }

Notre code utilisera la méthode write(String str) pour écrire str dans le fichier file.txt .

Il existe d'autres méthodes d'écriture :

  • write(char[] array ) — cette variante accepte et écrit un tableau de caractères ;

  • write(String s, int off, int len) — cette variante prend une chaîne s ; un offset off , qui est l'index du caractère à partir duquel commencer l'écriture ; et len ​​, qui est la longueur de la chaîne (sous-chaîne) à écrire.


try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message, 0, 11);
 	bufferedWriter.flush();

} catch(IOException ex) {
System.out.println(ex.getMessage());
}

Ce code écrira "Hello, Amig" dans le fichier, puisque nous avons dit à la méthode d'écrire 11 caractères à partir de l'index 0.

Notre code a également un bloc de ressources d'essai :


try(BufferedWriter bufferedWritter = new BufferedWriter(new FileWriter("file.txt"))) 

Cela signifie que la méthode close() est appelée automatiquement sur monbufferedWriterobjet, car il implémente l' interface AutoCloseable .

La méthode flush() dans le code est utilisée pour vider le flux de sortie, forçant l'écriture de tous les octets mis en mémoire tampon. L'écriture peut ne pas se produire sans cet appel, car c'est ce qui indique que le tampon doit être vidé et que les octets du tampon doivent être écrits.

La classe BufferedWriter a également une méthode newLine() qui ajoute une nouvelle ligne à notre message :


try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
        String message = "Hello, Amigo! This is a very important message!";
        bufferedWriter.write(message, 0, 13);
        bufferedWriter.newLine();
        bufferedWriter.write(message, 15, 33);
    } catch (IOException ex) {
        System.out.println(ex.getMessage());
    }

Dans le fichier, nous obtenons :

Bonjour Amigo !
C'est un message très important !

La signature de la méthode append() ressemble à ceci :


public Writer append(CharSequence csq, int start, int end)

Il est utilisé pour ajouter csq . Ici start est l'index du premier caractère, et end est l'index du dernier caractère de la chaîne (ou sous-chaîne) à insérer. Le caractère avec fin d'index n'est pas inséré.


try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
    String message = "Hello, Amigo! This is a very important message!";
    bufferedWriter.append(message, 0, 7);
    bufferedWriter.flush();
} catch (IOException ex) {
    System.out.println(ex.getMessage());
}

Ce code vous donnera :

Bonjour,

Autrement dit, avec la méthode append , vous spécifiez la partie de la chaîne à ajouter au tampon.

En regardant de plus près la différence entre write() et append() , nous voyons d'abord qu'ils font tous les deux la même chose en principe - ils écrivent des valeurs.

Cependant, la différence est que la méthode append est plus récente et prend un CharSequence comme argument, et parce que String implémente CharSequence , nous pouvons passer Strings et StringBuilders et StringBuffers à la méthode append . Mais la méthode write() n'acceptera qu'un String .

C'est tout pour le moment! Aujourd'hui, nous nous sommes familiarisés avec les tampons, comment effectuer une écriture tamponnée dans un fichier, ainsi que les méthodes que vous pouvez utiliser pour ce faire.