「ファイル入出力用のストリームから始めます。ただし、まずは重要なことから始めましょう。」
ファイルの読み取りと書き込みには、 FileInputStreamとFileOutputStreamという 2 つのクラスがあります 。おそらくすでにご想像のとおり、FileInputStream はファイルからバイトを順番に読み取ることができ、FileOutputStream はファイルにバイトを順番に書き込むことができます。これらのクラスが持つメソッドは次のとおりです。
方法 | メソッドの内容 |
---|---|
|
— これはコンストラクターです。作成されたオブジェクトがデータを読み取るディスク上のファイルの名前を指定できます。 |
|
— このメソッドはファイルから 1 バイトを読み取り、それを返します。戻り値は int に拡張されます。 |
|
— このメソッドは、未読の (使用可能な) バイト数を返します。 |
|
— このメソッドはストリームを「閉じます」。ストリームの操作が完了したら、これを呼び出します。 その後、オブジェクトはファイルを閉じるなどのハウスキーピング操作を実行します。 この時点では、ストリームからそれ以上データを読み取ることはできません。 |
楽しみのために、ファイル内のすべてのバイトの合計を計算してみましょう。コードは次のようになります。
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 はどのように構成されていますか?」
「わかりました。これを見てください。」
方法 | メソッドの内容 |
---|---|
|
「これはコンストラクターです。作成されたオブジェクトがデータを書き込むディスク上のファイルの名前を指定できます。」 |
|
「このメソッドは、データを 1 バイトに切り捨てて、次のバイトを書き込みます。」 |
|
「書き込まれるデータは、多くの場合、最初にメモリ内の大きなブロックに収集され、その後ディスクにのみ書き込まれます。」 flash コマンドは、保存されていないすべての情報を強制的にディスクに書き込みます。 |
|
「このメソッドはストリームを「閉じます」。ストリームの操作が完了したら、これを呼び出します。」 次に、オブジェクトはファイルを閉じるなどのハウスキーピング操作を実行します。 |
ストリームにデータを書き込むことはできなくなり、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();
}
「ありがとう、リシ。このコードが実際にどのように機能するのか、ようやく理解できました。」
GO TO FULL VERSION