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的指令的时候,对象创建的程序正式启 ...
随机推荐
- springboot访问jsp页面
1.新建springboot项目,选择以war包的方式package; image 2.勾选Web模块,DevTools可不选(用作热部署,不影响运行) image 3.创建完成后,项目结构如 ...
- MR案例:定制InputFormat
数据输入格式 InputFormat类用于描述MR作业的输入规范,主要功能:输入规范检查(比如输入文件目录的检查).对数据文件进行输入切分和从输入分块中将数据记录逐一读取出来.并转化为Map的输入键值 ...
- 设置CentOS7虚拟机使用静态IP上网
一.在VMware里,依次点击”编辑“ - ”虚拟网络编辑器“,如下图,我选择的是NAT模式: 为了能够使用静态IP,这里不要勾选”使用本地DHCP服务将IP分配给虚拟机“这个选项.然后是配置子网ip ...
- Ubuntu16.04怎么安装virtualenv虚拟环境
最近安装virtualenv的python虚拟环境,在网上找了很多,尝试了很多,都有各种问题,最终搞定后,给大家分享下我的过程,希望大家少走弯路. 本次安装是基于Ubuntu16.04Linux版本安 ...
- GDPR或使全球域名whois信息被隐藏
什么是GDPR? GDPR 全称为 General Data Protection Regulation,是欧盟 2016 年 4 月通过的一项通用数据保护条例(或称“一般数据保护法案”),是 199 ...
- sql 取前一年、月
SQL SERVER 提供了一些时间函数:取当前时间:SELECT GETDATE() 取前一个月的时间:SELECT DATEADD(MONTH,-1,GETDATE()) 月份减一个月取年份:SE ...
- 【cs231n】反向传播笔记
前言 首先声明,以下内容绝大部分转自知乎智能单元,他们将官方学习笔记进行了很专业的翻译,在此我会直接copy他们翻译的笔记,有些地方会用红字写自己的笔记,本文只是作为自己的学习笔记.本文内容官网链接: ...
- Python学习札记(十五) 高级特性1 切片
参考: 高级特性 切片 Note 1.掌握了Python的基础语法之后,就可以写出很多很有用的程序了,比如打印1-90的奇数: #!/usr/bin/env python3 L = [] n = 1 ...
- WPF圆角透明无边框窗体
<Window x:Class="ImportData.MainWindow" xmlns="http://schemas.microsoft.com/winfx/ ...
- R中的sub替换函数【转】
R中的grep.grepl.sub.gsub.regexpr.gregexpr等函数都使用正则表达式的规则进行匹配.默认是egrep的规则,也可以选用Perl语言的规则.在这里,我们以R中的sub函数 ...