1. RandomAccessFile    

  Java提供了一个可以对文件随机访问的操作,访问包括读和写操作。该类名为RandomAccessFile。该类的读写是基于指针的操作。

 

1)文件访问模式

  RandomAccessFile在堆文件进行随机访问操作时有两个模式,分为只读模式(只读取文件数据),和读写模式(对文件数据进行读写)。

  在创建RandomAccessFile时,其提供的构造方法要求我们传入访问模式:

  • RandomAccessFile(File file,String mode)
  • RandomAccessFile(String filename,String mode)

  其中构造方法的第一个参数是需要访问的文件,而第二个参数则是访问模式:“r”字符串表示对该文件的访问是只读的;”rw“字符串表示对该文件的访问是读写模式。

2)字节数据读写操作

2.1)write(int d)方法

  • 该方法可以向文件中写出字节:void write(int d);
  • 该方法会根据当前指针所在位置初写入一个字节,是将参数int的”低8位“写出

2.2)read()方法

  • 该方法可以从文件中读取字节:int read();
  • 该方法会从文件中读取一个byte(8位)填充到int的低8位,高24位为0,返回值范围整数:0~255,如果返回-1表示读取到了文件末尾。每次读取后自动移动文件指针,准备下次读取。

案例1:write和read演示

import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFile_writeAndread {public static void main(String[] args) throws IOException {RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");raf.write(24);int x = raf.read();System.out.println(x);  //写完之后指针会停留在文件的最后一个字节位置,即文件末尾,所以读取的时候是-1raf.seek(0);  //将指针移动到开始位置x = raf.read();System.out.println(x);raf.close();}
}/*
运行结果:
-1
24
*/

  

  

案例2:read超范围演示

import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFile_writeAndread {public static void main(String[] args) throws IOException {RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");raf.write(264);  //范围是0~255,超范围raf.seek(0);  //将指针移动到开始位置int x = raf.read();System.out.println(x);raf.close();}
}/*
运行结果:
8分析:因为read()方法会读取当前指针所在位置的一个字节(8位),264二进制的低8位是:00001000,所以指针从0开始读取到的是8
*/

  

  

2.3)write(byte[] d)方法

  • 该方法可以向文件中写出一组字节:void write(byte[] d)
  • 该方法会根据当前指针所在的位置处连续写出给定数组中的所有字节

  与该方法相似的还有一个常用方法:

  • void write(byte[] d,int offset,int len)
  • 该方法会根据当前指针所在位置处连续写出给定数组中的部分字节,这个部分是从数组的offset处开始,连续len个字节

2.4)read(byte[] b)方法

  • 该方法可以从文件中批量读取字节:int read(byte[] b)
  • 该方法会从指针位置处尝试最多读取给定数组的总长度的字节量,并从给定的字节数组第一个位置开始,将读取到的字节顺序存放至数组中,返回值为实际读取到的字节量。

案例3:批量写入和读取演示

import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFile_writeAndread {public static void main(String[] args) throws IOException {RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");String str = "你好,Java!";byte[] date = str.getBytes();  //将字符串转换为字节raf.write(date);  //将字节写入文件raf.seek(0);  //将指针移动到初始位置byte[] dateRead = new byte[100];  //创建字符串数组用于批量读取文件字节int re = raf.read(dateRead);System.out.println(re);raf.close();}
}//运行结果:10

  

案例4:批量写入和读取演示2

import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFile_write {public static void main(String[] args) throws IOException {RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");String str = "你好,Java!";byte[] date = str.getBytes();raf.write(date,0,4);   //写入”你好“即4个字节raf.seek(0);byte[] dateRead = new byte[100];int re = raf.read(dateRead);System.out.println(re);raf.close();}
}//运行结果:4

  

  

2.5)close()方法

  • RandomAccessFile在对文件访问操作全部结束后,要调用close()方法来释放与其关联的所有系统资源:void close()

2.6)getFilePointer方法

  • RandomAccessFile的读写操作都是基于指针的,也就是说在指针当前所指向的位置进行读写操作
  • 方法:long getFilePointer(),该方法用于获取当前RandomAccessFile的指针位置

案例5:指针演示

import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFile_writeAndread {public static void main(String[] args) throws IOException {RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");System.out.println(raf.getFilePointer());  //开始指针位置0raf.write('A');System.out.println(raf.getFilePointer());  //指针位置1raf.writeInt(15);  //与write()方法区别System.out.println(raf.getFilePointer());  //指针位置5raf.close();}
}/*
运行结果:
0
1
5
*/

  

  

2.7)seek方法

  • 该方法用于移动指针的位置:void seek(long pos)

2.8)skipBytes方法

  • 该方法用于尝试跳过输入的n个字节以丢弃跳过的字节(跳过的字节不读取):int skipBytes(int n)
  • 该方法可能跳过一些较少数量的字节(可能包括0),这可能由任意数量的条件引起,在跳过n个字节之前已经到大文件的末尾只是其中的一种可能
  • 该方法不抛出EOFException,返回跳过的实际字节数,如果n为负数,则不跳过任何字节

案例6:seek和skipBytes演示

import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFile_writeAndread {public static void main(String[] args) throws IOException{RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");String str = "你好,Java!";byte[] date = str.getBytes();raf.write(date);System.out.println(raf.getFilePointer());raf.seek(0);System.out.println(raf.getFilePointer());raf.skipBytes(5);System.out.println(raf.getFilePointer());raf.close();}
}/*
运行结果:
10
0
5
*/

2.9)案例演示

案例1:批量写文件

import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFile_write {public static void main(String[] args) throws IOException {RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");String str = "好好学习,天天向上";byte[] date = str.getBytes("GBK");  //将字符串转换为字节数组,这里可以设置字符集,如果不写则为系统默认的字符集raf.write(date);System.out.println("写出完毕");raf.close();}
}

案例2:批量读文件

** 字符串提供了构造方法可以将给定的字节数组* 转换为字符串.* String(byte[] d,int offset,int len,String csn)* 将给定字节数组从下标offset处开始连续len个* 字节按照csn指定的字符集转换为字符串* */
import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFile_read {public static void main(String[] args) throws IOException {RandomAccessFile raf = new RandomAccessFile("raf.txt","r");byte[] date = new byte[100];int len = date.length;String str = new String(date,0,len,"GBK");System.out.println(str);raf.close();}
}

  

案例3:按字节复制文件(速度慢)

import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFile_copyFileDemo {public static void main(String[] args) throws IOException {RandomAccessFile src = new RandomAccessFile("raf.txt","r");RandomAccessFile desc = new RandomAccessFile("rafcopy.txt","rw");int d = -1;while((d=src.read())!=-1){ //每次让d按字符读取源文件,当读到文件末尾的时候(也就是d=-1)的时候停止循环desc.write(d);  //每次读取到源文件写入到目标文件}System.out.println("复制完毕");src.close();desc.close();}
}

 

案例4:按字节数组批量复制文件(速度快)

import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFile_copyFileDemo02 {public static void main(String[] args) throws IOException {RandomAccessFile src = new RandomAccessFile("demo.jpg","r");RandomAccessFile desc = new RandomAccessFile("democopy.jpg","rw");byte[] date = new byte[1024*10];int len = -1;while((len=src.read(date))!=-1){//将给定字节数组中从offset处开始连续的len个字节一次性写出desc.write(date,0,len);}System.out.println("复制完毕");src.close();desc.close();}
}

  

 

转载于:https://www.cnblogs.com/jmwm/p/6931307.html

Java 文件操作-RandomAccessFile相关推荐

  1. 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)

    读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...

  2. Java文件操作源码大全

    Java文件操作源码大全 1.创建文件夹 5 2.创建文件 5 3.删除文件 5 4.删除文件夹 6 5.删除一个文件下夹所有的文件夹 7 6.清空文件夹 8 7.读取文件 8 8.写入文件 9 9. ...

  3. Java文件操作大全(绝对的经典,值得收藏!)

    Java文件操作 //1.创建文件夹 //import java.io.*; File myFolderPath = new File(str1); try { if (!myFolderPath.e ...

  4. 【Java文件操作(八)】将控制台输出重定向到txt文件

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

  5. 【Java文件操作(七)】序列化:将自定义类写入文件

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

  6. 【Java文件操作(六)】借助内存复制图片:ByteArrayOutputStream\ByteArrayInputStream\FileOutputStream\FileInputStream辨析

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

  7. 【Java文件操作(五)】从txt文件中读取字符串、乱码原因

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

  8. 【Java文件操作(三)】递归复制文件夹内所有文件

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

  9. 【Java文件操作(一)】递归打印文件目录

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java 文 ...

最新文章

  1. leetcode--最长连续递增序列--python
  2. android广告页白屏_android 白屏
  3. 查看Hive SQL执行日志
  4. 【完整可运行代码】剑指 Offer 29. 顺时针打印矩阵
  5. Express res.render 学习笔记
  6. 【php数组函数序列】之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值...
  7. oracle dplsql.bsq,Oracle PLSQL语言初级教程之过程和函数
  8. UI(2)---移动端APP应该如何定义页面规范
  9. mac的 上传到linux服务器地址,【mac 怎么登录到 linux 服务器并传输文件?】-看准网...
  10. sqlmap的篡改绕过WAF
  11. R语言学习笔记 | R语言的入门
  12. SharePoint CAML 查询时间类型
  13. python爬虫--王者荣耀高清壁纸下载
  14. 怎样做文献综述:六步走向成功-读书笔记
  15. 【微信朋友圈,如何测】
  16. CommandArgument的一种用法
  17. 欧标IEC62056 兰吉尔关口电表无线抄表数据采集方案
  18. switch case 穿透
  19. 巧用img的width和height属性进行缩图,使图片不变形
  20. 信用卡分期利率陷阱——实际利率计算

热门文章

  1. 直接在 DNA 上执行 SQL 操作,已通过 PostgreSQL 验证
  2. 使用EntityFramework Core和Enums作为字符串的ASP.NET Core Razor页面——第四部分
  3. 四川专科学校排名四川计算机,四川省现代计算机职业学院2020年排名
  4. 怎么样向云服务器上传文件_如何向云服务器传输文件
  5. rust种的南瓜为什么老是消失_科技的力量!3种“奇葩”的发明,你都见过吗?...
  6. 有关“数据统计”的一些概念 -- PV UV VV IP跳出率等
  7. FinalShell SSH工具下载
  8. stm32无源蜂鸣器定时器_使用STM32控制无源蜂鸣器发声播放音乐
  9. linux误删除 dev disk文件,误删除 linux 系统文件了?这个方法教你解决
  10. linux7 vnc看不到桌面,VNC Viewer轻松连接远程CentOS7桌面