欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中文件NIO操作-读文件

程序员文章站 2022-04-24 11:06:29
...

Java NIO要点
1.通道 (Channel)
2.缓冲区(Buffer)
参考 nio的实现原理

实现
Java用NIO读文件

        String path = "G:\\MyDesktop\\Example\\test.txt";
        File file = new File(path);
        FileInputStream fis = new FileInputStream(file);
        
        // 创建一个通道
        FileChannel fc = fis.getChannel();
        
        // 创建缓冲区,分配大小1024
        ByteBuffer buffer = ByteBuffer.allocate(1024);

		// 从通道读入缓冲区
        fc.read(buffer);
        buffer.flip();

		// 打印缓冲区的内容
        while(buffer.hasRemaining()) {
            System.out.print((char)buffer.get());
        }

思考
以上代码实现中,缓冲区分配的大小是1024,而通道的大小是与文件大小一样的。即:

file.length() == fc.size() // true

如果要读的文件[fc.size()]大于缓冲区的1024,通道里面多出来的数据要怎么读?

通道的position()
通道的position与缓冲区的作用一样

/*
 * 返回当前读取的位置
 */
public abstract long position() throws IOException;

/*
 * 改变读取位置
 */
public abstract FileChannel position(long newPosition) throws IOException;

简单实现循环读取通道中的数据

        String path = "G:\\MyDesktop\\Example\\test.txt";
        File file = new File(path);
        FileInputStream fis = new FileInputStream(file);
        
        // 创建一个通道
        FileChannel fc = fis.getChannel();
        
        // 创建缓冲区,分配大小1024
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        
        StringBuilder builder = new StringBuilder();
        // 循环条件 position < size 
        while (fc.position() < fc.size()) {
        	// 每次循环先清空缓冲区
            buffer.clear();
            // 根据position读取通道数据到缓冲区
            int read = fc.read(buffer, fc.position());
            // 更新通道的position
            fc.position(fc.position() + read);
            // 打印缓冲区的内容
            buffer.flip();
            while(buffer.hasRemaining()) {
               // builder.append((char)buffer.get());
                System.out.print((char)buffer.get());
            }
        }
        // String string = builder.toString();
        // System.out.println(string);
相关标签: Java java nio