Quellcode zur erläuterung

julia123

Erfahrenes Mitglied
hi alle zusammen,

ich hab ein Quellcode beommen und versuche diesene zu verstehen. Naja, ich hab an paar Stellen einfach nicht wieter gewusst was genau gemacht wird. Ich hoffe ihr könnt mir weiter helfen:

Code:
File file = null;
		List<String> beispiel = Files.readAllLines(file.toPath(),
				Charset.defaultCharset());

1 Zeile : ist die datei -> was soll man dazu sagen ? erlich gesagt versteh ich dieses File nicht ganz.
2-3.Zeile: was macht dieses readAllLines() ? es liest alle Zeilen ein ich denke das ist kein thema. aber was genau ist mit file.toPath() und Charset.defaultCharset() das ist glaube ich der Punkt wo ich nicht weiter komme.
ich kann mir grade nicht vorstellen was das so richtig ist Path ok irrgend etwas mit einem path () und Charset das sagt mir nix.
ich hoffe ich könnt mich verstehen :(

hier kommt mein 2 Teil:
Code:
String[] sp = line.split(String.valueOf(";"))
ok hie wird etwas gesplitet z.B.: "Hallo;ich;bin;es." dabei werden die Teile nach einem ; Zeichen gesplitet und gespeichert im array. Macht es ein unterscheid wenn ich statt String.valueOf(";") String.valueOf(';') schreibe allso das " mit das ' ersetze?
und angenommen ich will es nach weißen zeichen trennen was muss da rein?

vielen dank schon mal
 

saftmeister

Nutze den Saft!
Zu den ersten Fragen:

- File ist erstmal eine Klasse. Ich vermute es handelt sich um java.io.File. Damit kann ein Objekt erstellt werden, was es gestattet Operationen auf eine bestimmte Datei auszuführen. Z.B. schreiben, lesen, löschen usw.
- In der zweiten Zeile wird eine NullPointerException ausgelöst, da das Objekt file keine gültige Instanz darstellt und somit keine Methoden darauf angewendet werden können.
- Charset.defaultCharset() liefert eine Instanz des Standard-Zeichensatzes (ASCII, UTF8, etc.) zurück. Damit wird einfach sichergestellt, dass die Bytes mit einem bestimmtem Zeichensatz eingelesen werden. Das macht man, wenn man das Programm zwingen will, den Text in einer bestimmtem Sprache zu lesen.


Der zweite Teil:

Ja, du könntest auch valueOf(';') schreiben, denn es gibt eine Methode valueOf(char c) in der Klasse String. Wenn du nach weißen Zeichen (Leerzeichen?) trennen willst, musst du die einfach statt dem ; verwenden, ansonsten bietet split() an, nach regulären Ausdrücken zu splitten. Wenn du Whitespaces meinst, kannst du mit line.split("\s") trennen.
 

HonniCilest

Erfahrenes Mitglied
Der Quellcode kommt mir ein wenig vor wie eine Übung alle Fehler zu finden ohne Compiler. Ist das so? Und/Oder ist es vielmehr eine Gegenüberstellung verschiedener Methoden zum Einlesen einer Datei und du sollst die ggf. bewerten?

- File ist erstmal eine Klasse. Ich vermute es handelt sich um java.io.File.

Würde ich auch vermuten, jedoch hat java.io.File keine toPath() Methode. Ich denke jedoch toPath() soll hier die gleiche Funktion haben wie getPath() von java.io.File.

Weiterhin ist in den dargestellten Zeilen file null, was wie von saftmeister erwähnt zu einer NullPointerException führen würde. Oder hast du im Code noch irgendeine Zuweisung zu file? z.B.:
Java:
file = new File(arg);

readAllLines macht grundsätzlich folgendes:
Read all lines from a file. This method ensures that the file is closed when all bytes have been read or an I/O error, or other runtime exception, is thrown. Bytes from the file are decoded into characters using the specified charset.
Aber Achtung, dies ist keine gängige Methode eine Datei einzulesen, da diese nur bei kleinen Dateien Einsatz finden sollte. Gängiger ist es eine Datei Token-/Zeile-/Blockweise einzulesen, das gelesene Element zu bearbeiten und hinterher wegzuschmeisen. Da du hier line.split(); noch aufgeführt hast gehe ich davon aus, dass es auch ein Beispiel zum zeilenweise Einlesen gibt. Oder ist line ein iteriertes Element von beispiel?
 

julia123

Erfahrenes Mitglied
alles klar danke erst mal hat mir sehr weiter geholfen******

richtig ich soll Methoden bewerten und sie z.B. anders gestallten u.s.w.

ok , Files.readAllLines(file.toPath(),Charset.defaultCharset()); ich könnte doch statt file.toPath() sowas schreiebn "C://datei/..." also dient das nur zur lokalisierung. aber das mit Charset.defaultCharset() hab ich nicht ganz verstanden ? Wird jetzt ASCII vorrausgesetzt was meint man. Charset ist ja auch eine klasse die importiert wurde / wird. Für was ist die gut?
und ich hab mir die beschreibung auf englisch in java durch gelsesn und nicht wirklich verstanden was die methode .defaultCharset() macht.
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

der Standardzeichensatz (default Charset) ist abhängig vom Betriebssystem. Windows arbeitet normal mit cp1252, Linux mit UTF-8. Der Zeichensatz gibt an, wie bestimmte Sonderzeichen gespeichert werden. Dies ist vorallem zum Auslesen der Daten dann wichtig.

Wählst du beim Speichern der Datei und danach beim Laden einen unterschiedlichen Zeichensatz, dann kommt dabei folgendes raus: Beispiel (keine Werbung, nur schnell per Google gefunden ;))

Im Anhang ein Beispiel mit Notepad++, mit verschiedenen Zeichensätzen.

Grüße,
BK
 

Anhänge

  • a.png
    a.png
    2,5 KB · Aufrufe: 8
Zuletzt bearbeitet:

julia123

Erfahrenes Mitglied
alos ich hab win 8 also wird cp1252 als Standardzeichensatz vorrausgesetz. angenommen ich schreibe sowas hin Files.readAllLines(file.toPath(),null)? was passiert jetzt wird jetzt alles angenommen?
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi julia123,

das wird dir eine schöne NullpointerException werfen.
Files.java, Zeile 3005:
Java:
    public static List<String> readAllLines(Path path, Charset cs)
        throws IOException
    {
        try (BufferedReader reader = newBufferedReader(path, cs)) {
// ...
Dann weiter zu Files.java, Zeile 2674:
Java:
    public static BufferedReader newBufferedReader(Path path, Charset cs)
        throws IOException
    {
        CharsetDecoder decoder = cs.newDecoder();

Grüße,
BK
 

HonniCilest

Erfahrenes Mitglied
Wenn du den Code anders gestalten darfst würde ich auf garkeinen Fall bei dem readAllLines bleiben. Selbst in den Java-Docs steht geschrieben, dass es nur selten Anwendung finden sollte.

Du kannst z.B. den Scanner verwenden. Dieser hat auch einen Konstruktur mit File und verwendet sogar automatisch den defaultCharset, d.h. du musst es nicht zwingend extra angeben. Die Zeilen der Datei kannst du dann iterieren ohne diese in einer Liste zwischenspeichern zu müssen.

Beispiel
Java:
File file = new File(strPath);
Scanner scanner = new Scanner(file); //Charset wird automatisch gesetzt
while(scanner.hasNextLine()) {
    String line = scanner.nextLine(); //Es wird nur eine Zeile in den Speicher geladen, nicht alle!
    String[] sp = line.split(";");
    //Beispiel Anwendungsfall: Update einer Datenbank mit den einzelnen Token
}

Im Beispiel verwendest du mehr als einen Token einer Zeile gleichzeitig, z.B. für ein Datenbank-Update.
Meistens wird das zeilenweise Einlesen benötigt.
Es könnte auch Beispiele geben, wo du nur ein Token verwenden musst. Dann würde es sogar Sinn machen dem Scanner gleich den Delimiter mitzugeben.

Beispiel
Java:
File file = new File(strPath);
Scanner scanner = new Scanner(file); //Charset wird automatisch gesetzt
scanner.useDelimiter(";");
while(scanner.hasNext()) {
    String token = scanner.next(); //Auch hier wird nur ein Element in den Speicher geladen und keine ganze Liste.
    System.out.println("Next token: " + token);
}

Der Default Delimiter ist hier im übrigen auch Whitespace.
 
Zuletzt bearbeitet: