Hey, momentan lasse ich mir die Namen aller Dateien im Verzeichnis ausgeben.
Ich würde aber gerne nur den Namen der Datei an erster Stelle , zweiter Stelle etc. ausgeben lassen, sodass ich nacher dann mit einer for-schleife alle Namen zum weiterverarbeiten bekomme
{
File folder = new File(path);
for( File file : folder.listFiles() )
{
System.out.println( file.getName() );
}
}```
Kann gelöscht werden habs selber gelöst.
Falls interesse besteht:
public String name(int i) throws NoSuchElementException
{
File folder = new File(path);
for( File file : folder.listFiles() )
{
filename.add(file.getName()); // Liste mit den namen aller Dateien
Sehr sinnvolle Methode. Bei jedem Aufruf wird der komplette Verzeichnisinhalt IMMER WIEDER geaddet… Fällt das Dir nicht auf?
Im Übrigen ist das Zwischenspeichern in einer Liste überhaupt nicht nötig. Die Methode listFiles() gibt Dir einen Array zurück. Da kann man auch mit index drauf zugreifen. return folder.listFiles()**.getName();
Ja, aber der Ansatz ist schon gut. Es gibt keine festgelegte Reihenfolge für list() oder listFiles(). Auch keine Methode, der man Visitor oder übergeben oder die Iterator zurückgibt, sondern nur komplette Dateiliste. Dann muss man “zwischenspeichern”.
There is no guarantee that the name strings in the resulting array will appear in any specific order; they are not, in particular, guaranteed to appear in alphabetical order.
2teres auf keinen Fall. file_names verstößt in Java gegen die Naming Conventions (siehe meine Signatur). Und da es hier um „Filenames“ geht, braucht man kein UpperCamelCase lowerCamelCase zu erzwingen. Ein einfaches filenames wäre da schon in Ordnung.
@TO: Ansonsten sehe ich das wie nillehammer. Mit der Liste machste du dir nur Mehrarbeit die sich nicht lohnt. Nutze einfach das Files-Array, welches dir listFiles() zurück gibt (kannst dir ja auch in einer Membervariablen merken) und gut ists. Dann haste vllt sowas:
private File[] files;
public MyFolderReader() {
readFiles();
}
private void readFiles() {
files = new File("C:\\MEIN\\PFAD\\ZUM\\ORDNER").listFiles();
}
public String getFile(int index) {
return files[index].getName();
}
}```
Schreib mal ganze Sätze. Nach dem 20ten mal lesen hab ichs glaub z.T entziffern können (zumindest den Teil mit UpperCamelCase). Ja das war natürlich Schwachsinn. Ich meinte natürlich (wie du richtig erkannt hast) lowerCamelCase.
listFiles() gibt die Rückgabe-Liste nicht nach einem Kriterium sortiert zurück, sondern sie kann sortiert sein, muss sie aber nicht. Whrs. ist das system-, plattform- oder runtime-spezifisch. Wie soll man det genauer beschreiben, det funkt nicht. Wie Variablennamen geschrieben werden sollten usw. Und das nicht jedes mal eine Liste erstellt werden soll, sondern z. B. Attribut oder Iterator. Vielleicht verstehe ich auch was falsch. Wir brauchten mehr Code, um weiterhelfen.
Sry, heute ist schwer, vollständige/vernünftige Sätze, du kennst das doch von mir.
Wenn sich der Verzeichnisinhalt nicht ändert, kann man den Code von getName in den Konstruktor packen (soll ja auch nur einmal aufgerufen werden). Statt der Schleife sollte auch fileName = Arrays.asList(new File(path).list()); gehen.
“gesamte Inhalt des Verzeichnisses erneut” - nicht schlimm, der Flaschenhals ist der user (Benutzereingabe).
Mach das doch so, eine eigene Klasse File:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
/**
* @author CB
*/
public class MyFiles {
private List<File> files;
private List<File> files_sorted1;
private List<File> files_sorted2;
public MyFiles() {
File f = new File("C:\\Users\\blablabla\\Desktop\\");
files = new ArrayList<File>(Arrays.asList(f.listFiles()));
for (Iterator<File> iter = files.iterator(); iter.hasNext();) {
File file = iter.next();
if (!file.isFile() || !file.canRead()) {
iter.remove();
}
}
Collections.shuffle(files); // TODO
files_sorted1 = new ArrayList<File>(files);
Collections.sort(files_sorted1);
files_sorted2 = new ArrayList<File>(files);
Collections.sort(files_sorted2, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
String n1 = o1.getName(), n2 = o2.getName();
if (n1.length() < n2.length()) {
return 1;
}
if (n1.length() > n2.length()) {
return -1;
}
return n1.compareTo(n2);
}
});
System.out.println(files); // TODO
System.out.println(files_sorted1);
System.out.println(files_sorted2);
}
public File getFile(int index, Boolean mode) {
if (mode == null) {
return files.get(index);
}
if (mode) {
return files_sorted1.get(index);
}
return files_sorted2.get(index);
}
public String getFileName(int index, Boolean mode) {
if (mode == null) {
return files.get(index).getName();
}
if (mode) {
return files_sorted1.get(index).getName();
}
return files_sorted2.get(index).getName();
}
public static void main(String[] args) {
MyFiles mf = new MyFiles();
for (int i = 0; i < 999; i++) { // TODO
System.out.println(mf.getFileName(i, null));
System.out.println(mf.getFileName(i, true));
System.out.println(mf.getFileName(i, false));
System.out.println("");
}
}
}```
Hab auch lange über eine Map nachgedacht, aber die macht in diesem Fall keinen sinn.
"TODO": An dieser Stelle kannst du werkeln oder weglassen.
An der Stelle möchte ich mal dezent auf den Link in meiner Signatur mit Namen „Naming Conventions“ hinweisen.
Richtig erkannt. Deswegen nochmal der wink: einfach das Array zu nehmen tuts in deinem Fall höchstwahrscheinlich auch. Zumindest solange es mithilfe von [japi]File#listFiles–[/japi] erstellt/befüllt wird.
Es ist nicht kompliziert, die Arbeit, shuffle (unnötig, nur Demo) und sort, macht Java schon, du musst nur die Methodenrückgabeergebnisliste in einer Objektvariablen zwischenspeichern, sonst ist das Proggi nicht effizient. Dafür kann man eine eigene Klasse nehmen, und dem Konstruktor z. B. den Verzeichnisnamen übergeben (da fehlt ein //TODO ). Anstatt dem Wrapper Boolean mode wäre auch boolean… denkbar, hier varArgs, oder ein zweiter Index. Bei mir ist die Liste schon nach der aktuellen/letzten Einstellung der Windows-Explorer-Darstellung sortiert. Objekte, die etwas speichern, das ist OOP, denke alles in Objekten. Oben fehlt die Klasse Item, ohne Item kann man Spekulation, was das Proggi machen soll. Viell. sagt Landei oder ein anderer auch noch was dazu.
*** Edit ***
Ich kenne die conventions. Aber wie würdest du Sortiertliste übersetzen (sortierte Liste)?, also so etwas wie Schnellauto (schnelles Auto)? So weit reichen meine Kenntnisse nicht. Also Englisch -5.
myObj
myVar
myVal
MY_CONST
myMethod
MyClazz
MyInterf
i
j
l
m
usw.