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); //写完之后指针会停留在文件的最后一个字节位置,即文件末尾,所以读取的时候是-1
raf.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()); //开始指针位置0
raf.write('A');
System.out.println(raf.getFilePointer()); //指针位置1
raf.writeInt(15); //与write()方法区别
System.out.println(raf.getFilePointer()); //指针位置5
raf.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();
}
}

  

 

Java 文件操作-RandomAccessFile的更多相关文章

  1. JAVASE02-Unit06: 文件操作——File 、 文件操作—— RandomAccessFile

    Unit06: 文件操作--File . 文件操作-- RandomAccessFile java.io.FileFile的每一个实例是用来表示文件系统中的一个文件或目录 package day06; ...

  2. Java文件操作源码大全

    Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...

  3. 文件操作——RandomAccessFile

      文件操作——RandomAccessFile 构建RandomAccessFileJava提供了一个可以对文件随机访问的操作,访问包括读和写操作.该类名为RandomAccessFile.该类的读 ...

  4. Java 文件操作大全

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

  5. JAVA文件操作类和文件夹的操作代码示例

    JAVA文件操作类和文件夹的操作代码实例,包括读取文本文件内容, 新建目录,多级目录创建,新建文件,有编码方式的文件创建, 删除文件,删除文件夹,删除指定文件夹下所有文件, 复制单个文件,复制整个文件 ...

  6. java文件操作(普通文件以及配置文件的读写操作)

    转自:java文件操作(普通文件以及配置文件的读写操作) 读取普通文件 : /** * xiangqiao123欢迎你 如果对代码有疑问可以加qq群咨询:151648295 * * 读取MyFile文 ...

  7. 14、Java文件操作stream、File、IO

    1.文件操作涉及到的基本概念 File File类 是文件操作的主要对象中文意义就是 文件 顾名思意 万物皆文件,在计算上看到的所有东西都是文件保存,不管是你的图片.视频.数据库数据等等都是按照基本的 ...

  8. Java文件操作API功能与Windows DOS命令和Linux Shell 命令类比

    Java文件操作API功能与Windows DOS命令和Linux Shell 命令类比: Unix/Linux (Bash) Windows(MS-DOS) Java 进入目录 cd cd - 创建 ...

  9. Java文件操作与输入输出流

    文件操作 package ch15; import java.io.*; /** * Created by Jiqing on 2016/12/28. */ public class FileTest ...

随机推荐

  1. Manacher's Algorithm 马拉车算法(最长回文串)

    这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这 ...

  2. MyCat - 使用篇(5)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 意思就是,开头为北京的范围在A0000000~A9999999的根据后面的哈希值对5取模平均分布在0,1,2 ...

  3. org.apache.commons.httpclient和org.apache.http.client区别(转)

    官网说明: http://hc.apache.org/httpclient-3.x/ Commons HttpClient项目现已结束,不再开发.它已被其HttpClient和HttpCore模块中的 ...

  4. 树状数组laekov

    lowbit 数组的第 i 位存储的是以 i 为结尾的长度为lowbit(i) 的一段的和. int lowBit(x) { return x & -x; } 加点 int n, bt[max ...

  5. 基于ZFAKA二次开发,添加PayJS支付渠道

    项目地址:https://github.com/hiyouli/payjs-for-zfaka 关于ZFAKA,请移步:ZFAKA 免费.安全.稳定.高效的发卡系统,值得拥有! 演示地址:http:/ ...

  6. 《SQL 进阶教程》 case:练习题1-1-1 多列数据的最大值

    select name, case when case when x > y then x else y end < z then z else case when x < y th ...

  7. Leetcode:根据身高重建队列

    题目 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. 注意: 总人数少于11 ...

  8. HttpServletRequest 和 HttpServletResponse

    Servlet配置方式 全路径匹配 以 / 开始 /a /aa/bb localhost:8080/项目名称/aa/bb 路径匹配 , 前半段匹配 以 / 开始 , 但是以 * 结束 /a/* /* ...

  9. 关系型数据库---MySQL---数据库设计三大范式

    1.第一范式: 1.1.1 数据表的每个数据列具有原子性: 1.1.2 同一个数据表中内容相似的数据列必须消除: 2.第二范式: 第一范式的基础上,每个数据表只描述一件事: 3.第三范式: 第二范式的 ...

  10. DNS学习

    DNS (Domain Name System 的缩写)域名系统,万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过域名 ...