java io系列26之 RandomAccessFile
本文主要介绍 RandomAccessFile。
转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_26.html
更多内容请参考:java io系列01之 "目录"
RandomAccessFile
RandomAccessFile 是随机访问文件(包括读/写)的类。它支持对文件随机访问的读取和写入,即我们可以从指定的位置读取/写入文件数据。
需要注意的是,RandomAccessFile 虽然属于java.io包,但它不是InputStream或者OutputStream的子类;它也不同于FileInputStream和FileOutputStream。 FileInputStream 只能对文件进行读操作,而FileOutputStream 只能对文件进行写操作;但是,RandomAccessFile 同时支持文件的读和写,并且它支持随机访问。
RandomAccessFile 函数列表
- RandomAccessFile(File file, String mode)
- RandomAccessFile(String fileName, String mode)
- void close()
- synchronized final FileChannel getChannel()
- final FileDescriptor getFD()
- long getFilePointer()
- long length()
- int read(byte[] buffer, int byteOffset, int byteCount)
- int read(byte[] buffer)
- int read()
- final boolean readBoolean()
- final byte readByte()
- final char readChar()
- final double readDouble()
- final float readFloat()
- final void readFully(byte[] dst)
- final void readFully(byte[] dst, int offset, int byteCount)
- final int readInt()
- final String readLine()
- final long readLong()
- final short readShort()
- final String readUTF()
- final int readUnsignedByte()
- final int readUnsignedShort()
- void seek(long offset)
- void setLength(long newLength)
- int skipBytes(int count)
- void write(int oneByte)
- void write(byte[] buffer, int byteOffset, int byteCount)
- void write(byte[] buffer)
- final void writeBoolean(boolean val)
- final void writeByte(int val)
- final void writeBytes(String str)
- final void writeChar(int val)
- final void writeChars(String str)
- final void writeDouble(double val)
- final void writeFloat(float val)
- final void writeInt(int val)
- final void writeLong(long val)
- final void writeShort(int val)
- final void writeUTF(String str)
1. RandomAccessFile 模式说明
RandomAccessFile共有4种模式:"r", "rw", "rws"和"rwd"。
- "r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
- "rw" 打开以便读取和写入。
- "rws" 打开以便读取和写入。相对于 "rw","rws" 还要求对“文件的内容”或“元数据”的每个更新都同步写入到基础存储设备。
- "rwd" 打开以便读取和写入,相对于 "rw","rwd" 还要求对“文件的内容”的每个更新都同步写入到基础存储设备。
说明:
(01) 什么是“元数据”,即metadata?
英文解释如下:
- The definition of metadata is "data about other data." With a file system, the data is contained in its files and directories, and the metadata tracks information about each of these objects: Is it a regular file, a directory, or a link? What is its size, creation date, last modified date, file owner, group owner, and access permissions?
大致意思是:
metadata是“关于数据的数据”。在文件系统中,数据被包含在文件和文件夹中;metadata信息包括:“数据是一个文件,一个目录还是一个链接”,“数据的创建时间(简称ctime)”,“最后一次修改时间(简称mtime)”,“数据拥有者”,“数据拥有群组”,“访问权限”等等。
(02) "rw", "rws", "rwd" 的区别。
当操作的文件是存储在本地的基础存储设备上时(如硬盘, NandFlash等),"rws" 或 "rwd", "rw" 才有区别。
当模式是 "rws" 并且 操作的是基础存储设备上的文件;那么,每次“更改文件内容[如write()写入数据]” 或 “修改文件元数据(如文件的mtime)”时,都会将这些改变同步到基础存储设备上。
当模式是 "rwd" 并且 操作的是基础存储设备上的文件;那么,每次“更改文件内容[如write()写入数据]”时,都会将这些改变同步到基础存储设备上。
当模式是 "rw" 并且 操作的是基础存储设备上的文件;那么,关闭文件时,会将“文件内容的修改”同步到基础存储设备上。至于,“更改文件内容”时,是否会立即同步,取决于系统底层实现。
2. 演示程序
源码如下:
- import java.io.File;
- import java.io.FileDescriptor;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.PrintStream;;
- import java.io.RandomAccessFile;
- import java.io.IOException;
- /**
- * RandomAccessFile 测试程序
- *
- * 运行结果(输出如下):
- * c1=a
- * c2=b
- * buf=9876543210
- *
- * 此外,
- * (01) 在源文件所在目录生成了file.txt。
- * (02) 注意RandomAccessFile写入boolean, byte, char, int,所占的字符个数。
- *
- * @author skywang
- */
- public class RandomAccessFileTest {
- private static final String FileName = "file.txt";
- public static void main(String[] args) {
- // 若文件“file.txt”存在,则删除该文件。
- File file = new File(FileName);
- if (file.exists())
- file.delete();
- testCreateWrite();
- testAppendWrite();
- testRead();
- }
- /**
- * 若“file.txt”不存在的话,则新建文件,并向文件中写入内容
- */
- private static void testCreateWrite() {
- try {
- // 创建文件“file.txt”对应File对象
- File file = new File(FileName);
- // 创建文件“file.txt”对应的RandomAccessFile对象
- RandomAccessFile raf = new RandomAccessFile(file, "rw");
- // 向“文件中”写入26个字母+回车
- raf.writeChars("abcdefghijklmnopqrstuvwxyz\n");
- // 向“文件中”写入"9876543210"+回车
- raf.writeChars("9876543210\n");
- raf.close();
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 向文件末尾追加内容
- */
- private static void testAppendWrite() {
- try {
- // 创建文件“file.txt”对应File对象
- File file = new File(FileName);
- // 创建文件“file.txt”对应的RandomAccessFile对象
- RandomAccessFile raf = new RandomAccessFile(file, "rw");
- // 获取文件长度
- long fileLen = raf.length();
- // 将位置定位到“文件末尾”
- raf.seek(fileLen);
- // 以下向raf文件中写数据
- raf.writeBoolean(true); // 占1个字节
- raf.writeByte(0x41); // 占1个字节
- raf.writeChar('a'); // 占2个字节
- raf.writeShort(0x3c3c); // 占2个字节
- raf.writeInt(0x75); // 占4个字节
- raf.writeLong(0x1234567890123456L); // 占8个字节
- raf.writeFloat(4.7f); // 占4个字节
- raf.writeDouble(8.256);// 占8个字节
- raf.writeUTF("UTF严"); // UTF-8格式写入
- raf.writeChar('\n'); // 占2个字符。“换行符”
- raf.close();
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 通过RandomAccessFile读取文件
- */
- private static void testRead() {
- try {
- // 创建文件“file.txt”对应File对象
- File file = new File(FileName);
- // 创建文件“file.txt”对应的RandomAccessFile对象,以只读方式打开
- RandomAccessFile raf = new RandomAccessFile(file, "r");
- // 读取一个字符
- char c1 = raf.readChar();
- System.out.println("c1="+c1);
- // 读取一个字符
- char c2 = raf.readChar();
- System.out.println("c2="+c2);
- // 跳过54个字节。
- raf.seek(54);
- // 测试read(byte[] buffer, int byteOffset, int byteCount)
- byte[] buf = new byte[20];
- raf.read(buf, 0, buf.length);
- System.out.println("buf="+(new String(buf)));
- raf.close();
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
- }
运行结果:
c1=a
c2=b
buf=9876543210
结果说明:
程序会在源文件所在目录生成file.txt;file.txt的内容如下:
file.txt对应的16进制内容如下:
java io系列26之 RandomAccessFile的更多相关文章
- java io系列01之 "目录"
java io 系列目录如下: 01. java io系列01之 "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括 ...
- java io系列
java io系列01之 "目录" java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream) java io系列03之 ...
- Java IO系列之一:IO
1. 概述 Java IO一般包含两个部分: 1.java.io包中堵塞型IO: 2.java.nio包中的非堵塞型IO,通常称为New IO. java.io包下,分为四大块近80个类: 1.基于字 ...
- java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例
本章,我们对java 管道进行学习. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_04.html java 管道介绍 在java中,PipedOu ...
- java io系列07之 FileInputStream和FileOutputStream
本章介绍FileInputStream 和 FileOutputStream 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_07.html File ...
- java io系列20之 PipedReader和PipedWriter
本章,我们学习PipedReader和PipedWriter.它们和“PipedInputStream和PipedOutputStream”一样,都可以用于管道通信. PipedWriter 是字符管 ...
- java io系列16之 PrintStream(打印输出流)详解
本章介绍PrintStream以及 它与DataOutputStream的区别.我们先对PrintStream有个大致认识,然后再深入学习它的源码,最后通过示例加深对它的了解. 转载请注明出处:htt ...
- java io系列06之 序列化总结(Serializable 和 Externalizable)
本章,我们对序列化进行深入的学习和探讨.学习内容,包括序列化的作用.用途.用法,以及对实现序列化的2种方式Serializable和Externalizable的深入研究. 转载请注明出处:http: ...
- java io系列15之 DataOutputStream(数据输出流)的认知、源码和示例
本章介绍DataOutputStream.我们先对DataOutputStream有个大致认识,然后再深入学习它的源码,最后通过示例加深对它的了解. 转载请注明出处:http://www.cnblog ...
随机推荐
- mysql 自带的性能压力测试工具
mysqlslap -h127.0.0.1 -uroot -p --concurrency=100 --iterations=1 --auto-generate-sql --auto-generate ...
- 使用ROME解析rss,如何获取icon图标
问题 网站使用SpringMVC框架,实现了RSS订阅,但是在阅读器里面,只有网站的标题,没有网站的图标. 分析 ROME会从<channel>标签下指定的<link>地址中, ...
- POI如何自动调整Excel单元格中字体的大小
问题 目的是要将Excel中的文字全部显示出来,可以设置对齐格式为[缩小字体填充],但是这样的话只能展示出一行数据,字体会变得很小.还有一种办法,设置对齐格式为[自动换行],然后让单元格中的字体自动调 ...
- Django 调用报错 " ImportError: Couldn't import Django. "
系统炸了导致不得已重装 安装 Django后 利用ORM 创建表的时候报错 Traceback (most recent call last): File "manage.py", ...
- c# Redis 使用
1.服务端两个版本窗口版与安装windows服务版 1.1.窗口版 下载地址:https://github.com/dmajkic/redis/downloads redis-server.exe:服 ...
- VS编译LESS插件
1. LESS 用LESS写CSS可以用写程序代码的习惯写CSS.用了之后写CSS的效率会提高很多. 2.解释LESS 写出来的文件扩展名是.less,要运行的话,先解释成正常的CSS文件. 3. ...
- BZOJ3456 城市规划 【多项式求ln】
题目链接 BZOJ3456 题解 真是一道经典好题,至此已经写了分治\(NTT\),多项式求逆,多项式求\(ln\)三种写法 我们发现我们要求的是大小为\(n\)无向联通图的数量 而\(n\)个点的无 ...
- Postman的一个使用技巧----设置环境变量
相同的api接口因为部署环境不同,分为test和pre_production 打开Postman,建两个测试集,分别测试测试环境test和演练环境pre_production 下面来介绍一下Postm ...
- redux源码解析-redux的架构
redux很小的一个框架,是从flux演变过来的,尽管只有775行,但是它的功能很重要.react要应用于生成环境必须要用flux或者redux,redux是flux的进化产物,优于flux. 而且r ...
- Windows下安装flask虚拟环境
前提 已经安装好python2.x或者pyhton3.x的条件下,使用pip包管理工具 flask框架就不作介绍直接安装 开始安装 1. 命令窗口下: 进入windows的命令窗口有三种方式: 第一种 ...