java.io.File中的空字符是否对存在检查有效?

Joa*_*elt 12 java file-io operating-system

当在文件名中遇到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());
    }
}
Run Code Online (Sandbox Code Playgroud)

运行这个的结果.

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,用于验证文件系统上的文件的字符串在null处被截断.

但我希望Java上的行为在File.exists()这些无效的文件名上返回false .

更新:2013年9月19日

Java 1.7.0 update 40已将此修复为 JDK-8014846的一部分:java.io中的文件和其他类不能正确处理嵌入的空值

Pet*_*rey 3

在 RHEL 上,似乎 nul 字节终止文件名(正如您在 C 中所期望的那样)

System.out.println("a exists " + new File("a").exists());
FileOutputStream fos = new FileOutputStream(new File("a\u0000aa"));
fos.close();
System.out.println("a exists " + new File("a").exists());
Run Code Online (Sandbox Code Playgroud)

印刷

a exists false
a exists true
Run Code Online (Sandbox Code Playgroud)

我怀疑 Java 应该阻止您尝试使用带有 nul 字节的文件名。