读取超大文件的两个类BufferedReader和MappedByteBuffer

BufferedRead提供了一套缓冲机制,读取文件时先在内存中建立一块缓冲区,然后读取文件填满缓冲区,

然后在缓冲区中对文件进行实际的操作,当缓冲区读完后调用read方法继续填充缓冲区;

MappedByteBuffer将文件映射到虚拟内存中,如果文件比较大可以分段映射,分段映射需要指定文件的具体映射部分;在对内存中的文件进行操作,大大提高效率;MappedByteBuffer map(int mode,long position,long size); 可以把文件的从position开始的size大小的区域映射为内存映像文件,mode指出了可访问该内存映像文件的方式:READ_ONLY(只读),READ_WRITE(读写),PRIVATE(专用)

a. READ_ONLY,(只读):读取缓冲区中的数据

b. READ_WRITE(读/写): 对得到的缓冲区的更改最终将传播到文件;该更改对映射到同一文件的其他程序不一定是可见的。 (MapMode.READ_WRITE)

c. PRIVATE(专用):对得到的缓冲区的更改不会传播到文件,并且该更改对映射到同一文件的其他程序也不是可见的;相反,会创建缓冲区已修改部分的专用副本。 (MapMode.PRIVATE)

具体使用可以参考API哦。。。。

 

 

在Java中,如果你需要两个批处理任务(Batch Operations)同时对同一个文件进行操作,通常会遇到并发访问的问题。为了安全地处理这种情况,你需要考虑以下几个方面: 1. 使用锁(Synchronized)或并发控制:可以使用synchronized关键字确保在同一时间只有一个线程可以修改文件。例如,你可以将整个文件读写操作封装在一个同步块或方法中。 ```java synchronized (File lockFile) { // 文件操作... } ``` 2. 使用文件通道(FileChannel)缓冲区(BufferedWriter/BufferedReader):`FileChannel`提供了一种原子性的IO操作,可以在多线程环境中更安全地读写文件。配合`BufferedWriter``BufferedReader`可以提高效率。 ```java FileChannel channel = FileChannel.open(file.toPath(), StandardOpenOption.READ, StandardOpenOption.WRITE); try { MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, file.length()); // 在缓冲区上进行并行操作 } finally { channel.close(); } ``` 3. 切换到不可变模式:如果文件内容不是经常变化,可以考虑将其转换为只读模式(ReadOnly),避免直接修改,而是创建新的版本。 4. 使用并发集合(如CopyOnWriteArrayList):对于读取大量数据并做修改的情况,可以利用`CopyOnWriteArrayList`的并发特性,它在读的时候不会阻塞其他线程的写入。 尽管有这些策略,还是建议根据实际场景分析,因为并发操作可能会带来性能开销,尤其是在磁盘I/O密集型的任务中。此外,要考虑错误处理恢复机制,以防意外情况发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值