RandomAccessFile

是Java输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据。并且它支持“任意访问”的方式,程序可以直接跳转到文件的任意位置来读写数据。

如何我们希望值访问文件部分内容,而不是把文件从头读到尾,使用RandomAccessFile将是更好的选择。

如果程序需要向已存在的文件后追加内容,则应该使用RandomAcessFile.

RandomAccessFile对象包含一个记录指针,用来表示当前读写处的位置。

RandomAccessFile包含两个方法来操作文件记录指针:

long getFilePointer() :返回文件记录指针的当前位置

void seek(long pos):将文件记录指针定位到pos位置。

Random访问模式:

"r"     : 以只读方式打开指定文件

"rw"    : 以读写方式打开指定文件。如果该文件不存在,则尝试创建该文件

"rws"  : 同上,但相于"rw"模式,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。

"rwd"  : 同上,但相于"rw"模式,还要求对文件内容的每个更新都同步写入到底层存储设备。

范例:RandomAccessFile访问指定的中间部分数据

package com.chengxuyuanzhiliu;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile; public class RandomAccessFileTest {
public static void main(String[] args) throws FileNotFoundException, IOException {
try(RandomAccessFile raf = new RandomAccessFile("D:/Workspaces/Java/Eclipse/JavaIO/src/com/chengxuyuanzhiliu/RandomAccessFileTest.java", "r")){
//获取RandomAccessFile对象文件指针位置,初始位置0
System.out.println("RandomAccessFile对象文件指针初始位置:"+raf.getFilePointer());
//移动raf的文件记录指针的字节数
raf.seek(300);
byte[] bbuf = new byte[1024];
//用来保存实际读取的字节数
int hasRead = 0;
//使用循环来重复"取水"过程
while((hasRead = raf.read(bbuf)) > 0){
//取出"竹筒"中的水滴,将字节数组转换成字符串输入
System.out.println(new String(bbuf,0,hasRead));
}
}
}
}

运行结果:

范例:RandomAccessFile向指定文件追加内容

package com.chengxuyuanzhiliu;

import java.io.RandomAccessFile;

public class AppendContent {
public static void main(String[] args){
try(RandomAccessFile raf = new RandomAccessFile("D:/out.txt", "rw")){
//将记录指针移动到out.txt文件的最后
raf.seek(raf.length());
raf.write("\r\n追加的内容!".getBytes());
}catch (Exception e) {
e.printStackTrace();
}
}
}

运行结果:

范例:实现向指定文件、指定位置插入内容的功能

package com.chengxuyuanzhiliu;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile; public class InsertContent {
public static void insert(String fileName,long pos,String insertContent) throws IOException{
//创建一个临时文件来保存插入点后的数据
File tmp = File.createTempFile("tmp", null);
tmp.deleteOnExit();
try(
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
FileOutputStream tmpOut = new FileOutputStream(tmp);
FileInputStream tmpIn = new FileInputStream(tmp)
){
raf.seek(pos);
//----下面代码将插入点后的内容读入临时文件中保存----
byte[] bbuf = new byte[64];
//用于保存实际读取的字节数
int hasRead = 0;
//使用循环方式读取插入点后的数据
while((hasRead = raf.read(bbuf)) > 0){
tmpOut.write(bbuf, 0, hasRead);
} //----下面代码用于插入内容----
//把文件记录指针重新定位到pos位置
raf.seek(pos);
//追加需要插入的内容
raf.write(insertContent.getBytes());
//追加临时文件中的内容
while((hasRead = tmpIn.read(bbuf)) > 0){
raf.write(bbuf, 0, hasRead);
} }
} public static void main(String[] args) throws IOException {
insert("D:/Workspaces/Java/Eclipse/JavaIO/src/com/chengxuyuanzhiliu/InsertContent.java", 45, "插入的内容\r\n");
}
}

运行结果:

Java虚拟机访问读写其他进程的数据--RandomAccessFile的更多相关文章

  1. Java 输入/输出——Java虚拟机读写其它进程的数据

    使用 Runtime对象的exec()方法可以运行平台上的其它程序,该方法产生一个Process对象,Process对象代表由该Java程序启动的子进程.Process类提供了如下三个方法,用于让程序 ...

  2. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  3. Java虚拟机 - 结构原理与运行时数据区域

    http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关 ...

  4. 《深入理解Java虚拟机》学习笔记1-内存数据区域

         1.程序计数器 作用-较小的内存空间,用于存储当前线程所执行的字节码的行号 特性-每条线程有需要一个独立的程序计数器,各线程间互不影响,独立存储,称为"线程私有"的内存 ...

  5. 《深入理解Java虚拟机》笔记01 -- 运行时数据区

    运行时数据区示意图 1. 程序计数器 占用一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.主要用来记录线程执行到哪条语句了,分支.循环.跳转.异常处理.线程恢复等功能都需要依赖这个 ...

  6. Java虚拟机读写其他进程的数据--Process对象

    使用Runtime对象的exec()方法可以运行平台上的其他程序,该方法产生一个Process对象,Process对象代表由该Java程序启动的子进程. Process类提供了3个方法,用于让程序和其 ...

  7. learning java 读写其他进程的数据

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...

  8. Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统

    前言 我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的.那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了 一.HDFS中数据块概述 1.1.HDFS集群中数据块存放位置 我 ...

  9. Java虚拟机-对象的创建和访问

    一.对象的创建: 创建对象在java上面是很简单的,使用new关键字就可以了,但是其实在虚拟机中,java对象的创建是一个复杂的过程. 当java虚拟机遇到一个new的指令的时候,对象创建的程序正式启 ...

随机推荐

  1. Python面试题之Python生成器

    首先说明一下生成器也是迭代器,也有迭代器的那些优点. 那为什么要生成器呢?因为到目前为止都 不是你写的迭代器,都是别人定义好的.那如何自己去造一个迭代器呢?下面的内容就会给你答案. 想要自己造一个迭代 ...

  2. WCF使用安全证书验证消息加密

    首先安装 服务端安全证书  代码如下:  // 下面第一行是安装证书,第二行是将证书列入信任 makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=lo ...

  3. BZOJ3150: [Ctsc2013]猴子

    传送门 这题好神啊..好神啊.. 首先得到简单的DP方程: $f_{\{ i \}}=\frac{\sum_{i \ne j} f_ {\{ i,j \}} \times P_{(i,j)}}{N-1 ...

  4. Pycharm安装Python第三方库

    转自:http://blog.csdn.net/qiannianguji01/article/details/50397046 除了使用easy_insatll和pip工具安装Python第三方库外还 ...

  5. JavaScript 数据类型小结

    数据类型对于机器而言,其意义在于更加合理的分配内存空间,而对于编程者而言,数据类型提供了我们相对应的一系列方法,对数据进行分析与处理. 在本文中,将对JavaScript数据类型的基础知识进行总结,全 ...

  6. matlab练习程序(求灰度图像最大灰度,最小灰度,平均灰度)

    转自 http://www.cnblogs.com/tiandsp/archive/2012/01/07/2316006.html  感谢Dsp tian clearclc;img = imread( ...

  7. MySQL_解决ERROR 2006 (HY000) at line XX MySQL server has gone away问题

    参考:http://www.111cn.net/database/mysql/106911.htm 1.修改mysqld的配置文件my.cnf 调整max_allowed_packet的值,修改为5M ...

  8. bzoj 3545: [ONTAK2010]Peaks

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1124  Solved: 304[Submit][Status][Discuss] Descripti ...

  9. [BZOJ1044木棍分割]

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连 接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段 ...

  10. Centos7.5静默安装Oracle18c

    环境: CentOS7.5.Oracle18c(LINUX.X64_180000_db_home.zip) 1. 安装必要的依赖包 [root@bogon ~]# yum install bc bin ...