- 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 を指定します。