codestory

Die Anleitung zu Java PushbackInputStream

  1. PushbackInputStream
  2. Examples

1. PushbackInputStream

Wenn Sie mit einem binären Eingabestream (binary input stream) arbeiten, müssen Sie manchmal einige bytes im Voraus lesen, um zu sehen, was passieren wird, bevor Sie die Interpretation aktueller byte bestimmen und sie dann zurückschieben können. Mit der Klasse PushbackInputStream können Sie das tun.
PushbackInputStream verwaltet ein Objekt InputStream, das Objekt liest die Daten aus der Quelle (z.B die Datei), gleichzeitig verwaltet PushbackInputStream ein Array byte - buffer.
Im Beginnen werden keine byte dem Array buffer zugewiesen. Die Methode PushbackInputStream.read wird die bytes aus InputStream.read zurückgeben.
Wenn Sie die Methode PushbackInputStream.unread zum Zurückschieben der bytes aufrufen, werden sie in dem Array buffer gespeichert.
Wenn Sie nächste Mal die Methode PushbackInputStream.read aufrufen, werden die im Array buffer gespeicherten bytes zurückgegeben. Die Methode InputStream.read wird nur aufgerufen, wenn das Array buffer keine byte mehr enthält.
PushbackReader​ constructors
public PushbackReader​(Reader in, int size)

public PushbackReader​(Reader in)
  • Der Constructor PushbackInputStream(InputStream,int) erstellt ein Objekt PushbackInputStream mit dem Array buffer, dessen Größe angegeben wird.
  • Der Constructor PushbackInputStream(InputStream) erstellt ein Objekt PushbackInputStream mit dem Array buffer, dessen Größe default ist. (size = 1).

2. Examples

Angenommen, Sie speichern alle Daten von 3 Bildern in einer einzigen Datei, die durch "@@@" getrennt ist. Wie lese ich diese Datei und schreibe in 3 Bilddateien, die den Daten entsprechen?

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

Verwenden Sie PushbackInputStream um den Inhalt der obigen Datendatei zu lesen. Wenn Sie byte 64 ( @ ) treffen, müssen Sie die nächsten 2 bytes lesen, um zu entscheiden, was mit dem aktuellen byte umgehen soll.
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
Die Verwendung eines regulären InputStream zum Lesen jedes byte kostet viele Zeit. Sie sollten BufferedInputStream verwenden um die Leistung des obigen Beispiels zu verbessern:
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();
    }
}

Die Anleitungen Java IO

Show More