Java NIO - Dateikanal
Beschreibung
Wie bereits erwähnt, wird die FileChannel-Implementierung des Java NIO-Kanals eingeführt, um auf die Metadateneigenschaften der Datei zuzugreifen, einschließlich Erstellung, Änderung, Größe usw. Außerdem sind die Dateikanäle multithreaded, was Java NIO wiederum effizienter macht als Java IO.
Im Allgemeinen können wir sagen, dass FileChannel ein Kanal ist, der mit einer Datei verbunden ist, über die Sie Daten aus einer Datei lesen und in eine Datei schreiben können. Ein weiteres wichtiges Merkmal von FileChannel ist, dass es nicht in den nicht blockierenden Modus versetzt werden kann und läuft immer im Blockiermodus.
Wir können das Dateikanalobjekt nicht direkt abrufen. Das Objekt des Dateikanals wird entweder von - erhalten
getChannel() - Methode für FileInputStream, FileOutputStream oder RandomAccessFile.
open() - Methode des Dateikanals, die den Kanal standardmäßig öffnet.
Der Objekttyp des Dateikanals hängt vom Typ der Klasse ab, die bei der Objekterstellung aufgerufen wird. Wenn also ein Objekt durch Aufrufen der getchannel-Methode von FileInputStream erstellt wird, wird der Dateikanal zum Lesen geöffnet und löst NonWritableChannelException aus, falls versucht wird, darauf zu schreiben.
Beispiel
Das folgende Beispiel zeigt das Lesen und Schreiben von Daten aus Java NIO FileChannel.
Das folgende Beispiel liest aus einer Textdatei aus C:/Test/temp.txt und druckt den Inhalt auf die Konsole.
temp.txt
Hello World!
FileChannelDemo.java
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.HashSet;
import java.util.Set;
public class FileChannelDemo {
public static void main(String args[]) throws IOException {
//append the content to existing file
writeFileChannel(ByteBuffer.wrap("Welcome to TutorialsPoint".getBytes()));
//read the file
readFileChannel();
}
public static void readFileChannel() throws IOException {
RandomAccessFile randomAccessFile = new RandomAccessFile("C:/Test/temp.txt",
"rw");
FileChannel fileChannel = randomAccessFile.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(512);
Charset charset = Charset.forName("US-ASCII");
while (fileChannel.read(byteBuffer) > 0) {
byteBuffer.rewind();
System.out.print(charset.decode(byteBuffer));
byteBuffer.flip();
}
fileChannel.close();
randomAccessFile.close();
}
public static void writeFileChannel(ByteBuffer byteBuffer)throws IOException {
Set<StandardOpenOption> options = new HashSet<>();
options.add(StandardOpenOption.CREATE);
options.add(StandardOpenOption.APPEND);
Path path = Paths.get("C:/Test/temp.txt");
FileChannel fileChannel = FileChannel.open(path, options);
fileChannel.write(byteBuffer);
fileChannel.close();
}
}
Ausgabe
Hello World! Welcome to TutorialsPoint