使用RandomAccessFile读写数据
------------siwuxie095
工程名:TestRandomAccessFile
包名:com.siwuxie095.file
类名:MultiWriteFile.java(主类)、WriteFile.java
工程结构目录如下:
WriteFile.java:
package com.siwuxie095.file; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; //WriteFile 继承自 Thread,作为一个线程 //RandomAccessFile: //在写入时,可以为每一个线程指定一个固定的写入区域, //这可以用于多线程的下载,以及多线程的文件传输 //在读取时,也可以指定RandomAccessFile来读取文件中的特定内容 public class WriteFile extends Thread { //声明三个本地变量 File file; int block; int L=100; /** * 如:将一个文件均匀划分成 5 个区域,每一个区域都是一个块 block, 字节 * 构造方法中传入的block数值是几,就从哪个块开始读写 * * 1 2 3 4 5 * |---------|---------|---------|---------|---------| * 0xL 1xL 2xL * * @param f * @param b */ //先为线程创建一个构造方法,传入两个参数 //一个是要写的文件,另一个是当前线程所负责的写入文件的区块 public WriteFile(File f,int b) { this.file=f; this.block=b; } //在当前类中覆盖 Thread 的 run() 方法,并重写 @Override public void run() { try { //创建一个 RandomAccessFile 随机读写文件,并指定操作的文件对象和操作模式 种:(一般情况下都使用 rw) //(1)r 只读 //(2)rw 可读可写 //(3)rws 可读可写,还要求对"文件的内容"或"元数据"的每个更新都同步写入到基础存储设备 //(4)rwd 可读可写,还要求对"文件的内容"的每个更新都同步写入到基础存储设备 //有异常抛出,需要用 try catch 捕获 RandomAccessFile raf=new RandomAccessFile(file, "rw"); //通过随机读写文件,可以读取到或写入到当前文件的任何一个位置 /*如:一个文件对象,有头和尾,中间是文件内容 * * 如果想从(1)处写入文件数据,可以将 RandomAccessFile 的指针移动到(1)处, * 直接开始写入,以后的数据依次从(1)处向后写入 * 个加号,同理,3个加号就出现在(2)处 * * 如果想从某个位置读取数据,同样要移动文件的指针到该位置, * 然后开始读取相应数量的数据 * * (1) (2) * |*** |+++ * |------***-----------+++--------------------| * 文件头 文件尾 */ //调用 RandomAccessFile 的 seek()方法设定文件的指针 //通过文件自身的指针,设定读取或写入的偏移量, //然后指针自动向后偏移。 //对于每一个文件,根据传入的block值来确定读写的位置 开始的,但文件的指针是从0开始的 //使用(block-1)*L //这样就将文件的指针指定到当前线程所负责的区域的头部 raf.seek((block-1)*L); //调用 writeBytes() 方法写入文件:传入字符串,会自动 //将字符串转换成字节写入到文件当中 //这里的 block 虽然是整型,但会自动转换为String raf.writeBytes("This is block "+block); 个短横 for (int i = 0; i < 20; i++) { raf.writeBytes("-"); } //关闭RandomAccessFile raf.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } |
MultiWriteFile.java:
package com.siwuxie095.file; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; public class MultiWriteFile { //先在主类中创建一个静态文件对象,使用相对路径 static File file=new File("test.txt"); public static void main(String[] args) { //判断文件是否存在 if (file.exists()) { //如果存在就先将文件删除掉,保证每次写入,当前文件都是一个新文件 //不会被之前的文件版本所影响 //这里不必担心当前的线程无法向该文件写入数据 //因为在 RandomAccessFile 写入文件时,文件不存在,它会自动把文件创建出来 file.delete(); } //写入文件: //创建WriteFile,指定不同线程写入不同的区块,并开启线程 //写入文件的顺序与线程的先后创建顺序无关,严格按照指定的区块去写 new WriteFile(file,5).start(); new WriteFile(file,3).start(); new WriteFile(file,1).start(); new WriteFile(file,4).start(); new WriteFile(file,2).start(); try { //读取文件: RandomAccessFile raf=new RandomAccessFile(file, "r"); 个区块,即指针从400开始 raf.seek(400); //调用 read()方法时要传入一个字节型的数组,并指定读取的长度 byte input[]=new byte[20]; raf.read(input); //创建String,传入字节型数组input String inputString=new String(input); System.out.println(inputString); raf.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } |
运行一览:
读取第 5 个区块的 20 个字节:
test.txt 的内容:
test.txt 共 435 字节:4x100+35
(最后35个字节即 This is block 5--------------------)
运行后,工程结构目录一览:
【made by siwuxie095】
使用RandomAccessFile读写数据的更多相关文章
- IO流18 --- RandomAccessFile实现数据的读写操作 --- 技术搬运工(尚硅谷)
RandomAccessFile实例化时,需要设置读写模式 示例:复制文件 @Test public void test16() throws IOException { RandomAccessFi ...
- java 输入输出IO流 RandomAccessFile文件的任意文件指针位置地方来读写数据
RandomAccessFile的介绍: RandomAccessFile是Java输入输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出 ...
- HDFS读写数据块--${dfs.data.dir}选择策略
最近工作需要,看了HDFS读写数据块这部分.不过可能跟网上大部分帖子不一样,本文主要写了${dfs.data.dir}的选择策略,也就是block在DataNode上的放置策略.我主要是从我们工作需要 ...
- win10 svchost.exe (LocalSystemNetworkRestricted)大量读写数据
博主的笔记本联想Y50开机完毕后会不停滴读硬盘/写硬盘,导致开机后一段时间内无法正常使用电脑(硬盘读写高峰期).打开资源监视器发现是"svchost.exe (LocalSystemNetw ...
- inputstream和outputstream读写数据模板代码
//读写数据模板代码 byte buffer[] = new byte[1024]; int len=0; while((len=in.read(buffer))>0){ out.write(b ...
- 百度地图LBS云平台读写数据操作类
最近写了个叫<行踪记录仪>的手机软件,用了百度云来记录每个用户的最近位置,以便各用户能在地图上找到附近的人,为此写了个类来读写数据,大致如下: import java.util.Array ...
- 01. SQL Server 如何读写数据
原文:01. SQL Server 如何读写数据 一. 数据读写流程简要SQL Server作为一个关系型数据库,自然也维持了事务的ACID特性,数据库的读写冲突由事务隔离级别控制.无论有没有显示开启 ...
- SQL Server 如何读写数据
01. SQL Server 如何读写数据 一. 数据读写流程简要SQL Server作为一个关系型数据库,自然也维持了事务的ACID特性,数据库的读写冲突由事务隔离级别控制.无论有没有显示开启事 ...
- STM32F10X SPI操作flash MX25L64读写数据(转)
源:STM32F10X SPI操作flash MX25L64读写数据 前一段时间在弄SPI,之前没接触过嵌入式外围应用,就是单片机也只接触过串口通信,且也是在学校的时候了.从离开手机硬件测试岗位后,自 ...
随机推荐
- 前端之JavaScript 04 事件 (未全)
一.事件类型 常见的主要事件类型介绍如下: onfocus 元素获得焦点. 练习:输入框 onblur 元素失去焦点. 应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行 ...
- Centos 6.3 Realtek Audio Driver Compile
/**************************************************************************** * Centos 6.3 Realtek A ...
- fedora to ubunto
Fedora to Ubuntu16.04 一.删除Fedora 由于双系统启动的时候是由linux系统做引导启动,所以在Windows下直接格式化Linux分区将导致无法启动Windows.解决办法 ...
- Java基础总结大全
一.基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jvm不是跨平台的. J ...
- 【转】C# Socket编程(3)编码和解码
[转自:https://www.cnblogs.com/IPrograming/archive/2012/10/13/CSharp_Socket_3.html] 在网络通信中,很多情况下:比如说QQ聊 ...
- LOJ#2351. 「JOI 2018 Final」毒蛇越狱
LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...
- hadoop复合键排序使用方法
在hadoop中处理复杂业务时,需要用到复合键,复合不同于单纯的继承Writable接口,而是继承了 WritableComparable<T>接口,而实际上,WritableCompar ...
- 限制UITextfield的输入字符为50个字符
1.实现UITextfieldDelegate 2.在UITextfield的代理方法中判断添加字符还是删除字符,从而做不同的操作 #pragma mark-UITextfield的代理方法 - (B ...
- Python学习系列(三)(字符串)
Python学习系列(三)(字符串) Python学习系列(一)(基础入门) Python学习系列(二)(基础知识) 一个月没有更新博客了,最近工作上有点小忙,实在是没有坚持住,丢久又有感觉写的必要了 ...
- Oracle查询脚本优化
发现生产环境的Oracle数据库cpu使用率上升超过70%,其中一条查询语句达到每秒调用40多次.现在我们来观摩下该语句: select t.id,t.level,t.policy, t.type,t ...