Galileo Computing < openbook >Galileo 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:
- openbook, ca. 24,5 MB
- 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
Pfeil15 Einführung in Dateien und Datenströme
Pfeil15.1 Datei und Verzeichnis
Pfeil15.1.1 Dateien und Verzeichnisse mit der Klasse File
Pfeil15.1.2 Verzeichnis oder Datei? Existiert es?
Pfeil15.1.3 Verzeichnis- und Dateieigenschaften/-attribute
Pfeil15.1.4 Umbenennen und Verzeichnisse anlegen
Pfeil15.1.5 Verzeichnisse auflisten und Dateien filtern
Pfeil15.1.6 Dateien und Verzeichnisse löschen
Pfeil15.2 Dateien mit wahlfreiem Zugriff
Pfeil15.2.1 Ein RandomAccessFile zum Lesen und Schreiben öffnen
Pfeil15.2.2 Aus dem RandomAccessFile lesen
Pfeil15.2.3 Schreiben mit RandomAccessFile
Pfeil15.2.4 Die Länge des RandomAccessFile
Pfeil15.2.5 Hin und her in der Datei
Pfeil15.3 Dateisysteme unter NIO.2
Pfeil15.3.1 FileSystem und Path
Pfeil15.3.2 Die Utility-Klasse Files
Pfeil15.4 Stream-Klassen und Reader/Writer am Beispiel von Dateien
Pfeil15.4.1 Mit dem FileWriter Texte in Dateien schreiben
Pfeil15.4.2 Zeichen mit der Klasse FileReader lesen
Pfeil15.4.3 Kopieren mit FileOutputStream und FileInputStream
Pfeil15.4.4 Datenströme über Files mit NIO.2 beziehen
Pfeil15.5 Basisklassen für die Ein-/Ausgabe
Pfeil15.5.1 Die abstrakten Basisklassen
Pfeil15.5.2 Übersicht über Ein-/Ausgabeklassen
Pfeil15.5.3 Die abstrakte Basisklasse OutputStream
Pfeil15.5.4 Die Schnittstellen Closeable, AutoCloseable und Flushable
Pfeil15.5.5 Die abstrakte Basisklasse InputStream
Pfeil15.5.6 Ressourcen aus dem Klassenpfad und aus Jar?Archiven laden
Pfeil15.5.7 Die abstrakte Basisklasse Writer
Pfeil15.5.8 Die abstrakte Basisklasse Reader
Pfeil15.6 Datenströme filtern und verketten
Pfeil15.6.1 Streams als Filter verketten (verschachteln)
Pfeil15.6.2 Gepufferte Ausgaben mit BufferedWriter und BufferedOutputStream
Pfeil15.6.3 Gepufferte Eingaben mit BufferedReader/BufferedInputStream
Pfeil15.7 Vermittler zwischen Byte-Streams und Unicode-Strömen
Pfeil15.7.1 Datenkonvertierung durch den OutputStreamWriter
Pfeil15.7.2 Automatische Konvertierungen mit dem InputStreamReader

Galileo 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.


Galileo 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


Galileo 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.







<< 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 7 – Mehr als eine Insel





 Java 7 –
 Mehr als eine Insel


Zum Katalog: Android 3






 Android 3


Zum Katalog: Android-Apps entwickeln






 Android-Apps
 entwickeln


Zum Katalog: NetBeans Platform 7






 NetBeans
 Platform 7


Zum Katalog: Einstieg in Eclipse 3.7






 Einstieg in
 Eclipse 3.7


Zum Katalog: Einstieg in Java






 Einstieg
 in Java


Zum Katalog: Einstieg in Java 7






 Einstieg in
 Java 7


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 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.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de