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. CodeForces 287B Pipeline (水题)

    B. Pipeline time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  2. 微信小程序开发之下拉菜单

    实现功能:点击维保人员,调出下拉菜单.选择子菜单时,显示右边的图标表示选中,并进行赋值并进行搜索筛选 Wxml: <view class="dtclass" bindtap= ...

  3. [51nod] 1289 大鱼吃小鱼 堆栈-模拟

    有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右.游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼.从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右).问足够长的时间之后 ...

  4. firefly

    firefly (9秒社团-游戏服务端开源引擎) 编辑 Firefly是免费.开源.稳定.快速扩展.能 “热更新”的分布式游戏服务器端框架,采用Python编写,基于Twisted框架开发.它包括了开 ...

  5. opengl Polygon Offset

    http://www.cnblogs.com/bitzhuwei/archive/2015/06/12/4571539.html#_label2 启用了Polygon Offset,那么到底要把立方体 ...

  6. U3D shaderlab 相关指令开关

    Subshader { [Tags] [CommonState] Passdef [Passdef ...] }Tags分为SubShader Tags和Pass Tags,Tags放在SubShad ...

  7. cat命令详解及here doc

    以下内容转自:http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文 ...

  8. Spring IOC 的源码分析

    刚学习Spring的时候,印象最深的就是 DispatcherServlet,所谓的中央调度器,我也尝试从这个万能胶这里找到入口 configureAndRefreshWebApplicationCo ...

  9. [Android]Android四大组件之Service总结

    一.Service介绍 Service是Android中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要长期运行的task.Service的运行不需要依赖于任何用户界面,即 ...

  10. Luogu P1462 通往奥格瑞玛的道路 二分答案+最短路

    先二分答案,再跑最短路,跑的时候遇到 过路费超过二分的答案的 就不拿他更新最短路 #include<cstdio> #include<iostream> #include< ...