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. WCF IIS部署

    创建WCFHost应用程序 Iservice.cs using System; using System.Collections.Generic; using System.Linq; using S ...

  2. Oracle 11g R2安装手册(…

    1.Oracle 11g R2安装手册(图文教程)For Windows 1.下载Oracle 11g R2 for Windows版本,下载地址如下官方网站:http://download.orac ...

  3. QTableWidget笔记

    1.QTableWidget继承自QTableView. 2.头文件:QTableWidget 3.简单使用: #include "mainwindow.h" #include & ...

  4. openstack介绍(二)

    OpenStack services 本节将详细描述OpenStack服务. Compute service overview(计算服务概述) 使用OpenStack云计算计算主机和管理系统.Open ...

  5. day5 面向对象

    面向对象的特征 封装(encapsulation) 继承(inheritance) 多态(polymorphism) 开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情. 设计的过程:其实就 ...

  6. BDBR vs BDPSNR 计算方法 (转载)

    转自:http://blog.csdn.net/menyangyang/article/details/42874575

  7. HTML5学习笔记(二)新元素和功能

    <canvas> 新元素(必须使用脚本来绘制图形) 标签 描述 <canvas> 标签定义图形,比如图表和其他图像.该标签基于 JavaScript 的绘图 API HTML5 ...

  8. CLR via C# 第五章学习记录(更新中)

    1.设置全局溢出检查,项目属性->生成->高级->检测运算上溢/下溢 2.局部使用溢出检测 Byte b = ; b = ));// 不检测溢出 checked// 检测溢出代码段 ...

  9. OrderBy和OrderByDescending排序

    昨天有练习对数字阵列进行排序,<C#阵列Array排序>https://www.cnblogs.com/insus/p/10825174.html 其实一切都弄得很复杂,array已经有2 ...

  10. 自定义log4j的appender写es日志

    本篇和大家分享的是自定义log4j的appender,用es来记录日志并且通过kibana浏览es记录:就目前互联网或者一些中大型公司通常会用到第三方组合elk,其主要用写数据到es中,然后通过可视化 ...