------------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读写数据的更多相关文章

  1. IO流18 --- RandomAccessFile实现数据的读写操作 --- 技术搬运工(尚硅谷)

    RandomAccessFile实例化时,需要设置读写模式 示例:复制文件 @Test public void test16() throws IOException { RandomAccessFi ...

  2. java 输入输出IO流 RandomAccessFile文件的任意文件指针位置地方来读写数据

    RandomAccessFile的介绍: RandomAccessFile是Java输入输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出 ...

  3. HDFS读写数据块--${dfs.data.dir}选择策略

    最近工作需要,看了HDFS读写数据块这部分.不过可能跟网上大部分帖子不一样,本文主要写了${dfs.data.dir}的选择策略,也就是block在DataNode上的放置策略.我主要是从我们工作需要 ...

  4. win10 svchost.exe (LocalSystemNetworkRestricted)大量读写数据

    博主的笔记本联想Y50开机完毕后会不停滴读硬盘/写硬盘,导致开机后一段时间内无法正常使用电脑(硬盘读写高峰期).打开资源监视器发现是"svchost.exe (LocalSystemNetw ...

  5. inputstream和outputstream读写数据模板代码

    //读写数据模板代码 byte buffer[] = new byte[1024]; int len=0; while((len=in.read(buffer))>0){ out.write(b ...

  6. 百度地图LBS云平台读写数据操作类

    最近写了个叫<行踪记录仪>的手机软件,用了百度云来记录每个用户的最近位置,以便各用户能在地图上找到附近的人,为此写了个类来读写数据,大致如下: import java.util.Array ...

  7. 01. SQL Server 如何读写数据

    原文:01. SQL Server 如何读写数据 一. 数据读写流程简要SQL Server作为一个关系型数据库,自然也维持了事务的ACID特性,数据库的读写冲突由事务隔离级别控制.无论有没有显示开启 ...

  8. SQL Server 如何读写数据

    01. SQL Server 如何读写数据   一. 数据读写流程简要SQL Server作为一个关系型数据库,自然也维持了事务的ACID特性,数据库的读写冲突由事务隔离级别控制.无论有没有显示开启事 ...

  9. STM32F10X SPI操作flash MX25L64读写数据(转)

    源:STM32F10X SPI操作flash MX25L64读写数据 前一段时间在弄SPI,之前没接触过嵌入式外围应用,就是单片机也只接触过串口通信,且也是在学校的时候了.从离开手机硬件测试岗位后,自 ...

随机推荐

  1. 修改maven仓库位置

    在eclipse中安装好maven2的插件后: 第一步: 默认会放在~/.m2/repository目录下 (“~”代表用户的目录,比如windows7下一般都是C:\Users\zz\.m2\rep ...

  2. 使用tor实现匿名扫描/SSH登录

    你要做坏事时,最先应该想到匿名.扫描网站/主机,或利用漏洞:甚至在大天朝发帖都有风险,为了防止半夜鬼敲门,我们可以使用tor实现匿名. 如果你不知道tor是什么,看:https://zh.wikipe ...

  3. Hoeffding inequality

    Hoeffding公式为 \epsilon]\leq{2e^{-2\epsilon^2N}}"> 如果把Training error和Test error分别看成和的话,Hoeffdi ...

  4. bzoj 2131 免费的馅饼

    Written with StackEdit. Description Input 第一行是用空格隔开的二个正整数,分别给出了舞台的宽度\(W\)(\(1\)到\(10^8\)之间)和馅饼的个数\(n ...

  5. vc++ windows 开始菜单添加快捷方式

    开始菜单创建快捷方式 在windows软件开发中,软件安装过程中总是需要在开始菜单创建快捷方式,下面介绍一种开始菜单创建快捷方式的方法,具体代码如下: /* * 创建快捷方式 * szExePath[ ...

  6. 配置文件Struts.xml 中type属性 redirect,redirectAction,chain的区别

    1.redirect:action处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也全部丢失.  2.redirectAction:action处理完后重定向到一 ...

  7. 基于jwt和角色的访问控制方案-从0开始

    上一版本的构想:http://www.cnblogs.com/vhyc/p/7953779.html 缺陷:dubbo的filter里面不能注入mapper的bean,而且每次查询都访问数据库速度影响 ...

  8. jquery调用spring mvc接口返回字符串匹配

    背景:有个增删改页面,用jquery祭出ajax异步调用接口,spring mvc响应对象是个json字符串,jquery根据响应结果判断,如果删除成功给出提示.那么问题来了,接口里响应的字符串怎么匹 ...

  9. Java 引用类型变量的声明和使用

    引用类型变量的声明和使用 (1)把类名当作是一种类型来声明变量,这种变量叫引用类型变量.如:People people; (2)引用类型变量保存对象的“引用”,即对象的地址. (3)对象的创建 new ...

  10. shell查看执行过程及时间变量

    sh -xv test.sh    #加参数xv查看shell执行过程. Shell 调用系统时间变量 获取今天时期:`date +%Y%m%d` 或 `date +%F` 或date +%Y-%m- ...