java-RandomAccessFile

RandomAccessFile

InputStream/OutputStream
FileInputStream/FileOutputStream
BufferedInputStream/BufferedOutputStream
DataInputStream/DataOutputStream
PrintStream
ByteArrayInputStream/ByteArrayOutputStream
ObjectInputStream/ObjectOutputStream

Reader/Writer
InputStreamReader/OutputStreamWriter
FileReader/FileWiter
BufferedReader/BufferedWriter
PrintWriter

java.io.RandomAccessFile

  • 读写文件中的字节数据。(注:字符也都是字节值)
  • 用下标,读写文件中指定位置的字节值
  • 从磁盘读到内存是输入

创建对象:

//创建方式1 (读写)
1、RandomAccessFile raf=new RandomAccessFile(文件,“rw”);
//创建方式2 (只读)
2、1、RandomAccessFile raf=new RandomAccessFile(文件,“r”);

输出方法write:

  • 输出到文件

  • write(int b)
    输出int四个字节中的末尾字节,截取出末尾最后一个字节值(强转成byte类型,保存末尾最后一个字节),写到文件。
    【1】【2】【3】【4】

  • write(byte[] buf)
    输出数组中全部字节值。
  • write(byte[] buf, int from, int n)
    输出数组中从from开始的n个字节值
  • writeInt(int i)
    输出int类型的4个字节值
  • writeDouble(double d)
    输出double类型的8个字节值
  • writeUTF(String s)
    先输出2个字节值,标示字符串的字节长度,再输出字符串的这些字节值
    案例:
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;


public class Test1 {

public static void main(String[] args) {

    /**
     * write(int b)
     * write(byte[])
     * write(byte[],from,n) 注:从from开始的n个字节值
     */
    try {

        RandomAccessFile raf=new RandomAccessFile("d:/f2", "rw");
        raf.write(97);// 00 00 00 61 -->61 输出整数值
        raf.write(98);
        raf.write(99);
        raf.write(257);//00 00 01 01 -->01

        //创建数组,数组里放一些字节值
        byte [] buf={100,101,102,103,104,105,106,107,108,109};
        raf.write(buf);
        raf.write(buf,4,3);

        raf.close();//关闭,释放系统资源

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}
//运行程序后再D盘找到f2文件,使用UltraEdit查询字符串工具打开
//注:在UltraEdit中使用crtl+F12进行切换编码格式

读取方法read:

  • 读取文件到内存
  • read()
    读取一个字节值,然后补三个零字节,变成int类型
    【4】–>【1】【2】【3】【4】
    读取结束之后,再读取,返回-1
  • read(byte[] buf)
    根据指定数组长度,读取一批字节值,并放入指定的数组中,返回数组的字节数量
    读取结束之后,再读取,返回-1
  • seek(int position)
    定位下标位置
  • getFilePointer()
    获得下标当前所在的位置
  • readInt()
    读取4个字节值转成int
  • readDouble()
    读取8个字节值转成double
  • readUTF()
    先读取两个字节值,来确定字符串的字符长度,再读取这些字节值,专程String

案例:

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.lang.reflect.Array;
import java.util.Arrays;


public class Test1 {

public static void main(String[] args) {

    /**
     * write(int b)
     * write(byte[])
     * write(byte[],from,n) 注:从from开始的n个字节值
     */
    try {

        RandomAccessFile raf=new RandomAccessFile("d:/f2", "rw");
        /**
         * 写:
         */
        raf.write(97);// 00 00 00 61 -->61 输出整数值
        raf.write(98);
        raf.write(99);
        raf.write(257);//00 00 01 01 -->01

        //创建数组,数组里放一些字节值
        byte [] buf2={100,101,102,103,104,105,106,107,108,109};
        raf.write(buf2);
        raf.write(buf2,4,3);

        /**
         * 读取:
         */
        //指针定位到0位置
        raf.seek(0);
        /**
         * 单字节读取标准格式
         */
        int b;
        while ((b=raf.read())!=-1) {
            //从头到尾读取每一个字节值
            System.out.println(b);
        }
        //从新定位到0位置
        raf.seek(0);
        /**
         * 批量读取标准格式
         */
        byte[] buf=new byte[5];
        int n;//每次的个数
        while((n=raf.read(buf))!=-1){
            System.out.println(n+": "+Arrays.toString(buf));
        }

        raf.close();//关闭,释放系统资源

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

练习:

  • 求目录的总大小

  • 文件加密解密
    更改字节值
    文件加密逻辑:从文件当中读取一个字节值,对字节值进行加密处理,加密之后字节值会被修改成其他的值,再把他写会之前位置。每一个字节值都这样处理。
    注意:下标。文件当中取出字节值之后,下标就会向后移动到下一个了,我们想要把他写回刚才位置时,要把下标位置向前定义回位置。

代码

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


public class Test2 {

public static void main(String[] args) {
    System.out.println("输入文件路径: ");
    String s=new Scanner(System.in).nextLine();
    System.out.println("输入Key值:  ");
    int key=new Scanner(System.in).nextInt();

    try {
        //加密解密方法
        encript(s,key);
        System.out.println("完成");
    } catch (Exception e) {
        System.out.println("失败");
        //打印完整异常信息
        e.printStackTrace();
    }
}
/**
 * 加密解密方法
 * @param path   文件路径  d:/abc.txt
 * @param key
 */
private static void encript(String path, int key) throws Exception{

    RandomAccessFile raf=new RandomAccessFile(path,"rw");
/**
 * 单字节写
 */
//  int b;
//  while((b=raf.read())!=-1){
//      
//       b^=key;
//      //得到当前下标值,往回定位
//      raf.seek(raf.getFilePointer()-1);
//      raf.write(b);
//  }
/**
 * 批量写
 * 1k,2k,3k,4k
 * 1024,2048,4096,8192
 */
byte[] buf=new byte[8192];
int n;//每次的个数
while((n=raf.read(buf))!=-1){
    //对每一字节值进行加密处理,处理前面的n个
    for(int i=0;i<n;i++){
        //改
        buf[i]^=key;
    }
    //改完后写会文件
    raf.seek(raf.getFilePointer()-n);
    raf.write(buf,0,n);
}

    raf.close();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值