Heim  >  Artikel  >  Java  >  Analyse von I/O-Eingabe- und Ausgabebeispielen in Java

Analyse von I/O-Eingabe- und Ausgabebeispielen in Java

WBOY
WBOYnach vorne
2023-05-13 15:40:061456Durchsuche

    Vorwort

    Die in Variablen, Arrays und Objekten gespeicherten Daten sind vorübergehend vorhanden und verschwinden nach Programmende verloren . Um die erstellten Daten dauerhaft speichern zu können, müssen diese in Datenträgerdateien gespeichert werden, damit sie in anderen Programmen verwendet werden können. Die I/O-Technologie von Java kann Daten in Textdateien, Binärdateien und sogar ZIP-komprimierten Dateien speichern und erfüllt damit die Anforderungen für eine dauerhafte Datenspeicherung. Die Beherrschung der I/O-Verarbeitungstechnologie kann die Datenverarbeitungsfähigkeiten verbessern.

    1. Übersicht über Streams

    Ein Stream ist eine Menge geordneter Datensequenzen, die in zwei Typen unterteilt werden können: Eingabestream und Ausgabe Strom. Der I/O-Stream (Eingabe/Ausgabe) stellt ein Kanalprogramm bereit, mit dem eine Folge von Bytes von der Quelle zum Ziel gesendet werden kann. Obwohl I/O-Streams normalerweise mit dem Zugriff auf Festplattendateien verbunden sind, können Quelle und Ziel eines Programms auch die Tastatur, die Maus, der Speicher oder das Monitorfenster sein.
    Java verarbeitet den Eingabe-/Ausgabemodus nach Datenstrom. Das Programm liest die Daten in der Quelle aus dem Eingabestrom, der auf die Quelle verweist. Die Quelle kann eine Datei, ein Netzwerk, ein komprimiertes Paket oder eine andere Datenquelle sein.
    Der Ausgabestream zeigt auf das Ziel, an dem die Daten erreicht werden sollen, und das Programm liefert Informationen an das Ziel, indem es Daten in den Ausgabestream schreibt.

    2. Eingabe-/Ausgabestream

    Die Java-Sprache definiert viele Klassen, die speziell für verschiedene Formen der Eingabe/Ausgabe verantwortlich sind. Solche Klassen werden im java.io-Paket platziert . Unter diesen sind alle Eingabestreamklassen Unterklassen der abstrakten Klasse InputStream (Byte-Eingabestream) oder der abstrakten Klasse Reader (Zeicheneingabestream); und alle Ausgabestreams sind die abstrakte Klasse OutputStream (Byte-Ausgabestream) oder die abstrakte Klasse Writer (Eine Unterklasse von Zeichen). Ausgabestrom).

    1. Eingabestream

    Die InputStream-Klasse ist eine abstrakte Klasse von Byte-Eingabestreams und die übergeordnete Klasse aller Byte-Eingabestreams. Die spezifische Hierarchie der InputStream-Klasse ist wie folgt.
    Alle Methoden in dieser Klasse lösen eine IOException aus, wenn ein Fehler auftritt. Nachfolgend finden Sie eine kurze Beschreibung einiger Methoden dieser Klasse.

    read()-Methode: Liest das nächste Datenbyte aus dem Eingabestream. Gibt einen int-Byte-Wert im Bereich von 0 bis 255 zurück. Wenn keine Bytes verfügbar sind, weil das Ende des Streams erreicht wurde, ist der Rückgabewert -1.
    read(byte[] b): Liest eine bestimmte Länge von Bytes aus dem Eingabestream und gibt die Anzahl der Bytes in Form einer Ganzzahl zurück.
    mark(int readlimit)-Methode: Platzieren Sie eine Markierung an der aktuellen Position des Eingabestreams. Der Parameter readlimit teilt diesem Eingabestream mit, wie viele Bytes gelesen werden dürfen, bevor die Markierungsposition abläuft.
    reset()-Methode: Gibt den Eingabezeiger auf die aktuelle Markierung zurück.
    skip(long n)-Methode: Überspringen Sie n Bytes im Eingabestream und geben Sie die tatsächliche Anzahl der übersprungenen Bytes zurück.
    markSupported()-Methode: Gibt true zurück, wenn der aktuelle Stream mark()/reset()-Operationen unterstützt.
    close-Methode: Schließen Sie diesen Eingabestream und geben Sie alle mit dem Stream verknüpften Systemressourcen frei.

    Zeichen in Java sind Unicode-codiert und sind Doppelbyte. InputStream wird zur Verarbeitung von Bytes verwendet und ist nicht für die Verarbeitung von Zeichentext geeignet. Java bietet einen separaten Satz von Reader-Klassen speziell für die Eingabe von Zeichentexten. Die Reader-Klasse ist jedoch kein Ersatz für die InputStream-Klasse. Sie vereinfacht lediglich die Programmierung bei der Verarbeitung von Zeichenfolgen. Die Reader-Klasse ist eine abstrakte Klasse von Zeicheneingabeströmen, und alle Implementierungen von Zeicheneingabeströmen sind ihre Unterklassen.

    Die Methoden in der Reader-Klasse ähneln denen in der InputStream-Klasse. Leser können bei Bedarf die JDK-Dokumentation überprüfen.

    2. Ausgabestream

    Die OutputStream-Klasse ist eine abstrakte Klasse von Byte-Ausgabestreams. Diese abstrakte Klasse ist die Superklasse aller Klassen, die Ausgabebytestreams darstellen.
    Alle Methoden in der OutputStream-Klasse geben void zurück und eine IoException wird ausgelöst, wenn ein Fehler auftritt. Im Folgenden finden Sie eine kurze Einführung in die Methoden in der OutputStream-Klasse.

    write(int b) Methode: Schreiben Sie die angegebenen Bytes in diesen Ausgabestream.
    write(byte[] b)-Methode: Schreiben Sie b Bytes aus dem angegebenen Byte-Array in diesen Ausgabestream.
    write(byte[] b, int off, int len) Methode: Schreibe len Bytes beginnend mit Offset Off im angegebenen Byte-Array in diesen Ausgabestream.
    flush()-Methode: Vervollständigen Sie die Ausgabe vollständig und leeren Sie den Cache-Bereich.
    close()-Methode: Schließt den Ausgabestream.

    3. Dateiklasse

    Die Dateiklasse ist das einzige Objekt im java.io-Paket, das die Festplattendatei selbst darstellt. Die File-Klasse definiert einige plattformunabhängige Methoden zum Betreiben von Dateien. Sie können Dateien erstellen, löschen, umbenennen und andere Vorgänge ausführen, indem Sie Methoden in der File-Klasse aufrufen. Objekte der File-Klasse werden hauptsächlich verwendet, um einige Informationen über die Datei selbst zu erhalten, z. B. das Verzeichnis, in dem sich die Datei befindet, die Länge der Datei, Lese- und Schreibberechtigungen für die Datei usw. Datenströme können Daten in Dateien schreiben, und Dateien sind auch die am häufigsten verwendeten Datenträger für Datenströme.

    1. Erstellen und Löschen von Dateien

    Sie können die File-Klasse verwenden, um ein Dateiobjekt zu erstellen. Die folgenden drei Konstruktionsmethoden werden normalerweise zum Erstellen von Dateiobjekten verwendet.

    1, File(String pathname)

    Dieser Konstruktor erstellt eine neue Dateiinstanz, indem er die angegebene Pfadnamenzeichenfolge in einen abstrakten Pfadnamen umwandelt.

    Die Syntax lautet wie folgt:

    new File(String pathname);

    wobei pathname den Pfad angibt Name (einschließlich Dateiname). Zum Beispiel:

    Datei file = new File(“d:/1.txt”);

    2. File(String parent,String child)

    Dieser Konstruktor erstellt ein neues Dateiobjekt basierend auf den definierten übergeordneten Pfad- und untergeordneten Pfadzeichenfolgen (einschließlich Dateinamen).

    Die Syntax lautet wie folgt:

    new File(String parent,String child);

    3, File(File f, String child)

    Dieser Konstruktor erstellt eine neue Dateiinstanz basierend auf dem übergeordneten abstrakten Pfadnamen und der untergeordneten Pfadnamenzeichenfolge.

    Die Syntax lautet wie folgt:

    new File(File f,String child);

    2. Dateiinformationen abrufen

    Die File-Klasse bietet viele Methoden zum Abrufen einiger Informationen über die Datei selbst. Wie in der folgenden Tabelle gezeigt

    #Methode |. -------- | String|. Holen Sie sich den Namen der Datei

    length()|long |. Holen Sie sich die Länge der Datei (in Bytes)
    getAbsolutePath() | () |. String |. Ermitteln Sie, ob die Datei vorhanden ist.
    isHidden( ) |. Bestimmen Sie, ob es sich bei der Datei um eine versteckte Datei handelt


    4. 🎜🎜#
    Während der Ausführung des Programms befinden sich die meisten Daten im Speicher. Führen Sie Vorgänge aus und diese Daten verschwinden, wenn das Programm endet oder geschlossen wird. Wenn Sie die Daten dauerhaft speichern müssen, können Sie den Datei-Eingabe-/Ausgabestream verwenden, um eine Verbindung mit der angegebenen Datei herzustellen und die erforderlichen Daten dauerhaft in der Datei zu speichern.

    1. FillInputStream- und FileOutputStream-Klassen

    Sowohl die FileInputStream-Klasse als auch die FileOUtputStream-Klasse werden zum Betreiben von Festplattendateien verwendet. Wenn die Dateileseanforderungen des Benutzers relativ einfach sind, können Sie die FileInputString-Klasse verwenden, die von der InputString-Klasse erbt. Die FileOutputStream-Klasse entspricht der FileInputStream-Klasse und bietet grundlegende Funktionen zum Schreiben von Dateien. Die FileOutputStream-Klasse ist eine Unterklasse der OutputStream-Klasse.
    Die häufig verwendeten Konstruktionsmethoden der FileInputStream-Klasse lauten wie folgt:

    FileInputStream(String name)

    FileInputStream(File file)

    #🎜🎜 #

    2. FileReader- und FileWriter-Klassen

    Die Verwendung der FileOutputStream-Klasse zum Schreiben von Daten in eine Datei und die Verwendung der FileInputStream-Klasse zum Lesen von Inhalten aus einer Datei haben einen Nachteil, nämlich diese beiden Klassen Stellen Sie nur eine Methode zum Lesen von Bytes oder Byte-Arrays bereit. Da Hanzi zwei Bytes in der Datei belegt, kann es bei Verwendung eines Byte-Streams zu verstümmelten Zeichen kommen, wenn die Lesung nicht gut ist. In diesem Fall kann dieses Phänomen durch die Verwendung der Zeichen-Stream-Reader- oder Writer-Klasse vermieden werden.

    FileReader- und FileWriter-Zeichenströme entsprechen den FileInputStream- und FileOutputStream-Klassen. Der FileReader-Stream liest die Datei sequentiell, solange der Stream nicht geschlossen ist, liest jeder Aufruf der read()-Methode sequentiell den Rest des Quellinhalts, bis das Ende der Quelle oder des Streams geschlossen wird.

    5. Ein-/Ausgabestream mit Cache

    Cache ist eine Leistungsoptimierung von I/O. Cache-Streams fügen I/O-Streams einen Speicher-Cache-Bereich hinzu. Mit dem Pufferbereich ist es möglich, die Methoden „skip()“, „mark()“ und „reset()“ auf dem Stream auszuführen.

    1. BufferedInputStream- und BufferedOutputStream-Klassen

    Die BufferedInputStream-Klasse kann alle InputStream-Klassen mit Puffern umschließen, um die Leistung zu optimieren. Die BufferedInputStream-Klasse verfügt über zwei Konstruktoren:

    BufferedInputStream(InputStream in)

    BufferedInputStream(InputStream in, int size)

    Eine Konstruktion Die Methode erstellt einen Puffer von 32 Bytes und die zweite Konstruktionsmethode erstellt einen Puffer der angegebenen Größe.

    2. BufferedReader- und BufferedWriter-Klassen

    Die BufferedReader-Klasse und die BufferedWriter-Klasse erben die Reader-Klasse bzw. die Writer-Klasse. Beide Klassen verfügen außerdem über interne Caching-Mechanismen und können Ein-/Ausgaben in Zeileneinheiten durchführen.

    6. Dateneingabe-/-ausgabeströme

    Dateneingabe-/-ausgabeströme (DataInputStream-Klasse und DataOutputStream-Klasse) ermöglichen es Anwendungen, maschinenunabhängig aus dem zugrunde liegenden Eingabestrom zu lesen Nehmen Sie grundlegende Java-Datentypen. Mit anderen Worten: Beim Lesen eines Datenelements müssen Sie sich keine Gedanken mehr darüber machen, welche Art von Byte der Wert haben soll.

    7. ZIP-Komprimierungs-Eingabe-/Ausgabestream

    ZIP-Komprimierungsverwaltungsdatei (ZIP-Archiv) ist eine sehr typische Form der Dateikomprimierung, die Speicherplatz sparen kann. In Bezug auf die E/A-Implementierung der ZIP-Komprimierung bieten die integrierten Klassen von Java sehr nützliche verwandte Klassen, sodass die Implementierung sehr einfach ist. In diesem Abschnitt wird die Verwendung der Klassen ZipOutputStream und ZipInputStream im Paket java.util.zip vorgestellt, um eine Dateikomprimierung/-dekomprimierung zu erreichen. Wenn Sie eine Datei aus einer ZIP-komprimierten Verwaltungsdatei lesen möchten, müssen Sie zunächst den „Verzeichniseinstiegspunkt“ der entsprechenden Datei finden (anhand dessen Sie den Speicherort der Datei in der ZIP-Datei ermitteln können), bevor Sie den Inhalt lesen können der Datei. Wenn Sie den Dateiinhalt in eine ZIP-Datei schreiben möchten, müssen Sie zuerst den der Datei entsprechenden „Verzeichniseinstiegspunkt“ schreiben und den Speicherort, an dem der Dateiinhalt geschrieben werden soll, an den Speicherort verschieben, auf den dieser Einstiegspunkt zeigt. und schreiben Sie dann den Dateiinhalt.

    Java实现了I/O数据流与网络数据流的单一接口,因此数据的压缩、网络传输和解压缩的实现比较容易。ZipEntry类产生的对象,是用来代表一个ZIP压缩文件内的进入点(entry)。ZipInputStream用来写出ZIP压缩格式的文件,所支持的包括已压缩及未压缩的进入点(entry)。

    ZipOutputStream类用来写出ZIp压缩格式的文件,而且所支持的包括已压缩及未压缩的进入点(entry)。下面介绍利用ZipEntry、

    ZipInputStream和ZipOutputStream3个Java类实现ZIP数据压缩方式的编程方法。

    1、压缩文件

    利用ZipOutputStream类对象,可将文件压缩为.zip文件。ZipOutputStream类的构造方法如下:

    ZipOutputStram(OutputStream out);

    ZipOutputStream类的常用方法如表所示:

    方法 返回值 说明
    putNextEntry(ZipEntry e) void 开始写一个新的ZipEntry,并将流内的位置移至此entry所指数据的开头
    write(byte[] b,int off,int len) void 将字节数组写入当前ZIP条目数据
    finish() void 完成写入ZIP输出流的内容,无须关闭它所配合的OutputStream
    setComment(String comment) void 可设置此ZIP文件的注释文字

    2、解压缩ZIP文件

    ZipInputStream类可读取ZIP压缩格式的文件,包括已压缩和未压缩的条目(entry)。ZipInputStream类的构造方法如下:

    ZipInputStream(InputStream in)

    ZipInputStream类的常用方法如下表所示:

    方法 返回值 说明
    read(byte[] b, int off , int len) int 读取目标b数组内off偏移量的位置,长度是len字节
    available() int 判断是否已读完目前entry所指定的数据。已读完返回0,否则返回1
    closeEntry() void 关闭当前ZIP条目并定位流以读取下一个条目
    skip(long n) long 跳过当前ZIP条目中指定的字节数
    getNextEntry() ZipEntry 读取下一个ZipEntry,并将流内的位置移至该entry所指数据的开头
    createZipEntry(String name) ZipEntry 以指定的name参数新建一个ZipEntry对象

    补充:获取目录下的所有目录和文件

    示例:假设目录“D:\TestDir1”下有两个文件夹(dir1 和 dir2)和一个文件 file1.txt 。

    File[] listFiles()方法:获取该目录下的所有子目录和文件,返回File类数组。

    import java.io.File;
     
    /**
     * 获取目录下的所有目录和文件
     * @author pan_junbiao
     **/
    public class DirFileTest
    {
        public static void main(String[] args)
        {
            File file = new File("D:\\TestDir1");
     
            //判断目录是否存在
            if (!file.exists())
            {
                System.out.println("目录不存在");
                return;
            }
     
            //获取文件数组
            File[] fileList = file.listFiles();
            for (int i = 0; i < fileList.length; i++)
            {
                //判断是否为目录
                if (fileList[i].isDirectory())
                {
                    System.out.println("目录:" + fileList[i].getName());
                }
                else
                {
                    System.out.println("文件:" + fileList[i].getName());
                }
            }
        }
    }

    执行结果:

    Analyse von I/O-Eingabe- und Ausgabebeispielen in Java

    Das obige ist der detaillierte Inhalt vonAnalyse von I/O-Eingabe- und Ausgabebeispielen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen