📅  最后修改于: 2020-11-14 10:11:04             🧑  作者: Mango
如前所述,引入了Java NIO通道的FileChannel实现来访问文件的元数据属性,包括创建,修改,大小等。此文件通道具有多线程功能,这又使Java NIO比Java IO更高效。
通常,我们可以说FileChannel是一个连接到文件的通道,您可以通过该通道读取文件中的数据并将数据写入文件中.FileChannel的另一个重要特征是无法将其设置为非阻塞模式并始终以阻止模式运行。
我们不能直接获取文件通道对象,文件通道的对象可以通过-获得
getChannel() -任何FileInputStream,FileOutputStream或RandomAccessFile上的方法。
open() -File通道的方法,默认情况下打开通道。
File通道的对象类型取决于从对象创建中调用的类的类型,即,如果通过调用FileInputStream的getchannel方法创建对象,则打开File通道进行读取,并在尝试写入时抛出NonWritableChannelException。
以下示例说明如何从Java NIO FileChannel读取和写入数据。
以下示例从C:/Test/temp.txt中读取文本文件,然后将内容打印到控制台。
Hello World!
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 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();
}
}
Hello World! Welcome to TutorialsPoint