Так что я столкнулся с этим на сетевых дисках. Болезненные. У меня был каталог с 17000 + файлами. На локальном диске потребовалось менее 2 секунд, чтобы проверить последнюю измененную дату. На сетевом диске это заняло 58 секунд !!! Конечно, мое приложение - интерактивное приложение, поэтому у меня были некоторые жалобы.
После некоторого исследования я решил, что можно будет реализовать некоторый код JNI, чтобы сделать файл findfirstfile/findnextfile/findclose Windows Kernel32, чтобы значительно улучшить процесс, но потом у меня была 32-разрядная и 64-разрядная версия и т. Д. а затем потерять возможности кросс-платформы.
Хотя немного неприятный взлом здесь - это то, что я сделал. Мое приложение работает в основном в Windows, но я не хотел его ограничивать, поэтому я сделал следующее. Проверьте, работает ли я на окнах. Если да, то посмотрите, использую ли я локальный жесткий диск. Если нет, мы собираемся сделать хакерский метод.
Я хранил все нечувствительные к регистру. Вероятно, это не отличная идея для других ОС, которые могут иметь каталог с обоими «ABC» и «abc». Если вам нужно это сделать, вы можете решить, создав новый файл («ABC») и новый файл («abc»), а затем используя метод equals для их сравнения. На нечувствительных к регистру файловых системах, таких как окна, он вернет true, но в системах Unix он вернет false.
Хотя это может быть немного взломанным, время, затрачиваемое на переход от 58 секунд до 1,6 секунды на сетевом диске, поэтому я могу жить с взломом.
boolean useJaveDefaultMethod = true;
if(System.getProperty("os.name").startsWith("Windows"))
{
File f2 = f.getParentFile();
while(true)
{
if(f2.getParentFile() == null)
{
String s = FileSystemView.getFileSystemView().getSystemTypeDescription(f2);
if(FileSystemView.getFileSystemView().isDrive(f2) && "Local Disk".equalsIgnoreCase(s))
{
useJaveDefaultMethod = true;
}
else
{
useJaveDefaultMethod = false;
}
break;
}
f2 = f2.getParentFile();
}
}
if(!useJaveDefaultMethod)
{
try
{
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/C", "dir " + f.getParent());
pb.redirectErrorStream(true);
Process process = pb.start();
InputStreamReader isr = new InputStreamReader(process.getInputStream());
BufferedReader br = new BufferedReader(isr);
String line;
DateFormat df = new SimpleDateFormat("dd-MMM-yy hh:mm a");
while((line = br.readLine()) != null)
{
try
{
Date filedate = df.parse(line);
String filename = line.substring(38);
dirCache.put(filename.toLowerCase(), filedate.getTime());
}
catch(Exception ex)
{
}
}
process.waitFor();
Long filetime = dirCache.get(f.getName().toLowerCase());
if(filetime != null)
return filetime;
}
catch(Exception Exception)
{
}
}
// this is SO SLOW on a networked drive!
long lastModifiedDate = f.lastModified();
dirCache.put(f.getName().toLowerCase(), lastModifiedDate);
return lastModifiedDate;
Я использовал метод пула потоков. Намного быстрее! – dacwe 2010-12-07 09:09:22