Khi một giá trị rỗng được bắt gặp trong một tên tệp trong java.io.File
, ký tự đó và tất cả các ký tự sau khi bị bỏ qua, dẫn đến một số hành vi lạ trong File.exists()
.Các ký tự rỗng trong java.io.File có hợp lệ để kiểm tra tồn tại không?
Hành vi này có một số khía cạnh của java.io.File.exists()
mà tôi đã bỏ lỡ không?
Ví dụ:
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());
}
}
Kết quả của hoạt động này.
a.txt exists: true (len=5) a.txt (null) exists: true (len=6) a.txt (nullx) exists: true (len=7)
Hệ thống Linux có JVM sau.
Java(TM) SE Runtime Environment (build 1.7.0_10-b18) Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)
Hành vi có vẻ giống như C và chuỗi được sử dụng để xác thực tệp trên hệ thống tệp bị cắt ngắn tại giá trị rỗng.
Nhưng tôi mong đợi hành vi ở Java sẽ trả về false cho File.exists()
về các tên tệp không hợp lệ này.
Cập nhật: 19 tháng 9 năm 2013
Java 1.7.0 cập nhật 40 đã cố định này như một phần của lỗi JDK-8014846 : File and other classes in java.io do not handle embedded nulls properly
Đó là một sự tương tác thú vị với các API bản địa. Ít nhất nó có hoạt động không? I E. không mở các tập tin với tên sai làm việc là tốt? –
Có, bạn thậm chí có thể mở đọc/ghi tệp bằng cách sử dụng tên tệp không hợp lệ. –
Tôi muốn gọi đây là một tạo phẩm triển khai, có thể là một lỗi. Chắc chắn không phải thứ tôi muốn. Trong thực tế, U + 0000 là về nhân vật duy nhất mà tôi không bao giờ cho phép trong một tên tập tin (ngay cả khi hệ điều hành cơ bản sẽ cho phép nó, mà tôi nghi ngờ nhiều người làm). –