使用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 WriteFileextends Thread {

 

//声明三个本地变量

File file;

int block;

int L=100;

 

/**

*如:将一个文件均匀划分成 5个区域,每一个区域都是一个块 block

*每个block的长度设为100字节

*构造方法中传入的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

publicvoid run() {

 

try {

 

//创建一个 RandomAccessFile 随机读写文件,并指定操作的文件对象和操作模式

//操作模式有4种:(一般情况下都使用 rw)

//(1)r只读

//(2)rw可读可写

//(3)rws可读可写,还要求对"文件的内容"或"元数据"的每个更新都同步写入到基础存储设备

//(4)rwd可读可写,还要求对"文件的内容"的每个更新都同步写入到基础存储设备

//有异常抛出,需要用 try catch 捕获

RandomAccessFile raf=new RandomAccessFile(file,"rw");

 

//通过随机读写文件,可以读取到或写入到当前文件的任何一个位置

/*如:一个文件对象,有头和尾,中间是文件内容

*

*如果想从(1)处写入文件数据,可以将 RandomAccessFile 的指针移动到(1)处,

*直接开始写入,以后的数据依次从(1)处向后写入

*

*如果想从(2)处写入3个加号,同理,3个加号就出现在(2)

*

*如果想从某个位置读取数据,同样要移动文件的指针到该位置,

*然后开始读取相应数量的数据

*

*      (1)           (2)

*       |***          |+++

* |------***-----------+++--------------------|

*文件头                                                                              文件尾

*/

 

//调用 RandomAccessFile seek()方法设定文件的指针

//通过文件自身的指针,设定读取或写入的偏移量,

//然后指针自动向后偏移。

//对于每一个文件,根据传入的block值来确定读写的位置

//block是从1开始的,但文件的指针是从0开始的

//使用(block-1)*L

//这样就将文件的指针指定到当前线程所负责的区域的头部

raf.seek((block-1)*L);

 

//调用 writeBytes() 方法写入文件:传入字符串,会自动

//将字符串转换成字节写入到文件当中

//这里的 block 虽然是整型,但会自动转换为String

raf.writeBytes("This is block "+block);

 

//再输出20个短横

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 staticvoid 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");

//这里要读取第5个区块,即指针从400开始

raf.seek(400);

//调用 read()方法时要传入一个字节型的数组,并指定读取的长度

byte input[]=newbyte[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】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值