Heim  >  Artikel  >  Java  >  FileChannel von JAVA-6NIO

FileChannel von JAVA-6NIO

巴扎黑
巴扎黑Original
2017-06-26 09:57:401291Durchsuche

FileChannel in Java NIO ist ein Kanal, der mit einer Datei verbunden ist. Dateien können über Dateikanäle gelesen und geschrieben werden.

FileChannel kann nicht auf den nicht blockierenden Modus eingestellt werden, es läuft immer im blockierenden Modus.

FileChannel öffnen

Bevor Sie FileChannel verwenden, müssen Sie es öffnen. Wir können einen FileChannel jedoch nicht direkt öffnen. Wir müssen eine FileChannel-Instanz mithilfe eines InputStream, OutputStream oder RandomAccessFile erhalten.

Daten aus FileChannel lesen

Rufen Sie eine der mehreren read()-Methoden auf, um Daten aus FileChannel zu lesen.

Zuerst weisen Sie einen Puffer zu. Von FileChannel gelesene Daten werden in Buffer eingelesen.

Dann rufen Sie die Methode FileChannel.read() auf. Diese Methode liest Daten von FileChannel in Buffer. Der von der Methode read() zurückgegebene int-Wert gibt an, wie viele Bytes in den Puffer eingelesen wurden. Wenn -1 zurückgegeben wird, bedeutet dies, dass das Ende der Datei erreicht wurde.

Daten in FileChannel schreiben

Verwenden Sie die Methode FileChannel.write(), um Daten in FileChannel zu schreiben.

Beachten Sie, dass FileChannel.write() in der while-Schleife aufgerufen wird. Da es keine Garantie dafür gibt, wie viele Bytes die write()-Methode gleichzeitig in den FileChannel schreiben kann, muss die write()-Methode wiederholt aufgerufen werden, bis im Puffer keine Bytes mehr vorhanden sind, die nicht in den Kanal geschrieben wurden.

FileChannel schließen

FileChannel muss nach der Verwendung geschlossen werden. Zum Beispiel:

Positionsmethode von FileChannel

Manchmal kann es erforderlich sein, Daten an einer bestimmten Position von FileChannel zu lesen/schreiben. Sie können die aktuelle Position von FileChannel abrufen, indem Sie die Methode position() aufrufen.

Sie können die aktuelle Position von FileChannel auch festlegen, indem Sie die Methode position(long pos) aufrufen.

Wenn Sie die Position nach dem Ende der Datei festlegen und dann versuchen, Daten aus dem Dateikanal zu lesen, gibt die Lesemethode -1 zurück – das Ende der Datei.

Wenn Sie die Position nach dem Ende der Datei festlegen und dann Daten in den Kanal schreiben, wird die Datei auf die aktuelle Position erweitert und die Daten werden geschrieben. Dies kann zu „Dateilöchern“ führen, d. h. Lücken zwischen den in den physischen Dateien auf der Festplatte geschriebenen Daten.

Größenmethode von FileChannel

Die size()-Methode einer FileChannel-Instanz gibt die Größe der mit der Instanz verknüpften Datei zurück. Beispiel:

Die Truncate-Methode von FileChannel

kann die Methode FileChannel.truncate() verwenden, um eine Datei abzufangen. Beim Abfangen einer Datei wird der Teil nach der angegebenen Länge der Datei gelöscht. Zum Beispiel:

Dieses Beispiel fängt die ersten 1024 Bytes der Datei ab.

Force-Methode von FileChannel

Die Methode FileChannel.force() erzwingt, dass die Daten im Kanal, die noch nicht auf die Festplatte geschrieben wurden, auf die Festplatte geschrieben werden. Aus Leistungsgründen speichert das Betriebssystem Daten im Speicher zwischen, daher gibt es keine Garantie dafür, dass in FileChannel geschriebene Daten sofort auf die Festplatte geschrieben werden. Um dies sicherzustellen, muss die Methode force() aufgerufen werden.

Die Methode force() verfügt über einen booleschen Parameter, der angibt, ob gleichzeitig Dateimetadaten (Berechtigungsinformationen usw.) auf die Festplatte geschrieben werden sollen.

/** * file channel     */@Testpublic void text1() throws IOException {//从buffer读RandomAccessFile raf = new RandomAccessFile(new File("./test.txt"),"rw");
        FileChannel channel = raf.getChannel();             //获取通道channel.position(channel.size());                   //设置文件末尾位置,作为写入初始位置;不带参获取指针位置ByteBuffer byteBuffer = ByteBuffer.allocate(1024);  //缓冲区byteBuffer.put("456".getBytes());
        byteBuffer.flip();                                  //反转while (byteBuffer.hasRemaining()) {                 //判断            channel.write(byteBuffer);
        }
        channel.truncate(2);                                //截取文件channel.force(true);                      //强行写        raf.close();//向buffer写raf = new RandomAccessFile(new File("./test.txt"),"rw");
        channel = raf.getChannel();
        byteBuffer = ByteBuffer.allocate(1024);int read;while ((read = channel.read(byteBuffer))!=-1) {
            byteBuffer.flip();                                  //反转while (byteBuffer.hasRemaining()) {                 //判断System.err.print((char)byteBuffer.get());       //输出            }
            byteBuffer.clear();                                 //清除        }
    }

Das obige ist der detaillierte Inhalt vonFileChannel von JAVA-6NIO. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn