Java虚拟机访问读写其他进程的数据--RandomAccessFile
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的更多相关文章
- Java 输入/输出——Java虚拟机读写其它进程的数据
使用 Runtime对象的exec()方法可以运行平台上的其它程序,该方法产生一个Process对象,Process对象代表由该Java程序启动的子进程.Process类提供了如下三个方法,用于让程序 ...
- [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义
前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine ,既然是虚拟机, ...
- Java虚拟机 - 结构原理与运行时数据区域
http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关 ...
- 《深入理解Java虚拟机》学习笔记1-内存数据区域
1.程序计数器 作用-较小的内存空间,用于存储当前线程所执行的字节码的行号 特性-每条线程有需要一个独立的程序计数器,各线程间互不影响,独立存储,称为"线程私有"的内存 ...
- 《深入理解Java虚拟机》笔记01 -- 运行时数据区
运行时数据区示意图 1. 程序计数器 占用一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.主要用来记录线程执行到哪条语句了,分支.循环.跳转.异常处理.线程恢复等功能都需要依赖这个 ...
- Java虚拟机读写其他进程的数据--Process对象
使用Runtime对象的exec()方法可以运行平台上的其他程序,该方法产生一个Process对象,Process对象代表由该Java程序启动的子进程. Process类提供了3个方法,用于让程序和其 ...
- learning java 读写其他进程的数据
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...
- Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
前言 我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的.那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了 一.HDFS中数据块概述 1.1.HDFS集群中数据块存放位置 我 ...
- Java虚拟机-对象的创建和访问
一.对象的创建: 创建对象在java上面是很简单的,使用new关键字就可以了,但是其实在虚拟机中,java对象的创建是一个复杂的过程. 当java虚拟机遇到一个new的指令的时候,对象创建的程序正式启 ...
随机推荐
- C++文件操作:打开文件和写入文件
如果程序的运行结果仅仅显示在屏幕上,当要再次查看结果时,必须将程序重新运行一遍:而且,这个结果也不能被保留. 如果希望程序的运行结果能够永久保留下来,供随时查阅或取用,则需要将其保存在文件中. 文件分 ...
- centos6.9 升级glibc(升级到 2.17版)
原系统centos6.9自带GLIBC_2.12,安装一些软体提示版本不对,决定升级. wget http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz tar ...
- CSS3 Gradients(渐变)
CSS3 Gradients(渐变) 一.简介 CSS3 渐变(gradients)可以让你在两个或多个指定的颜色之间显示平稳的过渡. 以前,你必须使用图像来实现这些效果.但是,通过使用 CSS3 渐 ...
- python 切换工作路径 为指定文件夹
切换工作路径为了更好的在目录下面执行针对当前项目的命令 比如 git.svn .打包 等操作 关键命令: os.chdir() 切换到指定路径: # sys.path[0] 当前脚本路径 # 当前脚本 ...
- 爬虫框架Scrapy之Settings
Settings Scrapy设置(settings)提供了定制Scrapy组件的方法.可以控制包括核心(core),插件(extension),pipeline及spider组件.比如 设置Json ...
- 同余定理简单应用 - poj2769 - hdu 1021 - hdu 2035
同余问题 基本定理: 若a,b,c,d是整数,m是正整数, a = b(mod m), c = d(mod m) a+c = b+c(mod m) ac = bc(mod m) ax+cy = bx+ ...
- codeforces 1A - math - ceil
2017-08-24 15:42:30 writer: pprp 感觉自己好菜啊,这个题都没有做的很好 题意很简单,用a * a 的地砖,将 n * m 的地板铺满,问最少需要多少个地砖? 一开始打算 ...
- nginx web服务器详解1(转)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://freeloda.blog.51cto.com/2033581/1285332 大 ...
- 09_MySQL DQL_SQL99标准中的多表查询(外连接)
# 二.外连接/* 场景:查询值在1个表中出现,在另外1个表中没有出现 特点: 0.也是两张表的字段拼接,分为主表和从表 1.外连接的结果,将显示主表中的所有记录行 如果连接字段在从表中有记录,则显示 ...
- jenkins+gradle打包android遇到的坑
1.gradle与gradlew的选择 配置project,我们选择gradle进行打包.会看到如下图配置项.然而很多网上教程中给出的选择是第一项.只能这么说,如果你是新建一个androidDemo, ...