- Fileオブジェクトは、実際のファイルではなく、ファイル名を表しています。また、このようなオブジェクトは不変です。例を挙げます。
File f1 = new File("foo");
File f2 = new File("bar");
f1.renameTo(f2);
前述のコードでは、「foo」というファイル(存在する場合)の名前が「bar」に変更されます。このとき、f1によって参照されるFileオブジェクトの値は変更されません。特に、式f1.getPath()の評価は「foo」のままです。
- InputStreamクラスとそのサブクラスのavailableメソッドの戻り値は、必ずしも、ブロックせずに読み込むことができる最大のバイト数ではないことがあります。例を挙げます。
int n = in.available();
byte buf = new byte[n];
in.read(buf);
このコードの場合は、入力ストリームから残りのすべてのバイトが読み込まれないことがあります。同様に、Readerクラスとそのサブクラスのreadyメソッドは、ストリームを読み込む準備ができている場合でもfalseを返すことがあります。
- InputStreamクラスとそのサブクラスのread(byte[])およびread(byte[], int, int)メソッドでは、読込み可能なすべてのバイトが読み込まれないこともあります。たとえば、大きなファイルを配列に読み込む場合は、ループが必要です。
for (int off = 0; off < size;) {
int r = in.read(buf, off, buf.length - off);
if (r == -1) break;
off += r;
}
別の方法として、BufferedInputStreamを使用することもできます。同じ注意点が、Readerクラスとそのサブクラスのread(char[])およびread(char[], int, int)メソッドにも当てはまります。
- PrintStreamおよびPrintWriterクラスでは、入出力エラーがすべて抑止されます。エラーが発生したかどうかを確認するには、checkErrorメソッドを呼び出します。
- PrintStreamおよびPrintWriterオブジェクトでは、出力がフラッシュされないことがあります。自動的にフラッシュするには、これらのクラスから2つの引数を取るコンストラクタを呼び出して、第2引数にtrueを指定します。