devstory

Le Tutoriel de Java PushbackInputStream

  1. PushbackInputStream
  2. Examples

1. PushbackInputStream

Parfois, lorsque vous travaillez avec un flux d'entrée binaire (binary input stream), vous devez lire quelques bytes à l'avance pour voir ce qui va se passer, avant de pouvoir définir l'interprétation actuelle des bytes, vous pouvez alors les repousser. La classe PushbackInputStream vous permet de le faire.
PushbackInputStream gère un objet InputStream, qui lit les données d'origine (comme un fichier, par exemple). En même temps, PushbackInputStream gère également un tableau de bytes - buffer.
Au départ, aucun byte n'est affecté au tableau de buffer. La méthode PushbackInputStream.read renvoie des bytes de InputStream.read.
Si vous convoquez la méthode PushbackInputStream.unread pour repousser les bytes, ils sont stockés dans un tableau de buffer.
La prochaine fois que vous convoquez la méthode PushbackInputStream.read, elle renvoie les bytes stockés dans le tableau de buffer. La méthode InputStream.read ne sera convoquée que s'il n'y a pas de bytes dans le tableau de buffer.
PushbackReader​ constructors
public PushbackReader​(Reader in, int size)

public PushbackReader​(Reader in)
  • Le constructeur PushbackInputStream(InputStream,int) crée un objet PushbackInputStream avec un tableau de buffer dont la taille est spécifiée.
  • Le constructeur PushbackInputStream(InputStream) crée un objet PushbackInputStream avec un tableau de buffer de taille par défaut (size = 1).

2. Examples

On suppose que vous stockiez toutes les données de 3 images dans un seul fichier. Ils sont séparés par "@@@". Comment lire ce fichier et écrire dans 3 fichiers images correspondant aux données?

..bytes..of..image1..@@@..bytes..of..image2..@@@..bytes..of..image3..

Utiliser PushbackInputStream pour lire le contenu du fichier de données ci-dessus. Lorsque vous rencontrez byte 64(@), vous devez lire les 2 bytes suivants pour décider ce qu'il faut faire avec le byte actuel.
PushbackInputStreamEx1.java
package org.o7planning.pushbackinputstream.ex;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.net.URL;

public class PushbackInputStreamEx1 {

    private static final String OUT_FOLDER = "/Volumes/Data/test/icons";
    
    private static final String url = "https://s3.o7planning.com/txt/google-emoticons-data.txt";

    public static void main(String[] args) throws IOException {
        InputStream is = new URL(url).openStream();

        PushbackInputStream pis = new PushbackInputStream(is, 2);
        
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int fileIdx = 0;

        int code;
        while ((code = pis.read()) != -1) {
            if (code == (int)'@') {
                int next1 = pis.read();
                int next2 = pis.read();

                if (next1 == '@' && next2 == '@') {
                    byte[] imageData = baos.toByteArray();
                    fileIdx++;
                    writeToFile(imageData,fileIdx); // Write Image file.

                    baos = new ByteArrayOutputStream();
                } else {
                    baos.write(code);
                    pis.unread(next2);
                    pis.unread(next1);
                }
            } else {
                baos.write(code);
            }
        }
        byte[] imageData = baos.toByteArray();
        fileIdx++;
        writeToFile(imageData,fileIdx);  // Write Image file.

        pis.close();
    }
    
    private static void writeToFile(byte[] data, int fileIdx) throws IOException {
        File file = new File(OUT_FOLDER +"/" + fileIdx + ".png");
        file.getParentFile().mkdirs();
        System.out.println("Write file: " + file.getAbsolutePath());
        
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(data);
        fos.close();
    }
}
Output:
Write file: /Volumes/Data/test/icons/1.png
Write file: /Volumes/Data/test/icons/2.png
Write file: /Volumes/Data/test/icons/3.png
L'utilisation d'un InputStream régulier pour lire chaque byte prendra beaucoup de temps, vous devez utiliser BufferedInputStream pour améliorer les performances de l'exemple ci-dessus:
PushbackInputStreamEx1b.java
package org.o7planning.pushbackinputstream.ex;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.net.URL;

public class PushbackInputStreamEx1b {

    private static final String OUT_FOLDER = "/Volumes/Data/test/icons";
    
    private static final String url = "https://s3.o7planning.com/txt/google-emoticons-data.txt";

    public static void main(String[] args) throws IOException {
        InputStream is = new URL(url).openStream();
        // Create BufferedInputStream object.
        BufferedInputStream bis = new BufferedInputStream(is);

        PushbackInputStream pis = new PushbackInputStream(bis, 2);
        
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int fileIdx = 0;

        int code;
        while ((code = pis.read()) != -1) {
            if (code == (int)'@') {
                int next1 = pis.read();
                int next2 = pis.read();

                if (next1 == '@' && next2 == '@') {
                    byte[] imageData = baos.toByteArray();
                    fileIdx++;
                    writeToFile(imageData,fileIdx); // Write Image file.

                    baos = new ByteArrayOutputStream();
                } else {
                    baos.write(code);
                    pis.unread(next2);
                    pis.unread(next1);
                }
            } else {
                baos.write(code);
            }
        }
        byte[] imageData = baos.toByteArray();
        fileIdx++;
        writeToFile(imageData,fileIdx);  // Write Image file.

        pis.close();
    }
    
    private static void writeToFile(byte[] data, int fileIdx) throws IOException {
        File file = new File(OUT_FOLDER +"/" + fileIdx + ".png");
        file.getParentFile().mkdirs();
        System.out.println("Write file: " + file.getAbsolutePath());
        
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(data);
        fos.close();
    }
}

Tutoriels Java IO

Show More