超硬核详细学习系列第十二天——深入浅出IO的知识点,值得你学

“这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助!

愿你在未来的日子,保持热爱,奔赴山海!

I/O高级流

昨天我们对高级流中的操作基本数据的流学习,而在IO流的整个大体系中,他还有一些高级流等待着我们来解锁。

所以话不多说,今天我们先来学习其中一种高级流——随机访问流。

随机访问流

我们之前的学习流的时候,无论在读取文件还是写入文件的时候,都是从文件开头的地方开始,不能指定位置开始读取。现在我们学习的RandomAccessFile就可以解决这个问题。

RandomAccessFileIO流体系中比较特殊的流。即可以读取文件内容,也可以向文件中写入内容,和其他输入输出流不同的是可以直接跳到文件的任意位置来读写数据。所以如果我们希望只访问文件的部分内容,那就可以使用RandomAccessFile类。

因为RandomAccessFile类包含了一个记录指针,用以标识当前读写处的位置,当程序新创建一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处),当读/写了n个字节后,文件记录指针将会向后移动n个字节。除此之外,RandomAccessFile可以自由的移动记录指针,即可以向前移动,也可以向后移动。RandomAccessFile包含了以下两个方法来操作文件的记录指针.

  • long getFilePointer(); 返回文件记录指针的当前位置
  • void seek(long pos); 将文件记录指针定位到pos位置

RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStreamOutputStream的功能。支持对文件的随机访问读取和写入。

构造方法

  • public RandomAccessFile(File file, String mode):创建随机流,传入的参数是File参数。
  • public RandomAccessFile(String name, String mode):创建随机流,传入String参数来指定文件名。

两个构造方法都需要传入一个指定的mode参数,该参数指定RandomAccessFile的访问模式。

分别解释下:

  • r:以只读方式来打开指定文件夹。
  • rw: 以读,写方式打开指定文件。
  • rws:需要更新要写入的文件的内容及其元数据。

  • rwd:只需要更新要写入存储的文件内容。

    这其中比较常用的就是rw模式,既可以写数据,也可以读取数据 。

测试读写

读写方法基本和之前的字节输入输出流一样,我们主要测试下指定位置读取的方法吧:

public class RandomAccessFileDemo {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile("e:\demo\raf.txt", "r");
        //写入文件
        write();//helloworld
​
        //第一次读取
        int ch = raf.read();
        System.out.println((char) ch);
        // 该文件指针可以通过 getFilePointer方法读取
        System.out.println("当前文件的指针位置是:" + raf.getFilePointer());
​
        //第二次读取
        ch = raf.read();
        System.out.println((char) ch);
        // 该文件指针可以通过 getFilePointer方法读取
        System.out.println("当前文件的指针位置是:" + raf.getFilePointer());
​
​
        //那我想直接读取最后的d怎么办
        //通过 seek 方法设置。
        raf.seek(9);
        ch = raf.read();
        System.out.println((char) ch);
        // 该文件指针可以通过 getFilePointer方法读取
        System.out.println("当前文件的指针位置是:" + raf.getFilePointer());
​
        raf.close();
    }
​
​
    private static void write() throws IOException {
        // 创建随机访问流对象
        RandomAccessFile raf = new RandomAccessFile("e:\demo\raf.txt", "rw");
​
       raf.write("helloworld".getBytes());
​
       raf.close();
    }
}
​
程序执行结果:
h
当前文件的指针位置是:1
e
当前文件的指针位置是:2
d
当前文件的指针位置是:10
复制代码

存储到文件的信息:

总结

相信各位看官都对IO流中高级流中的随机访问流类有了一定了解,期待等待下一章的高级流——属性集教学吧!

当然还有很多流等着下次一起看吧!欢迎期待下一章的到来!

学到这里,今天的世界打烊了,晚安!虽然这篇文章完结了,但是我还在,永不完结。我会努力保持写文章。来日方长,何惧车遥马慢!

感谢各位看到这里!愿你韶华不负,青春无悔!

注: 如果文章有任何错误和建议,请各位大佬尽情留言!如果这篇文章对你也有所帮助,希望可爱亲切的您给个三连关注下,非常感谢啦!