2011-06-30 6 views
5

To jest okropne pytanie (w mojej głowie) i starałem się jak najlepiej znaleźć użyteczną dokumentację przy odrobinie szczęścia - tak, tutaj:Spójna kolejność Java File.list()?

Mam kod, który musi wykonać operację na wszystkich plikach w katalog. Ustawiam katalog w obiekcie File i używam fileObject.list() do iteracji plików w katalogu. Zostawiłem ten kod działający w ciągu jednej nocy, a on (po wielu nieudanych próbach) rozbił się w pewnym momencie. Próbuję dowiedzieć się, w którym momencie to się stało (tak, miałem okropne logowanie). Teraz, zgodnie z this javadoc, nie ma gwarancji zamówienia (alfabetycznie lub inaczej) podczas wymieniania plików, zastanawiam się, czy istnieje gwarancja spójności? Czy oznacza to, że gdy dwukrotnie uruchomię ten sam kod, otrzymam dokładnie tę samą kolejność plików? Logic mówi mi, że powinien, i wznowiłem operacje oparte na tym, ale jestem podejrzliwy. Ponadto jestem ciekawy, co "brak konkretnego porządku oznacza" od javadoc.

+1

Jeśli chcesz zagwarantować zamówienie, dlaczego nie użyć "Komparatora"? – mre

+0

Pliki mogą się zmieniać, gdy aplikacja jest uruchomiona ... co może zmienić sytuację w każdym z nich. Zamówienie najprawdopodobniej zależy od implementacji systemu plików. Najprawdopodobniej odpowiedź brzmi "tak, jest spójność", tak jakbyś robił "ls" lub "dir" w wierszu poleceń, daje ci spójność, ale nie gwarantuje sortowania alfabetycznego. – ricosrealm

+0

Ach tak, chciałbym (teraz), ale to jest wznowienie biegu, który się nie powiódł, a ja nie chcę powtarzać przetworzonych plików. – kyun

Odpowiedz

13

Ten język oznacza, że ​​nie powinieneś polegać na żadnych właściwościach zamówienia, w tym na spójności od uruchomienia do uruchomienia.

Jeśli istnieje jakaś połączona lista plików w strukturze danych w pamięci, sterownik może przenieść ostatnio uzyskany dostęp do przodu listy, aby zoptymalizować pod kątem wielokrotnego dostępu do plików. Może to zmienić kolejność plików, nawet jeśli żaden plik nie został zmodyfikowany.

Jeśli chcesz spójnego porządku, można zrobić coś takiego

Arrays.sort(
    myFileArray, 
    new Comparator<File>() { 
    public int compare(File a, File b) { 
     return a.getName().compareTo(b.getName()); 
    } 
    }); 
+1

To niepokojące. I trochę tego, czego się spodziewałem. Nie mam sposobu, aby dowiedzieć się, jakie pliki zostały przetworzone, a co nie. Z tą okropną rejestracją. Ten rodzaj ma sens, ale byłby przydatny, gdybym chciał zacząć wszystko od nowa. W każdym razie dzięki! – kyun

+4

Może warto zajrzeć do nowego API 'WatchService' w java 7. http: // stackoverflow.com/questions/494869/file-changed-listener-in-java/494957 # 494957 –

+0

+1 dla "WatchService" ... te rzeczy są seksowne! – mre

0

Biorąc pod uwagę, że pliki, na które patrzysz, nie zmieniają się między rozmowami i jeśli uruchomisz je na tej samej platformie dwa razy, sądzę, że uzyskasz takie same wyniki.

+0

Czy moja nadzieja również - tylko zastanawiam się, czy jest dokumentacja do tego skutku, która uspokoi mój umysł – kyun

+0

Zasadniczo, nie polegaj na spójności tutaj . Podoba mi się odpowiedź Mike'a. – mkro

+0

To jest tak ważne, że uruchomiłbym program ponownie, ale najpierw sortuję pliki i zaimplementuję logi – woliveirajr

0

nie ma gwarancji porządku, ale AFAIK nie ma „gwarancja niespójności”, więc nazywając go dwukrotnie, zważywszy, że bez plików zostały zmienione lub dotknięte w jakikolwiek sposób, prawdopodobnie dadzą ci to samo zamówienie. Ale jeśli "przetwarzałeś" je, prawdopodobnie zostały dotknięte.

Dla zdrowia psychicznego, polecam sortować je, gdy je otrzymasz, jeśli masz zamiar polegać na spójności.

+0

:) Powinienem być bardziej przejrzysty - czytam je, a nie edytuję. Struktura katalogów i pliki w nim zawarte nie ulegają zmianie. To powiedziawszy, jak zauważa Mike Samuel, system plików prawdopodobnie będzie odgrywał pewną rolę w kolejności, co oznacza, że ​​mogę nie otrzymać dokładnie tego samego zamówienia. – kyun

+0

Zawsze można spróbować przetestować, czy zamówienie zostało zachowane. To najprostszy sposób, aby się upewnić, czy jest wystarczająco stabilny, aby kontynuować bieg z miejsca, w którym się zatrzymał. – trutheality

+0

Zrobiłem i wydawało mi się, że wszystko w porządku. Ale to doprowadziło do tego pytania, zastanawiając się, czy to jest zawsze prawdziwe/tylko szczęśliwe tym razem – kyun

0

Zgodnie z dokumentacją nie można oczekiwać żadnej kolejności plików. W szczególności dwa kolejne połączenia mogą zwracać różne zamówienia. Jeśli chcesz konkretnego zamówienia, np. alfabetycznie, musisz posortować listę samodzielnie.