zoukankan      html  css  js  c++  java
  • 使用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的长度设为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

    public void 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 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");

    //这里要读取第5个区块,即指针从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】

  • 相关阅读:
    swift学习二:基本的语法
    Unity3D游戏开发之开发游戏带来的问题
    Linux makefile 教程 很具体,且易懂
    匈牙利算法
    ExtJs自学教程(1):一切从API開始
    rman
    微软历史最高市值是多少?
    安装Oracle JDK 7.0与8.0 for Mac OS X后Eclipse启动报错的解决之道
    linux-sfdisk 使用方法
    未将对象引用设置到对象的实例--可能出现的问题总结
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6625311.html
Copyright © 2011-2022 走看看