Когда в файле 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 exists: true (len=5) a.txt (null) exists: true (len=6) a.txt (nullx) exists: true (len=7)
Система Linux имеет следующую JVM.
Java(TM) SE Runtime Environment (build 1.7.0_10-b18) Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)
Поведение похоже на C-like, а строка, используемая для проверки файла в файловой системе, усекается нулевым значением.
Но я ожидал бы, что поведение Java вернет false для File.exists()
для этих недопустимых имен файлов.
Обновление: 19 сентября 2013 г.
Обновление Java 1.7.0 40 исправило это как часть ошибки JDK-8014846: Файл и другие классы в java.io не обрабатывают внедренные нули корректно