Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Exceptions
7 Äußere.innere Klassen
8 Besondere Klassen der Java SE
9 Generics<T>
10 Architektur, Design und angewandte Objektorientierung
11 Die Klassenbibliothek
12 Einführung in die nebenläufige Programmierung
13 Einführung in Datenstrukturen und Algorithmen
14 Einführung in grafische Oberflächen
15 Einführung in Dateien und Datenströme
16 Einführung in die <XML>-Verarbeitung mit Java
17 Einführung ins Datenbankmanagement mit JDBC
18 Bits und Bytes und Mathematisches
19 Die Werkzeuge des JDK
A Die Klassenbibliothek
Stichwort

Download:
- Aufgaben, ca. 1,1 MB
- Programme, ca. 12,8 MB

Buch bestellen
Ihre Meinung?

Spacer
Java ist auch eine Insel von Christian Ullenboom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
Galileo Computing
1308 S., 10., aktualisierte Auflage, geb., mit DVD
ca. 49,90 Euro, ISBN 978-3-8362-1802-3
Pfeil 15 Einführung in Dateien und Datenströme
Pfeil 15.1 Datei und Verzeichnis
Pfeil 15.1.1 Dateien und Verzeichnisse mit der Klasse File
Pfeil 15.1.2 Verzeichnis oder Datei? Existiert es?
Pfeil 15.1.3 Verzeichnis- und Dateieigenschaften/-attribute
Pfeil 15.1.4 Umbenennen und Verzeichnisse anlegen
Pfeil 15.1.5 Verzeichnisse auflisten und Dateien filtern
Pfeil 15.1.6 Dateien und Verzeichnisse löschen
Pfeil 15.2 Dateien mit wahlfreiem Zugriff
Pfeil 15.2.1 Ein RandomAccessFile zum Lesen und Schreiben öffnen
Pfeil 15.2.2 Aus dem RandomAccessFile lesen
Pfeil 15.2.3 Schreiben mit RandomAccessFile
Pfeil 15.2.4 Die Länge des RandomAccessFile
Pfeil 15.2.5 Hin und her in der Datei
Pfeil 15.3 Dateisysteme unter NIO.2
Pfeil 15.3.1 FileSystem und Path
Pfeil 15.3.2 Die Utility-Klasse Files
Pfeil 15.4 Stream-Klassen und Reader/Writer am Beispiel von Dateien
Pfeil 15.4.1 Mit dem FileWriter Texte in Dateien schreiben
Pfeil 15.4.2 Zeichen mit der Klasse FileReader lesen
Pfeil 15.4.3 Kopieren mit FileOutputStream und FileInputStream
Pfeil 15.4.4 Datenströme über Files mit NIO.2 beziehen
Pfeil 15.5 Basisklassen für die Ein-/Ausgabe
Pfeil 15.5.1 Die abstrakten Basisklassen
Pfeil 15.5.2 Übersicht über Ein-/Ausgabeklassen
Pfeil 15.5.3 Die abstrakte Basisklasse OutputStream
Pfeil 15.5.4 Die Schnittstellen Closeable, AutoCloseable und Flushable
Pfeil 15.5.5 Die abstrakte Basisklasse InputStream
Pfeil 15.5.6 Ressourcen aus dem Klassenpfad und aus Jar?Archiven laden
Pfeil 15.5.7 Die abstrakte Basisklasse Writer
Pfeil 15.5.8 Die abstrakte Basisklasse Reader
Pfeil 15.6 Datenströme filtern und verketten
Pfeil 15.6.1 Streams als Filter verketten (verschachteln)
Pfeil 15.6.2 Gepufferte Ausgaben mit BufferedWriter und BufferedOutputStream
Pfeil 15.6.3 Gepufferte Eingaben mit BufferedReader/BufferedInputStream
Pfeil 15.7 Vermittler zwischen Byte-Streams und Unicode-Strömen
Pfeil 15.7.1 Datenkonvertierung durch den OutputStreamWriter
Pfeil 15.7.2 Automatische Konvertierungen mit dem InputStreamReader

Rheinwerk Computing - Zum Seitenanfang

15.3 Dateisysteme unter NIO.2Zur nächsten Überschrift

Die bisher vorgestellten Konzepte gibt es im Wesentlichen schon seit den Urzeiten von Java, also seit Java 1.0. In den letzten Jahren ist rund um die File-Klasse wenig passiert. Doch Entwickler quälten sich immer wieder mit ganz zentralen Fragen, die die bisherigen Implementierungen nicht wirklich lösten:

  • Wie lässt sich eine Datei einfach und schnell kopieren?
  • Wie lässt sich eine Datei verschieben, wobei die Semantik auf unterschiedlichen Plattformen immer gleich ist.
  • Wie lässt sich auf eine Änderung im Dateisystem reagieren, sodass ein Callback uns informiert, dass sich eine Datei verändert hat?
  • Wie lässt sich einfach ein Verzeichnis rekursiv ablaufen?
  • Wie lässt sich eine symbolische Verknüpfung anlegen und verfolgen?
  • Wie lässt sich realisieren, dass die File-Operationen abstrahiert werden und nicht nur auf dem lokalen Dateisystem basieren? Wünschenswert ist eine Abstraktion, sodass die gleiche API auch ein virtuelles Dateisystem im Hauptspeicher, entfernte Dateisysteme wie FTP oder ein Repository anspricht.

Diese Probleme wurden für Java 7 angegangen und in der JSR-203, »More New I/O APIs for the JavaTM Platform ("NIO.2")«, spezifiziert. Die JSR began schon 2003, und so waren die Erwartungen der Java-Community groß, dass sie nicht so lange warten müssten. Aber erst in Java 7 kam es zum großen Wurf. Das macht die »alte« File-Klasse eigentlich überflüssig, aber vermutlich scheut sich Oracle davor, ein @Deprecated an die Klasse zu setzen, denn sonst würden plötzlich riesige Mengen Quellcode in vielen Programmen markiert.


Rheinwerk Computing - Zum Seitenanfang

15.3.1 FileSystem und PathZur nächsten ÜberschriftZur vorigen Überschrift

Im Zentrum der in Java 7 und NIO.2 eingeführten neuen Klassen stehen FileSystem und Path. Die neuen Typen befinden sich im Gegensatz zu File, das im java.io-Paket liegt, im Paket java.nio.file. Es gibt zwar einige Überlappungen, doch NIO.2 ist mehr oder weniger komplett vom »alten« Modell getrennt:

  • FileSystem beschreibt ein Datensystem und ist eine abstrakte Klasse. Es wird von konkreten Dateisystemen, wie dem lokalen Dateisystem oder einem Zip-Archiv, realisiert. Um an das aktuelle Dateisystem zu kommen, deklariert die Klasse FileSystems eine statische Methode: FileSystems.getDefault().
  • Path repräsentiert einen Pfad zu einer Datei oder einem Verzeichnis, wobei die Pfad-angaben relativ oder absolut sein können. Die Methoden erinnern ein wenig an File, doch der große Unterschied ist, dass File selbst die Datei oder das Verzeichnis repräsentiert und Anfragemethoden wie isDirectory() oder lastModified() deklariert, während Path nur den Pfad repräsentiert und nur pfad-bezogene Methoden anbietet. Modifikationsmethoden gehören nicht dazu; dazu dienen extra Typen wie BasicFileAttributes für Attribute.

Ein Path-Objekt aufbauen

Ein Path-Objekt lässt sich nicht wie File über einen Konstruktor aufbauen, da die Klasse abstrakt ist. File und Path haben aber dennoch einiges gemeinsam, etwa dass sie immutable sind. Das FileSystem-Objekt bietet die entsprechende Methode getPath(), und ein FileSystem wird über eine Fabrikmethode von FileSystems erfragt.

Beispiel

Baue ein Path-Objekt auf:

FileSystem fs = FileSystems.getDefault();
Path p = fs.getPath( "C:/Windows/Fonts/" );

Da der Ausdruck FileSystems.getDefault().getPath() etwas unhandlich ist, existiert die Methode get() in der Utility-Klasse Paths. Auch aus einem File-Objekt lässt sich mit toPath() ein Path ableiten, was bedeutet, dass Oracle für Java 7 noch einmal die File-Klasse angefasst und auf die neuen NIO.2-Klassen angepasst hat. Wir werden die Vereinfachung mit Paths.get() im Folgenden nutzen.

final class java.nio.file.Paths
  • static Path get(String first, String... more)
    Erzeuge einen Pfad aus Segmenten. Wenn etwa »\« der Separator ist, dann ist Paths.get("a", "b", "c") gleich Paths.get("a\\b\\c").
  • static Path get(URI uri)
    Erzeugt einen Pfad aus einer URI.

Jedes Path-Objekt hat auch eine Methode getFileSystem(), um wieder an das FileSystem zu kommen.

Abbildung

Abbildung 15.3: Abhängigkeiten der Klassen Paths und Path


Rheinwerk Computing - Zum Seitenanfang

15.3.2 Die Utility-Klasse FilesZur nächsten ÜberschriftZur vorigen Überschrift

Da die Klasse Path nur Pfade, aber keine Dateiinformationen wie die Länge oder Änderungszeit repräsentiert und Path auch keine Möglichkeit bietet, Dateien anzulegen und zu löschen, übernimmt die Klasse Files diese Aufgaben.

Einfaches Einlesen und Schreiben von Dateien

Nach 15 Jahren des Wartens gibt es nun auch Methoden, die den Dateiinhalt einlesen oder Strings bzw. ein Byte-Feld schreiben.

Listing 15.2: com/tutego/insel/nio2/ListAllLines.java

package com.tutego.insel.nio2;

import java.io.IOException;
import java.net.*;
import java.nio.charset.Charset;
import java.nio.file.*;

public class ListAllLines
{
public static void main( String[] args ) throws IOException, URISyntaxException
{
URI uri = ListAllLines.class.getResource( "/lyrics.txt" ).toURI();
Path path = Paths.get( uri );
System.out.printf( "Datei '%s' mit Länge %d Byte(s) hat folgendes Zeilen:%n",
path.getFileName(), Files.size( path ) );
int lineCnt = 1;
for ( String line : Files.readAllLines( path, StandardCharsets.UTF_8 ) )
System.out.println( lineCnt++ + ": " + line );
}
}
Abbildung

Abbildung 15.4: UML-Diagramm von Files

Hinweis

Auch wenn es naheliegt, die Files-Methode zum Einlesen mit einem Path-Objekt zu füttern, das ein HTTP-URI repräsentiert, funktioniert dies nicht. So liefert schon die erste Zeile des Programms eine Ausnahme des Typs »java.nio.file.FileSystemNotFoundException: Provider "http" not installed«.

Path path = Paths.get( new URI( "http://tutego.de/aufgaben/bond.txt" ) );
String content = new String( Files.readAllBytes( path ),
StandardCharsets.UTF_8 );
System.out.println( content );
Vielleicht kommt in der Zukunft ein Standard-Provider von Oracle, doch es ist davon auszugehen, dass quelloffene Lösungen diese Lücke schließen werden. Schwer zu programmieren sind Dateisystem-Provider nämlich nicht.

final class java.nio.file.Files
  • static long size(Path path) throws IOException
  • static byte[] readAllBytes(Path path) throws IOException
  • static List<String> readAllLines(Path path, Charset cs) throws IOException
  • static Path write(Path path, byte[] bytes, OpenOption... options) throws IOException
  • static Path write(Path path, Iterable<? extends CharSequence> lines, Charset cs,
    OpenOption... options) throws IOException


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Java ist auch eine Insel





Java ist auch eine Insel
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Java SE Bibliotheken






 Java SE Bibliotheken


Zum Katalog: Professionell entwickeln mit Java EE 7






 Professionell
 entwickeln mit
 Java EE 7


Zum Katalog: Einstieg in Eclipse






 Einstieg in
 Eclipse


Zum Katalog: Einstieg in Java






 Einstieg in
 Java


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2011
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de