のファイル名でnullが検出されるとjava.io.File
、その文字とそれ以降のすべての文字が無視され、。で奇妙な動作が発生しFile.exists()
ます。
この振る舞いはjava.io.File.exists()
私が見逃したことのいくつかの側面ですか?
例:
package os;
import java.io.File;
import java.io.IOException;
public class FileNullCheck
{
public static void main(String[] args)
{
File tmp = new File("a.txt");
try
{
tmp.createNewFile();
}
catch (IOException e)
{
e.printStackTrace();
return;
}
String a = "a.txt";
System.out.printf("a.txt exists: %b (len=%d)%n",new File(a).exists(),a.length());
String anull = new String(new byte[] { 'a', '.', 't', 'x', 't', 0x00 });
System.out.printf("a.txt (null) exists: %b (len=%d)%n",new File(anull).exists(),anull.length());
String anullx = new String(new byte[] { 'a', '.', 't', 'x', 't', 0x00, 'x' });
System.out.printf("a.txt (nullx) exists: %b (len=%d)%n",new File(anullx).exists(),anullx.length());
}
}
これを実行した結果。
a.txtが存在します:true(len = 5) a.txt(null)が存在します:true(len = 6) a.txt(nullx)が存在します:true(len = 7)
Linuxシステムには次のJVMがあります。
Java(TM)SEランタイム環境(ビルド1.7.0_10-b18) Java HotSpot(TM)64ビットサーバーVM(ビルド23.6-b04、混合モード)
動作はCに似ているようで、ファイルシステム上のファイルの検証に使用される文字列はnullで切り捨てられます。
File.exists()
しかし、これらの無効なファイル名に対してJavaでの動作がfalseを返すことを期待します。
更新:2013年9月19日
Java 1.7.0 update 40は、バグ JDK-8014846の一部としてこれを修正しました:java.ioのファイルおよびその他のクラスは、埋め込まれたnullを適切に処理しません