RandomAccessFile应用

RandomAccessFile往磁盘上读数据和写数据

package cn.lf.day0831;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Scanner;

import org.junit.Test;

public class IODemo3 {

    @Test
    public void test() throws IOException{
        String dir1 = "./test"; //目录
        File dir2 = createFile(dir1, "1"); //创建目录

        String fileUrl = "./test/a.txt";
        File file = createFile(fileUrl, "2"); //创建文件

        //System.out.println("请输入你的内容:");
        //String str = new Scanner(System.in).next();
        //writeToRandomAccessFile(file, str); //写数据

        //读数据
        String string = readToRandomAccessFile(file);
        System.out.println(string);

    }

    /**
     * @param fileUrl:文件路径
     * @param model:1---目录,2---文件
     * @return
     * @throws IOException
     */
    //创建文件或者目录
    public File createFile(String fileUrl, String model) throws IOException{
        File file = new File(fileUrl);
        //获取文件绝对路径
        System.out.println(file.getAbsolutePath());

        //判断文件是否已经存在
        if (file.exists()) {
            return file;
        }

        if ("1".equals(model)) {  //创建目录
            /*
             * public boolean mkdirs()
             * 返回:
             *  当且仅当已创建目录以及所有必需的父目录时,返回 true;否则返回 false 
             * */
            file.mkdirs();
        }else if("2".equals(model)){ //创建文件
            /*
             * public boolean createNewFile()throws IOException
             * 返回:如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,
             * 则返回 false 
             * */
            file.createNewFile();  
        }
        //判断文件是否存在
        if (!file.exists()) {
            System.out.println("该目录或文件不存在!");
            return null;
        }
        return file;
    }
    /**
     * @param file:文件
     * @param content:内容
     * @throws IOException
     */
    //写文件
    public void writeToRandomAccessFile(File file, String content) throws IOException{
        if (file == null) {
            System.out.println("file为空!");
        }

        //public class RandomAccessFile 
        //extends Object
        //implements DataOutput, DataInput, Closeable
        //此类的实例支持对随机访问文件的读取和写入。
        //第一个参数file:指定文件
        //第二个参数String:指定读写模式,r:只读模式;rw:读写模式
        RandomAccessFile raf = new RandomAccessFile(file, "rw");

        //以字节数组的形式写文件
        //public byte[] getBytes()
            //我的理解:把String转为字符数组
            //官方理解:使用平台的默认字符集将此 String 编码为 byte 序列,
            //并将结果存储到一个新的 byte数组中。
            //eg:String str = null
            //byte[] b = str.getBytes();
        byte[] b = content.getBytes();

        //获取文件的长度
        long size = file.length();

        //移动指针,使再次写入的内容追加
        /*
         * public void seek(long pos) throws IOException
         *设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
         * */
        raf.seek(size);
        //public void write(byte[] b) throws IOException
        raf.write(b); //写文件
        raf.close(); //关闭流
    }

    /**
     * @param file
     * @return
     * @throws IOException
     */
    //读数据
    public String readToRandomAccessFile(File file) throws IOException{
        String str = null;

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

        int b = -1;
        byte[] bs = new byte[1024];
        int length = (int)file.length();  

        // public int read(byte[] b,int off,int len)throws IOException
        // 参数:
        // b - 读入数据的缓冲区。
        // off - 写入数据的数组 b 中的初始偏移量。
        // len - 读取的最多字节数。
        // 返回:
        // 读入缓冲区的总字节数,如果由于已到达文件的末尾而不再有数据,则返回 -1。 

        b=raf.read(bs,0,length);  
        //Arrays.toString(bs);

        // public String(byte[] bytes)
        //我的理解:将byte数组转成字符串
        // 官方解释:通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
        // 参数:
        // bytes - 要解码为字符的 byte
        str = new String(bs);
        return str;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值