RandomAccessFile适用于大小已知的记录组成的文件。提供的对文件訪问。既能够读文件。也能够写文件,而且支持随机訪问文件。能够訪问文件的任何位置。

文件里记录的大小不一定都同样。仅仅要我们知道记录的大小和位置。可是该类仅限于操作文件。


RandomAccessFile不属于InputStream和OutputStream继承层次结构中的一部分。除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个继承层次结构没有不论什么关系,它甚至不使用InputStream和OutputStream类中已经存在的不论什么功能;它是一个全然独立的类。从头開始编写其全部的方法(大多数都是本地的)。这么做是由于RandomAccessFile拥有和别的IO类型本质上不同的行为。由于我们能够在一个文件内向前和向后移动。

它是一个直接继承Object的,独立的类。


本质上说,RandomAccessFile的工作方式类似于把DataInputStream和DataOutputStream结合起来,还加入了一些方法,当中方法getFilePointer( )用来查找当前所处的文件位置。seek( )用来在文件内移至新的位置,length( )用来推断文件大小。

此外。它的构造方法还须要一个參数来表示打开模式(仅仅读方式
r 读写方式 rw)。它不支持仅仅写文件。


仅仅有RandomAccessFile支持搜寻方法(seek()),而且这种方法也仅仅适用于文件。BufferedInputStream却仅仅能同意标注(mark())位置(其值存储在内部某个变量内)和又一次设定位置(reset()),可是这些功能有限,不是很有用。

在JDK 1.4中,RandomAccessFile的绝大多数功能(但不是所有)已经被nio内存映射文件给代替了。


方法:

方法 描写叙述
void close() 关闭此随机訪问文件流并释放与该流关联的全部系统资源。

FileChannel getChannel () 返回与此文件关联的唯一 FileChannel 对象。

FileDescriptor getFD () 返回与此流关联的不透明文件描写叙述符对象。

long getFilePointer () 返回此文件里的当前偏移量,用来查找当前所处的位置。
long length() 返回此文件的长度。

int read() 从此文件里读取一个数据字节
int read(byte[] b) 将最多 b.length 个数据字节从此文件读入 byte 数组。
int read(byte[] b,int off,int len) 将最多 len 个数据字节从此文件读入 byte 数组。
boolean readBoolean() 从此文件读取一个 boolean。
byte readByte() 从此文件读取一个有符号的八位值。
char readChar() 从此文件读取一个字符
double readDouble() 从此文件读取一个 double。
float readFloat() 从此文件读取一个 float。

void readFully(byte[] b) 将 b.length 个字节从此文件读入 byte 数组,并从当前文件指针開始。
void readFully(byte[] b,int off,int len) 将正好 len 个字节从此文件读入 byte 数组,并从当前文件指针開始。

int readInt() 从此文件读取一个有符号的 32 位整数。

String readLine() 从此文件读取文本的下一行。

long readLong() 从此文件读取一个有符号的 64 位整数。

short readShort() 从此文件读取一个有符号的 16 位数。
int readUnsignedByte() 从此文件读取一个无符号的八位数
int readUnsignedShort() 从此文件读取一个无符号的 16 位数。
String readUTF() 从此文件读取一个字符串。
void seek(long pos) 设置到此文件开头測量到的文件指针偏移量,在该位置发生下一个读取或写入操作。

void setLength(long newLength) 设置此文件的长度。

int skipBytes(int n) 尝试跳过输入的 n 个字节以丢弃跳过的字节。

void write(byte[] b) 将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针開始。
void write(byte[] b, int off, int len) 将 len 个字节从指定 byte 数组写入到此文件。并从偏移量 off 处開始。

void write(int b) 向此文件写入指定的字节。

void writeBoolean(boolean v) 按单字节值将 boolean 写入该文件。

void writeByte(int v) 按单字节值将 byte 写入该文件
void writeBytes(String s) 按字节序列将该字符串写入该文件。
void writeChar(int v) 按双字节值将 char 写入该文件。先写高字节。

void writeChars(String s) 按字符序列将一个字符串写入该文件。
void writeDouble(double v) 使用 Double 类中的 doubleToLongBits 方法将双精度參数转换为一个 long,然后按八字节数量将该 long 值写入该文件,先定高字节。

void writeFloat(float v) 使用 Float 类中的 floatToIntBits 方法将浮点參数转换为一个 int,然后按四字节数量将该 int 值写入该文件。先写高字节。
void writeInt(int v) 按四个字节将 int 写入该文件,先写高字节。
void writeLong(long v) 按八个字节将 long 写入该文件,先写高字节
void writeShort(int v) 按两个字节将 short 写入该文件,先写高字节。

void writeUTF(String str) 使用 modified UTF-8 编码以与机器无关的方式将一个字符串写入该文件。



案例:

package com.qunar.bean;
 
import java.io.File;
import java.io.RandomAccessFile;
import java.util.Arrays;
 
public class FileDemo {
public static void main(String[] args) {
String pathname = "D:\\Recommended system.txt";
// 创建文件实例
File file = new File(pathname);
try {
// 推断文件是否存在
if(!file.exists()){
file.createNewFile();
}//if
// 读写方式打开文件
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
// write 从当前指针開始写入,写入一个字节
randomAccessFile.write('A');
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
randomAccessFile.write('B');
int num = 0x7fffffff;
// 假设用write方法。每次仅仅能写一个字节。须要写4次
randomAccessFile.write(num >>> 24);
randomAccessFile.write(num >>> 16);
randomAccessFile.write(num >>> 8);
randomAccessFile.write(num);
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
// 或者是用writeInt方法 一次写入
randomAccessFile.writeInt(num);
System.out.println("当前所处的位置:"+randomAccessFile.getFilePointer());
// 文件指针指向文件开头
randomAccessFile.seek(0);
// 一次性读取 把文件里内容都读到字节数组中
byte[] buffer = new byte[(int)randomAccessFile.length()];
randomAccessFile.read(buffer);
for (byte b : buffer) {
// 16进制输出
System.out.print(Integer.toHexString(b)+" ");
}//for
randomAccessFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.qunar.bean;
 
import java.io.File;
import java.io.RandomAccessFile;
 
public class FileDemo {
public static void main(String[] args) {
String pathname = "D:\\Recommended system.txt";
// 创建文件实例
File file = new File(pathname);
try {
// 推断文件是否存在
if(!file.exists()){
file.createNewFile();
}//if
// 读写方式打开文件
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
// 写值
for(int i = 0;i < 5;++i){
randomAccessFile.writeInt(i);
}//for
// 将文件指针移到第二个Int值后
randomAccessFile.seek(2*4);
// 覆盖第三个Int值
randomAccessFile.writeInt(6);
// 文件指针指向文件开头
randomAccessFile.seek(0);
// 输出
for (int i = 0;i < 5;++i) {
System.out.print(randomAccessFile.readInt()+" ");
}//for
randomAccessFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

package com.qunar.bean;
 
import java.io.File;
import java.io.RandomAccessFile;
 
public class FileDemo {
public static void main(String[] args) {
String pathname = "D:\\Recommended system.txt";
// 创建文件实例
File file = new File(pathname);
try {
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
// 下面向file文件里写数据
// 占4个字节
randomAccessFile.writeInt(2015);
// 占8个字节
randomAccessFile.writeDouble(12.23);
// 占2个字节
randomAccessFile.writeShort(19);
System.out.println("当前位置:"+randomAccessFile.getFilePointer());
randomAccessFile.writeUTF("欢迎来到小斯的博客");
System.out.println("当前位置:"+randomAccessFile.getFilePointer());
// 占2个字节
randomAccessFile.writeChar('Y');
System.out.println("当前位置:"+randomAccessFile.getFilePointer());
randomAccessFile.writeUTF("小斯的博客欢迎你");
// 把文件指针位置设置到文件起始处
randomAccessFile.seek(0);
System.out.println("读取一个Int值:"+randomAccessFile.readInt());
System.out.println("读取一个Double值:"+randomAccessFile.readDouble());
System.out.println("读取一个Short值:"+randomAccessFile.readShort());
System.out.println("读取一个字符串:"+randomAccessFile.readUTF());
// 将文件指针跳过2个字节
randomAccessFile.skipBytes(2);
System.out.println("读取一个字符串:"+randomAccessFile.readUTF());
randomAccessFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}









[Java开发之路](7)RandomAccessFile类具体解释的更多相关文章

  1. 我的Java开发学习之旅------>工具类:将播放器的进度值转换成相应的时间格式

    在我的博客<我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法,地址:http://blog.csdn.net/ouyang_pen ...

  2. Java基础(二十八)Java IO(5)RandomAccessFile类与过滤器流(Filter Stream)

    一.RandomAccessFile类 使用RandomAccessFile类可以读取任意位置数据的文件. 1.构造方法 RandomAccessFile(String name, String mo ...

  3. [Java开发之路](6)File类的使用

    1. 构造方法 构造方法 描写叙述 File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建一个新的文件实例. File(String parent , String ...

  4. 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值

    ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...

  5. [Java开发之路](8)输入流和输出流

    1. Java流的分类 按流向分: 输入流: 能够从当中读入一个字节序列的对象称作输入流. 输出流: 能够向当中写入一个字节序列的对象称作输出流. 这些字节序列的来源地和目的地能够是文件,并且通常都是 ...

  6. [Java开发之路](23)装箱与拆箱

    1. 简单介绍 大家对基本数据类型都很熟悉.比如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性,比方基本类型不能调用方法.功能简单. ..,为了让基本 ...

  7. 我的Java开发学习之旅------>工具类:Java使用正则表达式分离出字符串中的中文和英文

    今天看到一个工具类使用正则表达式将一大段字符串中的中文和英文都分离出来了,在此记录一下,读者可以收藏! import java.util.ArrayList; import java.util.Col ...

  8. [Java开发之路](9)对象序列化与反序列化

    1. 对象序列化 当你创建对象时.仅仅要你须要.它会一直存在,可是程序终止时,不管何时它都不会继续存在.虽然这样做是很有意义的,可是在某些情况下.假设程序不执行时扔能存在而且保存其信息,那将对我们很实 ...

  9. [Java开发之路](16)学习log4j日志

    1. 新建一个Javaproject.导入Jar包(log4j-1.2.17.jar) Jar包下载地址:点击打开链接 2. 配置文件:创建并设置log4j.properties # 设置 log4j ...

随机推荐

  1. [javascript] jQuery系列之目录汇总

    最近一个月写了些关于jQuery的文章,谢谢大家的支持.文章仅我个人观点,也许有不对的地方,请指出.这个系列还在更新中 一:jQuery基础系列: jQuery温习篇---强大的JQuery选择器 j ...

  2. ROS-launch文件标签解读

    前言:ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系 ...

  3. 前端(小程序)项目Aes.js/Md5.js加密的处理方法

    做项目中需要对前端数据加密传输这个时候需要用到前端加密的算法主要是:Aes.js,Md5.js 一.Vue项目用到的aes.js加密. 1.直接在index.html引入aes.js或者在npm in ...

  4. VCRuntime静默安装

    批处理脚本: "%~dp0\VC_X64Runtime\VC_x64Runtime.exe" /q"%~dp0\VC_X86Runtime\VC_X86Runtime.e ...

  5. SQLServer 行转列,统计,二次分组

    create table test (   bizdate datetime, --日期   classes varchar(50), --班次 '白班' 或 '夜班'   qty int --产量 ...

  6. ES6变量的解构赋值

    变量的解构赋值 1.数组的解构赋值 2.对象的解构赋值 3.字符串的解构赋值 4.数值和布尔值的解构赋值 5.函数参数的解构赋值 6.圆括号问题 7.用途 1.数组的解构赋值 ES6 允许写成下面这样 ...

  7. java集合的学习笔记

    不知不觉也到了java集合这一章的学习,这因该是挺重要的一个章节,因为所有的程序都离不开数据,而一个良好的数据结构和算法应该是程序的灵魂吧. 今天对自己所初步了解的做一个总结: 数据结构是计算机存储. ...

  8. 使用DbVisualizer变量

    变量可用于构建参数化SQL语句,并让DbVisualizer在执行SQL时提示您输入值.如果您重复执行相同的SQL,只是希望在同一个SQL语句中传递新数据,这很方便. 变量语法 变量格式支持设置默认值 ...

  9. salt-master迁移

    1.在迁移到的目标机器上先安装salt-master 2.把原master机器上的/etc/salt/pki目录打包发送到迁移的机器上的同等目录下面 3.在原master机器上批量修改minion的配 ...

  10. 解读:20大5G关键技术

    解读:20大5G关键技术 5G网络技术主要分为三类:核心网.回传和前传网络.无线接入网. 核心网 核心网关键技术主要包括:网络功能虚拟化(NFV).软件定义网络(SDN).网络切片和多接入边缘计算(M ...