Java NIO - kanał plików
Opis
Jak już wspomniano, wprowadzono implementację kanału Java NIO w FileChannel w celu uzyskania dostępu do właściwości metadanych pliku, w tym tworzenia, modyfikacji, rozmiaru itp. Wraz z tym kanałami plików są wielowątkowe, co ponownie sprawia, że Java NIO jest bardziej wydajna niż Java IO.
Ogólnie możemy powiedzieć, że FileChannel jest kanałem podłączonym do pliku, przez który można odczytywać dane z pliku i zapisywać dane do pliku Inną ważną cechą FileChannel jest to, że nie można go ustawić w tryb nieblokujący i zawsze działa w trybie blokowania.
Nie możemy pobrać obiektu kanału plików bezpośrednio, obiekt kanału pliku jest uzyskiwany albo przez -
getChannel() - metoda na dowolnym FileInputStream, FileOutputStream lub RandomAccessFile.
open() - metoda kanału plików, która domyślnie otwiera kanał.
Typ obiektu kanału File zależy od typu klasy wywołanej podczas tworzenia obiektu, tj. Jeśli obiekt jest tworzony przez wywołanie metody getchannel z FileInputStream, wówczas kanał File jest otwierany do odczytu i zgłasza NonWritableChannelException w przypadku próby zapisu do niego.
Przykład
Poniższy przykład ilustruje sposób odczytywania i zapisywania danych z Java NIO FileChannel.
Poniższy przykład odczytuje z pliku tekstowego z C:/Test/temp.txt i drukuje zawartość na konsoli.
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();
}
}
Wynik
Hello World! Welcome to TutorialsPoint