Tout en recherche sur Google, je vois que l’utilisation de `` peut être lent. `` a une `` méthode qui est également disponible.
Y a-t-il un moyen efficace en java pour obtenir la taille du fichier ?
Eh bien, j'ai essayé de messure avec le code ci-dessous:
Pour les courses = 1 et itérations = 1 à l'URL méthode est la plus rapide, la plupart du temps suivi par le canal. J'ai fini avec quelque pause fraîcheur environ 10 fois. Donc, pour un temps d'accès, à l'aide de l'URL est le moyen le plus rapide je pense:
LENGTH sum: 10626, per Iteration: 10626.0
CHANNEL sum: 5535, per Iteration: 5535.0
URL sum: 660, per Iteration: 660.0
Pour les courses = 5 et itérations = 50 la photo tirages différents.
LENGTH sum: 39496, per Iteration: 157.984
CHANNEL sum: 74261, per Iteration: 297.044
URL sum: 95534, per Iteration: 382.136
Le fichier doit être mise en cache les appels au système de fichiers, alors que les canaux et les URL ont des frais généraux.
Code:
import java.io.*;
import java.net.*;
import java.util.*;
public enum FileSizeBench {
LENGTH {
@Override
public long getResult() throws Exception {
File me = new File(FileSizeBench.class.getResource(
"FileSizeBench.class").getFile());
return me.length();
}
},
CHANNEL {
@Override
public long getResult() throws Exception {
FileInputStream fis = null;
try {
File me = new File(FileSizeBench.class.getResource(
"FileSizeBench.class").getFile());
fis = new FileInputStream(me);
return fis.getChannel().size();
} finally {
fis.close();
}
}
},
URL {
@Override
public long getResult() throws Exception {
InputStream stream = null;
try {
URL url = FileSizeBench.class
.getResource("FileSizeBench.class");
stream = url.openStream();
return stream.available();
} finally {
stream.close();
}
}
};
public abstract long getResult() throws Exception;
public static void main(String[] args) throws Exception {
int runs = 5;
int iterations = 50;
EnumMap<FileSizeBench, Long> durations = new EnumMap<FileSizeBench, Long>(FileSizeBench.class);
for (int i = 0; i < runs; i++) {
for (FileSizeBench test : values()) {
if (!durations.containsKey(test)) {
durations.put(test, 0l);
}
long duration = testNow(test, iterations);
durations.put(test, durations.get(test) + duration);
// System.out.println(test + " took: " + duration + ", per iteration: " + ((double)duration / (double)iterations));
}
}
for (Map.Entry<FileSizeBench, Long> entry : durations.entrySet()) {
System.out.println();
System.out.println(entry.getKey() + " sum: " + entry.getValue() + ", per Iteration: " + ((double)entry.getValue() / (double)(runs * iterations)));
}
}
private static long testNow(FileSizeBench test, int iterations)
throws Exception {
long result = -1;
long before = System.nanoTime();
for (int i = 0; i < iterations; i++) {
if (result == -1) {
result = test.getResult();
//System.out.println(result);
} else if ((result = test.getResult()) != result) {
throw new Exception("variance detected!");
}
}
return (System.nanoTime() - before) / 1000;
}
}
Tous les cas de test dans ce post sont des lacunes, car ils ont accès au même fichier pour chaque méthode testée. Si la mise en cache disque coups de pied dans les tests 2 et 3 en bénéficier. Pour prouver mon point, j'ai pris de cas de test fourni par GHAD et changé l'ordre d'énumération et ci-dessous sont les résultats.
En regardant le résultat, je pense que Fichier.longueur() est le vainqueur vraiment.
Afin de tester est de l'ordre de sortie. Vous pouvez même voir le temps pris sur ma machine a varié entre les exécutions mais Fichier.Longueur() lorsqu'il n'est pas premier, et d'engager d'abord l'accès au disque gagné.
---
LENGTH sum: 1163351, per Iteration: 4653.404
CHANNEL sum: 1094598, per Iteration: 4378.392
URL sum: 739691, per Iteration: 2958.764
---
CHANNEL sum: 845804, per Iteration: 3383.216
URL sum: 531334, per Iteration: 2125.336
LENGTH sum: 318413, per Iteration: 1273.652
---
URL sum: 137368, per Iteration: 549.472
LENGTH sum: 18677, per Iteration: 74.708
CHANNEL sum: 142125, per Iteration: 568.5
Je suis tombé sur cette même question. J'avais besoin d'obtenir la taille du fichier et la date de modification de 90 000 fichiers sur un partage réseau. À l'aide de Java, et d'être aussi minimaliste que possible, il faudrait un temps très long. (J'ai besoin d'entrer l'URL du fichier et le chemin d'accès de l'objet. Si son quelque peu varié, mais plus d'une heure.) J'ai ensuite utilisé un natif Win32 exécutable, et fait la même tâche, et tout simplement le chemin d'accès au fichier, de modification et la taille de la console, et exécuté à partir de Java. La vitesse était incroyable. Le processus natif, et ma chaîne de manutention pour lire les données peuvent ainsi traiter plus de 1000 points par seconde.
Ainsi, même si les gens ont classé le commentaire ci-dessus, c'est une solution valable, et ont permis de résoudre mon problème. Dans mon cas, je savais que les dossiers j'ai besoin de la taille de l'avance de temps, et j'ai pu passer que dans la ligne de commande pour mon win32 application. Je suis allé d'heures pour traiter un répertoire de minutes.
La question ne semblent également être spécifiques à Windows. OS X n'ont pas le même problème et pourrait réseau d'accès de fichier info aussi vite que les OS ne pouvait le faire.
Java gestion des Fichiers sur Windows est terrible. Local d'accès au disque pour les fichiers est très bien. C'était juste des partages réseau qui a provoqué la terrible performance. Windows pourrait obtenir des informations sur le réseau de partage et de calculer la taille totale en moins d'une minute de trop.
--Ben
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.