Advanced Java - IO ストリームの最初の記事「入出力ストリーム」

目次

序文

Javaファイルクラス

Java ファイルクラスのディレクトリ

ディレクトリを作成する

ディレクトリ内のファイルを一覧表示する

Java Fileクラスファイル

ファイルの作成と削除

実行可能ファイルを実行する

Java ファイルのバイト入力ストリーム

ファイルバイト入力ストリームの構築方法

入力ストリームを使用してバイトを読み取り、ストリームを閉じる方法

入力ストリームを使用してバイトを読み取る

ストリームを閉じる

サンプルコード 

Java ファイルのバイト出力ストリーム

ファイルバイト出力ストリームのコンストラクター 

出力ストリームを使用してバイトを書き込み、ストリームを閉じます。

出力ストリームを使用してバイトを書き込む

ストリームを閉じる

例えば:

Java ファイルの文字入出力ストリーム


序文

Java では、入力ストリームは外部データソース(ファイル、ネットワーク接続、メモリなど) からプログラムにデータを読み取るために使用され、出力ストリームはプログラム内のデータを外部宛先(ファイル、ネットワーク接続など) に出力するために使用されます。 、ディスプレイなど)。I/O ストリームはディスク ファイル アクセスに関連付けられることが多いですが、ソースと宛先がキーボード、メモリ、または表示ウィンドウである場合もあります。

入力ストリームと出力ストリームは、それぞれ抽象クラスInputStreamとOutputStream(バイトストリーム)と抽象クラスReaderとWriter(文字ストリーム)で定義されます。これらの抽象クラスは、共通のメソッドと関数のセットを提供し、特定のニーズに応じて動作するように対応するサブクラスを選択できます。

Java の I/O ストリーム ライブラリは、FileInputStream、FileOutputStream、BufferedReader、BufferedWriter などを含む豊富なストリーム クラスを提供し、さまざまなシナリオでの入出力要件を満たすことができます。Javaの入出力ストリームを利用することで、さまざまなデータ形式を簡単に処理し、データの読み取り、書き込み、コピー、送信などの操作を実現できます。これは Java プログラミングで一般的に使用される部分であり、ファイル処理、ネットワーク通信、データの永続化などのタスクで重要な役割を果たします。

Javaファイルクラス

プログラムでは、ディスク上のファイルに関する情報を取得したり、ディスク上に新しいファイルを作成したりすることが必要になることがよくありますが、そのためにはFile クラスの使用方法を学習する必要があります。File オブジェクトを通じて、ファイル パス、ファイル名、ファイルの長さ、読み取りおよび書き込み権限などのファイルの関連情報を取得できます。File クラスには、ファイルが存在するかどうかの判断、新しいファイルの作成、ファイルの削除、ファイル名の変更、その他のファイル操作を行うためのメソッドもいくつか用意されています。

File オブジェクトを作成するには 3 つの構築方法があります。

  • ファイル(文字列パス名):

指定されたパス名を使用して、ファイルまたはディレクトリの File オブジェクトを作成します。
コンストラクターは、ファイルまたはディレクトリのパスを指定するために使用される文字列パラメーターのパス名を受け入れます。絶対パスまたは相対パスを指定できます。無効なパス名が渡された場合、またはファイルまたはディレクトリが存在しない場合、作成された File オブジェクトは引き続き有効ですが、後続の操作は失敗する可能性があります。

String filePath = "/path/to/file.txt";
File file = new File(filePath);
  • ファイル(親文字列、子文字列):

指定された親パス名文字列と子パス名文字列を使用して、新しい File インスタンスを作成します。
この構築メソッドは 2 つの文字列パラメーターを受け入れます。parent は親のパス名を表し、child は子のパス名を表します。これらは連結されて完全なパスを形成し、これは File オブジェクトの作成に使用されます。

String parentPath = "/path/to/";
String fileName = "file.txt";
File file = new File(parentPath, fileName);
  • ファイル(ファイルの親、文字列の子):

親の抽象パス名と子のパス名の文字列から新しい File インスタンスを作成します。
コンストラクターは、File 型の親パス名と子パス名の文字列パラメーターを受け入れます。これらはオペレーティング システムの仕様に従って結合され、新しい File オブジェクトが作成されます。

File parentDir = new File("/path/to/");
String fileName = "file.txt";
File file = new File(parentDir, fileName);

これらのコンストラクターを使用して、File オブジェクトを作成し、ファイルまたはディレクトリへのパスを指定できます。ファイルおよびディレクトリのファイル オブジェクトは、さまざまなパラメータの組み合わせを使用して柔軟に作成できます。File オブジェクトを作成しても、ファイル システム内に実際のファイルやディレクトリが作成されるわけではなく、単にパスを表すオブジェクトであることに注意してください。 

File クラスは主にファイルのメタデータ (メタデータ) 操作に使用され、ファイルの読み取りおよび書き込み操作は含まれません。ファイルの内容を読み書きする必要がある場合は、入出力ストリーム (IO ストリーム) を使用して対応する操作を実行する必要があります。File クラスを使用すると、ファイル システム内のファイルを効率的に管理し、必要なファイル操作や情報の取得を実行できます。

File クラスの一般的に使用されるメソッドは次のとおりです。

       メソッド宣言

機能説明

ブール値が存在します()

Fileオブジェクトに対応するファイルまたはディレクトリが存在するかどうかを判断し、存在する場合はtureを返し、存在しない場合はfalseを返します。

ブール値の削除()

Fileオブジェクトに対応するファイルまたはディレクトリを削除します。削除が成功した場合はtrueを返し、それ以外の場合はfalseを返します。

ブール値 createNewFile()

Fileオブジェクトに対応するファイルが存在しない場合、このメソッドはFileオブジェクトで指定された新しいファイルを作成し、作成に成功した場合はtrueを返し、それ以外の場合はfalseを返します。

文字列 getName()

Fileオブジェクトによって表されるファイルまたはフォルダーの名前を返します。

文字列 getPath()

Fileオブジェクトに対応するパスを返します。

文字列 getAbsolutePath()

Fileオブジェクトに対応する絶対パスを返します( Unix/Linuxなどのシステムは、パスがスラッシュ/で始まる場合、このパスは絶対パスになります。Windowsなどのシステムでは、パスがドライブ文字で始まる場合は、このパスは絶対パスです)

文字列 getParentFile()

Fileオブジェクトに対応するディレクトリの親ディレクトリを返します(つまり、返されたディレクトリには最後のレベルのサブディレクトリは含まれません)。

文字列 getParent()

親ディレクトリのパス名を返します。
ブール値 isHidden() ファイルが隠しファイルかどうかを確認します。
ブール値 renameTo(ファイル宛先) ファイルまたはディレクトリの名前を指定されたターゲット パスに変更します。

ブール値 canRead ()

Fileオブジェクトに対応するファイルまたはディレクトリが読み取り可能かどうかを判断し、読み取り可能な場合はtrueを返し、そうでない場合はfalseを返します。

ブール値 canWrite ()

Fileオブジェクトに対応するファイルまたはディレクトリが書き込み可能かどうかを判断し、書き込み可能な場合はtrueを返し、そうでない場合はfalseを返します。

ブール値 isFile()

Fileオブジェクトがファイル(ディレクトリではない)に対応するかどうかを判断し、ファイルの場合はtrueを返し、それ以外の場合はfalseを返します。

ブール値 isDirectory()

Fileオブジェクトがディレクトリ(ファイルではない)に対応するかどうかを判断し、ディレクトリの場合はtrueを返し、それ以外の場合はfalseを返します。

ブール値 isAbsolute()

Fileオブジェクトに対応するファイルまたはディレクトリが絶対パスかどうかを確認します。

ブール値 mkdir() 新しいディレクトリを作成します。ディレクトリがすでに存在するか、作成に失敗した場合は false を返します。
ブール値 mkdirs() 新しいディレクトリと必要なすべての親ディレクトリを作成します。

長い lastModified()

1970 年1 月1 日の0:00:00 からファイルの最終変更時刻までのミリ秒返します

長い長さ()

ファイルの内容の長さをバイト単位で返します。

文字列[ ] リスト()

指定されたディレクトリの内容全体を名前のみをリストします。

ファイル[ ] listFiles()

Fileオブジェクトのすべてのサブファイルとサブディレクトリを含むFile配列を返します。

たとえば、new.txt という名前の新しいファイルを作成するには、次のようにします。 

import java.io.File;
import java.io.IOException;

public class Main {
    public static void main(String args[]) {
        File f = new File("D:\\ch10", "Main.java");
        System.out.println(f.getName() + "是否可读: " + f.canRead());
        System.out.println(f.getName() + "的绝对路径: " + f.getAbsolutePath());

        File file = new File("new.txt");
        System.out.println("在当前目录下创建新文件:" + file.getName());

        try {
            if (!file.exists()) {
                boolean created = file.createNewFile(); // 尝试创建新文件
                if (created) {
                    System.out.println("创建成功");
                } else {
                    System.out.println("创建失败");
                }
            } else {
                System.out.println("文件已存在");
            }
        } catch (IOException exp) {
            exp.printStackTrace();
        }
    }
}

新しいファイルを作成しようとするときは、createNewFile() メソッドによって返されたブール値を使用して、ファイルが正常に作成されたかどうかを判断します。同時に、例外処理を使用して考えられる IOExceptions をキャッチし、デバッグを容易にするために例外スタック情報を出力します。指定されたパスまたは現在のディレクトリに対応するアクセス許可がプログラムにない場合でも、ファイルを正常に作成できない可能性があることに注意してください。また、createNewFile() メソッドはファイルのみを作成でき、ディレクトリは作成できません。ディレクトリを作成する必要がある場合は、mkdir() または mkdirs() メソッドを使用できます。

Java ファイルクラスのディレクトリ

ディレクトリを作成する

  1. mkdir(): 新しいディレクトリを作成します。ディレクトリがすでに存在するか、作成に失敗した場合は false を返します。
    String dirPath = "/path/to/directory";
    File dir = new File(dirPath);
    boolean success = dir.mkdir();
    if (success) {
        System.out.println("目录创建成功");
    } else {
        System.out.println("目录创建失败");
    }
    
  2. mkdirs(): 新しいディレクトリと必要なすべての親ディレクトリを作成します。ディレクトリがすでに存在するか、作成に失敗した場合は false を返します。
    String dirPath = "/path/to/new/directory";
    File dir = new File(dirPath);
    boolean success = dir.mkdirs();
    if (success) {
        System.out.println("目录创建成功");
    } else {
        System.out.println("目录创建失败");
    }
    
  3. isDirectory(): 現在の File オブジェクトがディレクトリを表すかどうかを判断します。
    String path = "/path/to/file.txt";
    File file = new File(path);
    boolean isDirectory = file.isDirectory();
    if (isDirectory) {
        System.out.println("该路径表示一个目录");
    } else {
        System.out.println("该路径不是一个目录");
    }
    

ディレクトリ内のファイルを一覧表示する

File オブジェクトがディレクトリを表す場合、次のメソッドを使用して、ディレクトリ内のファイルとサブディレクトリを一覧表示できます。

  1. public String[] list(): ディレクトリ内のすべてのファイルとサブディレクトリの名前を文字列配列の形式で返します。
    String dirPath = "/path/to/directory";
    File dir = new File(dirPath);
    String[] files = dir.list();
    for (String fileName : files) {
        System.out.println(fileName);
    }
    
  2. public File[] listFiles(): ディレクトリ内のすべてのファイルとサブディレクトリを File オブジェクトの配列の形式で返します。
    String dirPath = "/path/to/directory";
    File dir = new File(dirPath);
    File[] files = dir.listFiles();
    for (File file : files) {
        System.out.println(file.getName());
    }
    

場合によっては、.java や .txt などの特定の拡張子を持つファイルのみなど、指定したタイプのファイルをリストする必要があります。これは、次の方法を使用して実現できます。

  1. public String[] list(FilenameFilter filter): ディレクトリ内の指定された種類のファイルを文字列配列の形式で返します。
    String dirPath = "/path/to/directory";
    File dir = new File(dirPath);
    
    FilenameFilter filter = new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(".txt");
        }
    };
    
    String[] files = dir.list(filter);
    for (String fileName : files) {
        System.out.println(fileName);
    }
    
  2. public File[] listFiles(FilenameFilter filter): ディレクトリ内の指定された種類のファイルを File オブジェクトの配列の形式で返します。
    String dirPath = "/path/to/directory";
    File dir = new File(dirPath);
    
    FilenameFilter filter = new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(".txt");
        }
    };
    
    File[] files = dir.listFiles(filter);
    for (File file : files) {
        System.out.println(file.getName());
    }
    

 上記 2 つのメソッドのパラメータ FilenameFilter は、次の 1 つのメソッドを持つインターフェイスです。

public boolean accept(File dir,String name);

File オブジェクト dirFile が list メソッドを呼び出すとき、 FilenameFilter インターフェイスを実装するオブジェクトをメソッドに渡す必要があります。listメソッドが実行されると、パラメーター obj は継続的にインターフェイス メソッド accept(File dir, String name) をコールバックします。 , このメソッドのパラメータ dir は呼び出しリストの名前です。現在のディレクトリ dirFile、パラメータ名は dirFile ディレクトリ内のファイル名としてインスタンス化されます。インターフェイス メソッドが true を返すと、リスト メソッドはその名前のファイルを保存します。返された配列内の名前。

Java Fileクラス操作ディレクトリのサンプルコードを以下に示します。 

import java.io.File;

public class Main {
    public static void main(String[] args) {
        // 指定目录路径
        String dirPath = "/path/to/directory";

        // 创建File对象表示目录
        File directory = new File(dirPath);

        // 判断File对象是否为目录
        if (directory.isDirectory()) {
            // 列出目录下的所有文件和子目录名称(字符串形式)
            String[] fileNames = directory.list();
            System.out.println("目录下的文件和子目录:");
            for (String fileName : fileNames) {
                System.out.println(fileName);
            }

            System.out.println("----------------");

            // 列出目录下的所有文件和子目录(File对象形式)
            File[] files = directory.listFiles();
            System.out.println("目录下的文件和子目录:");
            for (File file : files) {
                System.out.println(file.getName());
            }
        } else {
            System.out.println("指定的路径不是一个目录。");
        }
    }
}

「/path/to/directory」を実際のディレクトリ パスに置き換える必要があることに注意してください。この例では、まず指定されたパスがディレクトリであるかどうかを確認し、次に list() メソッドを使用してディレクトリ内のファイルとサブディレクトリの名前を文字列配列の形式で一覧表示し、さらに listFiles() メソッドを使用してファイルを一覧表示します。 File オブジェクトの配列の形式でディレクトリ内のサブディレクトリを作成します。

Java Fileクラスファイル

ファイルの作成と削除

File クラスを使用してファイル オブジェクトを作成した後、たとえば次のようになります。

File file = new File("C:\\myletter","letter.txt");

C:\myletter ディレクトリに Letter.txt という名前のファイルがない場合、ファイル オブジェクト ファイルは次のメソッドを呼び出します。 

public boolean createNewFile();

Letter.txt という名前のファイルが C:\myletter ディレクトリに作成されます。ファイル オブジェクトはメソッド public boolean delete() を呼び出して、現在のファイルを削除します。次に例を示します。

file.delete();

実行可能ファイルを実行する

ローカル マシン上で実行可能ファイルを実行する場合、java.lang パッケージの Runtime クラスを使用できます。まず、Runtime クラスを使用してオブジェクトを宣言します。

Runtime ec;

次に、このクラスの getRuntime() 静的メソッドを使用して、このオブジェクトを作成します。

ec = Runtime.getRuntime();

ec は、exec(String command) メソッドを呼び出して、ローカル マシン上の実行可能ファイルを開いたり、操作を実行したりできます。

以下は、File クラスの一般的な使用法を示す簡単なコード例です。 

import java.io.File;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        // 创建一个File对象,指向文件的路径
        File file = new File("example.txt");
        
        try {
            // 判断文件是否存在
            if (file.exists()) {
                System.out.println("文件存在");
                
                // 获取文件名
                System.out.println("文件名:" + file.getName());
                
                // 获取文件路径
                System.out.println("文件路径:" + file.getAbsolutePath());
                
                // 获取文件大小(字节数)
                System.out.println("文件大小:" + file.length() + " 字节");
                
                // 判断是否为文件
                if (file.isFile()) {
                    System.out.println("这是一个文件");
                }
                
                // 判断是否可读、可写、可执行
                System.out.println("可读性:" + file.canRead());
                System.out.println("可写性:" + file.canWrite());
                System.out.println("可执行性:" + file.canExecute());
                
                // 删除文件
                boolean deleted = file.delete();
                if (deleted) {
                    System.out.println("文件删除成功");
                } else {
                    System.out.println("文件删除失败");
                }
            } else {
                System.out.println("文件不存在");
                
                // 创建新文件
                boolean created = file.createNewFile();
                if (created) {
                    System.out.println("文件创建成功");
                } else {
                    System.out.println("文件创建失败");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上記のコードは、ファイルが存在するかどうかの判断、ファイル情報の取得、ファイルの作成と削除、その他の操作など、File クラスの基本的な使用法をいくつか示しているだけであることに注意してください。実際の使用では、File クラスの他のメソッドを使用して、ファイル名の変更やフォルダーの操作など、より複雑なファイル操作を実行することもできます。

Java ファイルのバイト入力ストリーム

ファイルバイト入力ストリームの構築方法

入力ストリームを使用するには、通常、次の 4 つの基本的な手順が必要です。

  1. 入力ストリームのソースを設定します
  2. ソースを指す入力ストリームを作成する
  3. 入力ストリームにソースからデータを読み取らせる
  4. 入力ストリームを閉じて、システム リソースを解放します。

ファイル読み取り要件が比較的単純な場合は、InputStream クラス (ファイルをバイト単位で読み取る) のサブクラスである FileInputStream クラス (ファイル バイト入力ストリーム) を使用できます。このクラスのインスタンス メソッドはすべて、InputStream クラスの継承からのものです。 。

FileInputStream(String name);
FileInputStream(File file);

最初の構築メソッドは、指定されたファイル名を使用して FileInputStream ストリームを作成し、2 番目の構築メソッドは File オブジェクトを使用して FileInputStream ストリームを作成します。パラメータ名とファイルで指定されたファイルは、入力ストリームのソースと呼ばれます。

FileInputStream 入力ストリームは、ファイルへのチャネルを開きます (ソースはこのファイルであり、入力ストリームはこのファイルを指します)。入力ストリームを作成するときに、エラー (例外とも呼ばれます) が発生する場合があります。たとえば、入力ストリームが指すファイルが存在しない可能性があります。I/O エラーが発生すると、Java はエラー信号を生成します。この信号は、IOException (IO 例外)オブジェクトを使用してエラー信号を表します。プログラムは、try-catch ステートメントの try ブロック部分で入力ストリームを作成し、catch ブロック部分でこの例外を検出して処理する必要があります。

入力ストリームを使用してバイトを読み取り、ストリームを閉じる方法

ファイルのバイト入力ストリームの構築方法を学習しました。次に、入力ストリームを使用してバイトを読み取り、ストリームを閉じる方法を学習し続けます。 

入力ストリームを使用してバイトを読み取る

入力ストリームの目的は、ソース内のデータを読み取るチャネルを提供することです。プログラムは、このチャネルを通じてソース内のデータを読み取ることができます。ファイル バイト ストリームは、親クラスから継承した読み取りメソッドを呼び出してファイルを読み取ることができますreadメソッドの各呼び出しは、ファイルの終わりまたはファイル バイト入力ストリームが閉じられるまで、ファイルの残りの内容を順番に読み取ります。

バイト入力ストリームの read メソッドは、ソースからデータをバイト単位で読み取ります。

  1. int read():入力ストリームは、ソースから 1 バイトのデータを読み取るためにこのメソッドを呼び出します。このメソッドはバイト値 (0 から 255 までの整数) を返し、バイトが読み込まれなかった場合は -1 を返します。
  2. int read(byte b[ ]):入力ストリームはこのメソッドを呼び出して、ソースから b.length バイトをバイト配列 b に読み取ろうとし、実際に読み取られたバイト数を返します。ファイルの終わりに達した場合は -1 を返します。
  3. int read(byte b[],int off,int len):入力ストリームはこのメソッドを呼び出して、ソースから len バイトをバイト配列 b に読み取ろうとし、実際に読み取られたバイト数を返します。ファイルの終わりに到達した場合は、-1 が返され、パラメータ off は、バイト配列内の特定の位置から読み取ったデータを格納することを指定します。

: FileInputStream ストリームはファイルを順番に読み取ります。ストリームが閉じられていない限り、read メソッドを呼び出すたびに、ソースの終わりまたはストリームが閉じるまで、ソースの残りのコンテンツが順番に読み取られます。

ストリームを閉じる

すべての入力ストリームは、 close メソッドclose()を提供します。プログラムが終了すると、開いているストリームはすべて自動的に閉じられますが、プログラムがストリームの使用を終了した後は、開いているストリームを明示的に閉じることをお勧めします。開かれたストリームが閉じられていない場合、別のプログラムがこれらのストリームによって使用されるリソース上で動作することを許可されない可能性があります。

サンプルコード 

簡単なサンプルコードを次に示します。

import java.io.FileInputStream;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            // 创建FileInputStream对象
            fis = new FileInputStream("new.txt");

            // 创建byte数组
            byte[] buffer = new byte[1024];

            // 读取字节数据
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                // 处理读取的字节数据
                // 这里可以根据实际需求进行处理,比如写入其他文件或进行数据处理等

                // 示例:将读取的字节数据转换为字符串并打印输出
                String data = new String(buffer, 0, bytesRead);
                System.out.println(data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭输入流
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Java ファイルのバイト出力ストリーム

ファイルバイト出力ストリームのコンストラクター 

出力ストリームを使用するには、通常、次の 4 つの基本手順が必要です。

  1. 出力ストリームの宛先を与える

  2. 宛先を指す出力ストリームを作成する

  3. 出力ストリームにデータを宛先に書き込ませる

  4. 出力ストリームを閉じる

ファイルを書き込むための要件が​​比較的単純な場合は、OutputStream クラス (コンテンツをバイト単位でファイルに書き込む) のサブクラスである FileOutputStream クラス (ファイル バイト出力ストリーム) を使用できます。このクラスのインスタンス メソッドは次のとおりですOutputStream クラスから継承されます。

FileOutputStream クラスの次のフラッシュが有効なコンストラクターを使用して、ファイルを指す出力ストリームを作成できます。

FileOutputStream(String name);
FileOutputStream(File file);

最初の構築メソッドは、指定されたファイル名を使用して FileOutputStream ストリームを作成し、2 番目の構築メソッドは File オブジェクトを使用して FileOutputStream ストリームを作成します。パラメータ名とファイルで指定されたファイルは、出力ストリームの宛先と呼ばれます。

FileOutputStream 出力ストリームは、ファイルへのチャネルを開きます (宛先はこのファイルであり、出力ストリームはこのファイルを指します)。

: 出力ストリームが指すファイルが存在しない場合、Java はファイルを作成します。指すファイルが既存のファイルである場合、出力ストリームはファイルを更新します (ファイルの長さを 0 にします)。

また、入力ストリームの作成と同様に、出力ストリームの作成時にも、出力ストリームが書き込もうとしているファイルに操作ができないなどのエラー (例外と呼ばれる) が発生する場合があります。したがって、出力ストリームは try-catch ステートメントの try ブロック部分で作成する必要があり、例外は catch ブロック部分で検出されて処理されます。

たとえば、destin.txt という名前の出力ストリームを作成するには、次のようにします。

try {
    FileOutputStream out = new FileoutputStream("destin.txt"); //创建指向文件destin.txt的输出流
}
catch(IOException e) {
    System.out.println("File write error:"+e);
}

または

File f = new File("destin.txt"); //指定输出流的目的地
try {
    FileOutputStream out = new FileOutputStream(f); //创建指向目的地的输出流
}
catch(IOException e) {
    System.out.println("Filewrite:"+e);
}

ファイルを指す出力ストリームを作成するためのリフレッシュ関数をオプションで持つことができる FileOutputStream クラスの次のコンストラクターを使用できます。

FileOutputStream(String name,boolean append);
FileOutputStream(File file,boolean append);

構築メソッドを使用してファイルを指す出力ストリームを作成する場合、パラメーター append の値が true の場合、出力ストリームは指定されたファイル (ファイルが既に存在する場合) を更新せず、出力ストリームの write メソッドはファイルの末尾からファイルにデータを書き込みます。append パラメーターの値は false で、出力ストリームは指定されたファイルを更新します (ファイルが既に存在する場合)。

出力ストリームを使用してバイトを書き込み、ストリームを閉じます。

ファイルバイト出力ストリームの構築方法を学習しました。次に、出力ストリームを使用してバイトを書き込み、ストリームを閉じる方法を学習し続けます。

出力ストリームを使用してバイトを書き込む

出力ストリームの目的は、宛先にチャネルを提供することです。プログラムは、このチャネルを通じてプログラム内のデータを宛先に書き込むことができます。ファイル バイト ストリームは、親クラスから継承した書き込みメソッドを呼び出して、ファイルを順次書き込むことができます。FileOutStream ストリームは、コンテンツをファイルに順番に書き込みます。つまり、ストリームが閉じられていない限り、write メソッドが呼び出されるたびに、ストリームが閉じるまでコンテンツがファイルに順番に書き込まれます。

バイト出力ストリームの write メソッドは、データをバイト単位で宛先に書き込みます。

  1. void write(int n):出力ストリームはこのメソッドを呼び出して、宛先に 1 バイトを書き込みます。
  2. void write(byte b[ ]) : 出力ストリームはこのメソッドを呼び出して、バイト配列を宛先に書き込みます。
  3. void write(byte b[ ],int off,int len) : 指定されたバイト配列のオフセット off から len バイトを宛先に書き込みます。
  4. void close() : 出力ストリームを閉じます。

: FileOutputStream ストリームはファイルを順番に書き込みます。ストリームが閉じられていない限り、write メソッドの各呼び出しは、ストリームが閉じられるまでコンテンツを宛先に順番に書き込みます。

ストリームを閉じる

プログラムによって出力ストリームに書き込まれたバイトは、オペレーティング システムがディスクに保存する前にメモリ バッファに格納されることがあります。close()メソッドを呼び出すことで、オペレーティング システムがストリーム バッファの内容を確実に書き込むことができます。 . destination、つまり出力ストリームを閉じると、ストリームで使用されるバッファの内容が、通常はディスク ファイルにフラッシュされます。

例えば:

import java.io.*;

public class Main {
    public static void main(String args[]) {
        byte [] a = "新年快乐".getBytes();
        String [] str = {"Hello", "World"};
        File file = new File("output.txt"); // 输出的目的地

        try {
            // 写入字节数组
            OutputStream out = new FileOutputStream(file);
            System.out.println(file.getName() + "的大小:" + file.length() + "字节");
            out.write(a);
            out.close();

            // 写入字符串数组
            out = new FileOutputStream(file, true);
            System.out.println(file.getName() + "的大小:" + file.length() + "字节");
            for (String s : str) {
                out.write(s.getBytes());
            }
            System.out.println(file.getName() + "的大小:" + file.length() + "字节");
            out.close();

            // 写入字符串
            String line = "这是另一行。";
            out = new FileOutputStream(file, true);
            System.out.println(file.getName() + "的大小:" + file.length() + "字节");
            out.write(line.getBytes());
            System.out.println(file.getName() + "的大小:" + file.length() + "字节");
            out.close();
        } catch (IOException e) {
            System.out.println("Error" + e);
        }
    }
}

この例では、バイト配列、文字列配列、文字列、改行などのさまざまな種類のデータを「output.txt」という名前のファイルに書き込みます。ファイルが存在しない場合は、FileOutputStream 新しいファイルが作成されることに注意してください。ファイルがすでに存在する場合は、ファイルの内容を空にして書き込みを開始します。

Java ファイルの文字入出力ストリーム

ファイルバイト入出力ストリームの読み取りおよび書き込みメソッドは、バイト配列を使用してデータの読み取りおよび書き込みを行います。つまり、データをバイト単位で処理します。したがって、バイト ストリームはUnicode文字では適切に動作しません。例えば、漢字はファイル内で2バイトを占めるため、バイトストリームを使用した場合、正しく読み取れないと「文字化け」が発生します。

FileInputStream および FileOutputStream バイト ストリームに対応するのは、FileReader および FileWriter 文字ストリーム (ファイル文字入力および出力ストリーム) です。FileReader および FileWriter はそれぞれ Reader および Writer のサブクラスであり、その構築メソッドは次のとおりです。

FileReader(String filename);FileReader(File filename);
Fi1eWriter(String filename);FileWriter(File filename);
FileWriter(String filename,boolean append);FileWriter(File filename,boolean append);

文字入力ストリームおよび出力ストリームの読み取りおよび書き込みメソッドは、文字配列を使用してデータの読み取りおよび書き込みを行います。つまり、文字を基本単位としてデータを処理します。

例えば: 

import java.io.*;
public class Main {
    public static void main(String args[]) {
        File sourceFile = new File("a.txt"); //读取的文件
        File targetFile = new File("b.txt"); //写入的文件
        char c[] = new char[19]; //char型数组
        try {
            Writer out = new FileWriter(targetFile,true); //指向目的地的输出流
            Reader in = new FileReader(sourceFile); //指向源的输入流
            int n = -1;
            while((n = in.read(c)) !=-1) {
                out.write(c,0,n);
            }
            out.flush(); // 在将StringBuilder的内容写入文件后调用flush()方法,以确保数据被立即写入文件
            out.close();
        }
        catch(IOException e) {
            System.out.println("Error"+e);
        }
    }
}

: Writer ストリームの場合、write メソッドは最初にデータをバッファに書き込みます。バッファがオーバーフローするたびに、バッファの内容は宛先に自動的に書き込まれます。ストリームが閉じられている場合、バッファの内容は直ちに宛先に書き込まれます。 。ストリームは、flush() メソッドを呼び出して、現在のバッファを即座にフラッシュします。つまり、現在のバッファの内容を宛先に書き込みます。

おすすめ

転載: blog.csdn.net/m0_74293254/article/details/132384664