ホームページ  >  記事  >  Java  >  Java での I/O 入出力例の分析

Java での I/O 入出力例の分析

WBOY
WBOY転載
2023-05-13 15:40:061421ブラウズ

    まえがき

    変数、配列、オブジェクトに保存されたデータは一時的なもので、プログラムが終了すると失われます。作成したデータを永続的に保存するには、他のプログラムで使用できるようにディスク ファイルに保存する必要があります。 Java の I/O テクノロジは、データをテキスト ファイル、バイナリ ファイル、さらには ZIP 圧縮ファイルに保存でき、永続的なデータ ストレージの要件を満たします。 I/O 処理テクノロジを習得すると、データ処理能力を向上させることができます。

    1. ストリームの概要

    ストリームとは、順序付けられたデータの集合であり、操作の種類に応じて、入力ストリームと出力ストリームの 2 種類に分類できます。 I/O (入力/出力) ストリームは、ソースから宛先に一連のバイトを送信するために使用できるチャネル プログラムを提供します。通常、I/O ストリームはディスク ファイル アクセスに関連付けられますが、プログラムのソースと宛先がキーボード、マウス、メモリ、またはモニター ウィンドウである場合もあります。
    Java は、データ ストリームによって入出力モードを処理します。プログラムは、ソースを指す入力ストリームからソース内のデータを読み取ります。ソースには、ファイル、ネットワーク、圧縮パッケージ、またはその他のデータ ソースを使用できます。
    出力ストリームは、データが到達する宛先を指します。プログラムは、出力ストリームにデータを書き込むことによって、宛先に情報を転送します。

    2. 入出力ストリーム

    Java 言語では、さまざまな形式の入出力を特に担当する多くのクラスが定義されており、そのようなクラスは java.io パッケージに配置されています。このうち、すべての入力ストリーム クラスは抽象クラス InputStream (バイト入力ストリーム) または抽象クラス Reader (文字入力ストリーム) のサブクラスであり、すべての出力ストリームは抽象クラス OutputStream (バイト出力ストリーム) または抽象クラス Writer (文字のサブクラス)出力ストリーム)。

    1. 入力ストリーム

    InputStream クラスは、バイト入力ストリームの抽象クラスであり、すべてのバイト入力ストリームの親クラスです。 InputStream クラスの具体的な階層は以下のとおりです。
    このクラスのすべてのメソッドは、エラーが発生すると IOException をスローします。以下に、このクラスのいくつかのメソッドについて簡単に説明します。

    read() メソッド: 入力ストリームからデータの次のバイトを読み取ります。 0 ~ 255 の範囲の int バイト値を返します。ストリームの終わりに達したために使用可能なバイトがない場合、戻り値は -1 です。
    read(byte[] b): 入力ストリームから特定の長さのバイトを読み取り、バイト数を整数の形式で返します。
    mark(int readlimit) メソッド: 入力ストリームの現在位置にマークを配置します。readlimit パラメータは、マーク位置が期限切れになるまでに読み取ることができるバイト数をこの入力ストリームに伝えます。
    reset() メソッド: 入力ポインタを現在のマークに返します。
    skip(long n) メソッド: 入力ストリームの n バイトをスキップし、スキップされた実際のバイト数を返します。
    markSupported() メソッド: 現在のストリームが mark()/reset() 操作をサポートしている場合は true を返します。
    close メソッド: この入力ストリームを閉じ、ストリームに関連付けられているすべてのシステム リソースを解放します。

    Java の文字は Unicode でエンコードされており、2 バイトです。 InputStream はバイトの処理に使用され、文字テキストの処理には適していません。 Java では、文字テキストの入力用に独立した Reader クラスのセットが提供されています。ただし、Reader クラスは、InputStream クラスの代わりとなるものではありません。文字列を処理するときのプログラミングを簡素化するだけです。 Reader クラスは文字入力ストリームの抽象クラスであり、文字入力ストリームのすべての実装はそのサブクラスです。

    Reader クラスのメソッドは、InputStream クラスのメソッドと似ており、必要に応じて JDK ドキュメントを確認できます。

    2. 出力ストリーム

    OutputStream クラスはバイト出力ストリームの抽象クラスであり、出力バイト ストリームを表すすべてのクラスのスーパー クラスです。
    OutputStream クラスのすべてのメソッドは void を返し、エラーが発生すると IoException がスローされます。次に、OutputStream クラスのメソッドを簡単に紹介します。

    write(int b) メソッド: 指定されたバイトをこの出力ストリームに書き込みます。
    write(byte[] b) メソッド: 指定されたバイト配列から b バイトをこの出力ストリームに書き込みます。
    write(byte[] b, int off, int len) メソッド: 指定されたバイト配列のオフセット off から始まる len バイトをこの出力ストリームに書き込みます。
    flush() メソッド: 出力を完全に完了し、バッファ領域をクリアします。
    close() メソッド: 出力ストリームを閉じます。

    3. File クラス

    File クラスは、ディスク ファイル自体を表す java.io パッケージ内の唯一のオブジェクトです。 File クラスでは、ファイルを操作するためのプラットフォームに依存しないメソッドがいくつか定義されており、File クラスのメソッドを呼び出すことで、ファイルの作成、削除、名前変更などの操作を行うことができます。 File クラスのオブジェクトは主に、ファイルが存在するディレクトリ、ファイルの長さ、ファイルの読み取りおよび書き込み権限など、ファイル自体に関する情報を取得するために使用されます。データ ストリームはデータをファイルに書き込むことができ、ファイルはデータ ストリームで最も一般的に使用されるデータ メディアでもあります。

    1. ファイルの作成と削除

    File クラスを使用してファイル オブジェクトを作成できます。ファイルオブジェクトの作成には通常、次の 3 つの構築方法が使用されます。

    1. File(String pathname)

    このコンストラクターは、指定されたパス名文字列を抽象パス名に変換することによって、新しい File インスタンスを作成します。

    構文は次のとおりです:

    new File(String pathname);

    このうち、pathnameはパス名(ファイル名を含む)を指定します。 )。例:

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

    2. File(Stringparent,String child)

    このコンストラクターは、定義された親パスと子パス文字列 (ファイル名を含む) に基づいて新しい File オブジェクトを作成します。

    構文は次のとおりです:

    new File(String 親,String child);

    3. File(File f,String child)

    このコンストラクターは、親の抽象パス名と子のパス名の文字列に基づいて、新しい File インスタンスを作成します。

    構文は次のとおりです:

    new File(File f,String child);

    2. ファイル情報の取得

    File クラス ファイル自体に関する情報を取得するためのメソッドを多数提供します。次の表に示すように、

    メソッド | 戻り値 | 説明
    -------- | -----
    getName() | String| 名前を取得します。ファイルの
    canReda()| boolean | ファイルが読み取り可能かどうかを判断します
    canWrite()| boolean | ファイルが書き込み可能かどうかを判断します
    exits()|boolean | ファイルが存在するかどうかを判断します
    length()|long | ファイルの長さ (バイト単位) を取得します
    getAbsolutePath() | String | ファイルの絶対パスを取得します
    getParent() | String | ファイルの親パスを取得します
    isFile() | boolean | ファイルが存在するかどうかの判定
    isDirectory() | boolean | ファイルがディレクトリかどうかの判定
    isHidden() | boolean | ファイルが隠しファイルかどうかの判定
    lastModified () | long | ファイルの最終変更時刻を取得します

    4. ファイル入出力ストリーム

    プログラムの実行中、ほとんどのデータはメモリ内で操作されます。 . プログラムを終了または終了すると、これらのデータは消えます。データを永続的に保存する必要がある場合は、ファイル入出力ストリームを使用して、指定したファイルとの接続を確立し、必要なデータをファイルに永続的に保存できます。

    1. FillInputStream クラスと FileOutputStream クラス

    FileInputStream クラスと FileOUTputStream クラスは、両方ともディスク ファイルの操作に使用されます。ユーザーのファイル読み取りニーズが比較的単純な場合は、InputString クラスを継承する FileInputString クラスを使用できます。 FileOutputStream クラスは FileInputStream クラスに対応し、基本的なファイル書き込み機能を提供します。 FileOutputStream クラスは、OutputStream クラスのサブクラスです。
    FileInputStream クラスの一般的に使用される構築メソッドは次のとおりです。

    FileInputStream(文字列名)
    FileInputStream(ファイル ファイル)

    2、FileReaderおよび FileWriter クラス

    FileOutputStream クラスを使用してファイルにデータを書き込む場合と、FileInputStream クラスを使用してファイルからコンテンツを読み取る場合には、欠点が 1 つあります。つまり、両方のクラスは、バイトまたはバイト配列を読み取るためのメソッドのみを提供します。 . .漢字はファイル内で2バイトを占めるため、バイトストリームを使用すると読み込みが悪いと文字化けが発生する場合がありますが、その場合は文字ストリームのReaderクラスやWriterクラスを使用することでこの現象を回避できます。

    FileReader および FileWriter 文字ストリームは、FileInputStream クラスおよび FileOutputStream クラスに対応します。 FileReader ストリームはファイルを順番に読み取ります。ストリームが閉じられていない限り、read() メソッドを呼び出すたびに、ソースの終わりまたはストリームが閉じるまで、残りのソース コンテンツが順番に読み取られます。

    5. キャッシュを使用した入出力ストリーム

    キャッシュは I/O のパフォーマンスを最適化するものです。キャッシュ ストリームは、メモリ キャッシュ領域を I/O ストリームに追加します。バッファ領域を使用すると、ストリーム上でskip()、mark()、reset()メソッドを実行できます。

    1. BufferedInputStream クラスと BufferedOutputStream クラス

    BufferedInputStream クラスは、パフォーマンスを最適化するために、すべての InputStream クラスをバッファーでラップできます。 BufferedInputStream クラスには 2 つの構築メソッドがあります。

    BufferedInputStream(InputStream in)
    BufferedInputStream(InputStream in, int size)

    最初の構築メソッドは、A 32 を作成します。 -byte バッファー 2 番目の構築方法は、指定されたサイズのバッファーを作成します。

    2. BufferedReader クラスと BufferedWriter クラス

    BufferedReader クラスと BufferedWriter クラスは、それぞれ Reader クラスと Writer クラスを継承します。どちらのクラスも内部キャッシュ機構を備えており、行単位で入出力を行うことができます。

    6. データ入出力ストリーム

    データ入出力ストリーム (DataInputStream クラスおよび DataOutputStream クラス) を使用すると、アプリケーションは、マシンに依存しない方法で基礎となる入力ストリームから基本的な Java データを読み取ることができます。タイプ。つまり、データを読み取るときに、その値がどのようなバイトであるかを心配する必要がなくなりました。

    7. ZIP 圧縮入出力ストリーム

    ZIP 圧縮管理ファイル (ZIP アーカイブ) は、ストレージ領域を節約できる非常に一般的なファイル圧縮形式です。 ZIP 圧縮の I/O 実装に関しては、Java の組み込みクラスが非常に便利な関連クラスを提供しているため、その実装は非常に簡単です。このセクションでは、ファイルの圧縮/解凍を行うための java.util.zip パッケージの ZipOutputStream クラスと ZipInputStream クラスの使用方法を紹介します。 ZIP 圧縮された管理ファイルからファイルを読み込む場合、内容を読み取る前に、まず対応するファイルの「ディレクトリ エントリ ポイント」を見つける必要があります(これにより、ZIP ファイル内のファイルの場所がわかります)。ファイルの。ファイルの内容を ZIP ファイルに書き込みたい場合は、まずファイルに対応する「ディレクトリ エントリ ポイント」を書き込み、ファイルの内容を書き込む場所をこのエントリ ポイントが指す場所に移動する必要があります。そしてファイルの内容を書き込みます。

    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());
                }
            }
        }
    }

    执行结果:

    Java での I/O 入出力例の分析

    以上がJava での I/O 入出力例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。