我在我们的生产代码中注意到了这个问题:
java.lang.IllegalArgumentException: /somePath/?.png does not exist
at org.apache.commons.io.FileUtils.sizeOf(FileUtils.java:2413)
at org.apache.commons.io.FileUtils.sizeOfDirectory(FileUtils.java:2479)
Run Code Online (Sandbox Code Playgroud)
根本原因是这样的:
import java.io.File;
public class FileNameTest
{
public static void main(String[] args)
{
File[] files = new File("/somePath").listFiles();
for (File file : files)
{
System.out.println(file + " - " + (file.exists() ? "exists" : "missing!!"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
0.png - exists
7.png - exists
4.png - exists
8.png - exists
1.png - exists
3.png - exists
?.png - missing!!
2.png - exists
5.png - exists
?.png - missing!!
6.png …Run Code Online (Sandbox Code Playgroud) 我们在沙盒 Java Applet 中遇到问题,因为 SecurityManager 执行反向 DNS 查找。见其他问题。
但潜在的问题是,反向 DNS 查找需要大约 4.5 秒(没有域结果)。问题不是丢失的结果(在这种情况下它返回 IP),只是它需要很长时间。
这个问题也与 SecurityManager 无关,它只会在那里成为一个问题,因为 Permissions 类在运行到这个时持有一个锁,因此冻结了许多其他线程 4.5(或更多)秒。
还有一些域没有域名结果(即返回 IP),不需要 4.5 秒。例如“staminus.net”。
SSCCE:
String host = "random.org";
// "random.org" - IP result, takes 4.5 seconds
// "cdn.knuddelscom.de" - IP result, takes 4.5 seconds
// "staminus.net" - IP result, fast
// "google.com" - domain result: fra15s11-in-f14.1e100.net, fast
InetAddress addr = Inet4Address.getByName(host);
for (int i = 0; i < 100; i++)
{
long start = System.currentTimeMillis();
String hostName …Run Code Online (Sandbox Code Playgroud)