「ファイル入出力用のストリームから始めます。ただし、まずは重要なことから始めましょう。」

ファイルの読み取りと書き込みには、 FileInputStreamFileOutputStreamという 2 つのクラスがあります 。おそらくすでにご想像のとおり、FileInputStream はファイルからバイトを順番に読み取ることができ、FileOutputStream はファイルにバイトを順番に書き込むことができます。これらのクラスが持つメソッドは次のとおりです。

方法 メソッドの内容
FileInputStream(String fileName);
— これはコンストラクターです。作成されたオブジェクトがデータを読み取るディスク上のファイルの名前を指定できます。
int read();
— このメソッドはファイルから 1 バイトを読み取り、それを返します。戻り値は int に拡張されます。
int available();
— このメソッドは、未読の (使用可能な) バイト数を返します。
void close();
— このメソッドはストリームを「閉じます」。ストリームの操作が完了したら、これを呼び出します。
その後、オブジェクトはファイルを閉じるなどのハウスキーピング操作を実行します。
この時点では、ストリームからそれ以上データを読み取ることはできません。

楽しみのために、ファイル内のすべてのバイトの合計を計算してみましょう。コードは次のようになります。

ファイル内のすべてのバイトを合計する
public static void main(String[] args) throws Exception
{
 //Create a FileInputStream object bound to «c:/data.txt».
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 long sum = 0;

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); //Read the next byte
  sum +=  data; //Add it to the running total
 }
 inputStream.close(); // Close the stream

 System.out.println(sum); // Display the sum on the screen.
}

「このようなことについてはすでに調査済みです。FileOutputStream はどのように構成されていますか?」

「わかりました。これを見てください。」

方法 メソッドの内容
FileOutputStream (String fileName);
「これはコンストラクターです。作成されたオブジェクトがデータを書き込むディスク上のファイルの名前を指定できます。」
void write(int data);
「このメソッドは、データを 1 バイトに切り捨てて、次のバイトを書き込みます。」
void flush();
「書き込まれるデータは、多くの場合、最初にメモリ内の大きなブロックに収集され、その後ディスクにのみ書き込まれます。」

flash コマンドは、保存されていないすべての情報を強制的にディスクに書き込みます。

void close();
「このメソッドはストリームを「閉じます」。ストリームの操作が完了したら、これを呼び出します。」
次に、オブジェクトはファイルを閉じるなどのハウスキーピング操作を実行します。

ストリームにデータを書き込むことはできなくなり、flush が自動的に呼び出されます。

"それでおしまい?"

「そう、実際には、書き込みメソッドは write() の 1 つだけです。一度に 1 バイトしか書き込めません。ただし、必要なだけ情報をファイルに書き込むことができます。」

プログラミングは、1 つの大きくて複雑なタスクを多数の小さなタスクに分割するプロセスです。ここでも基本的に同じプロセスが発生しています。大きなデータ ブロックの読み取りと書き込みが、一度に 1 バイトずつというバイトサイズの断片の読み取りと書き込みに分割されます。

これらのクラスを使用してディスク上のファイルをコピーする方法は次のとおりです。

ディスク上のファイルをコピーする
public static void main(String[] args) throws Exception
{
 //Create a stream to read bytes from a file
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 //Create a stream to write bytes to a file
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); // Read the next byte into the data variable
  outputStream.write(data); // and write it to the second stream
 }

 inputStream.close(); //Close both streams. We don't need them any more.
 outputStream.close();
}

「ありがとう、リシ。このコードが実際にどのように機能するのか、ようやく理解できました。」