Po napotkaniu wartości pustej w nazwie pliku w java.io.File
, ten znak i wszystkie znaki po nim są ignorowane, powodując dziwne zachowanie w File.exists()
.Czy są puste znaki w pliku java.io.File ważne, czy istnieje?
Czy to zachowanie, które przeoczyłem, to jakiś aspekt java.io.File.exists()
?
przykład:
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());
}
}
Wyniki prowadzenia tego.
a.txt exists: true (len=5) a.txt (null) exists: true (len=6) a.txt (nullx) exists: true (len=7)
System Linux ma następującą wirtualną maszynę wirtualną.
Java(TM) SE Runtime Environment (build 1.7.0_10-b18) Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)
zachowanie wydaje się być C-jak i łańcuch używany do sprawdzania poprawności pliku w systemie plików jest obcięty na null.
Ale oczekiwałbym, że zachowanie w Javie zwróci false dla File.exists()
na tych niepoprawnych nazwach plików.
Aktualizacja: 19 września 2013
Java 1.7.0 Aktualizacja 40 ustaliła to jako część bug JDK-8014846 : File and other classes in java.io do not handle embedded nulls properly
To ciekawe interakcje z natywnym API. Czy to przynajmniej działa konsekwentnie? To znaczy. czy otwieranie plików o błędnych nazwach również działa? –
Tak, można nawet otworzyć plik, używając niepoprawnych nazw plików. –
Nazwałbym to artefaktem implementacji, prawdopodobnie błędem. Zdecydowanie nie jest to coś, na czym bym się opierał. W rzeczywistości U + 0000 jest jedyną postacią, której nigdy nie pozwoliłbym w nazwie pliku (nawet jeśli bazowy system operacyjny pozwoliłby na to, co wątpię w wiele). –