Java IO学习--RandomAccessFile
1、什么是 随机访问文件流 RandomAccessFile
这个类在很多资料上翻译成中文都是:随机访问文件,在中文里,随机是具有不确定的含义,指一会访问这里,一会访问那里的意思。如果以这种语义来解释的话,就会感到很困惑。其实,Random在英文中不仅仅有随机,还有任意的意思。如果中文名为任意访问文件是不是就会更好的理解。任意表示我们可以指定文件中任何一个位置去操作一个文件。
RandomAccessFile适用于大小已知的文件,能够随机的读取或者写入文件。可以通过使用seek()将记录从一处转移到另外一处,然后读取或者修改记录。文件中记录的大小不一定相同,只要我们能确定记录的大小和它们在文件的位置即可。
2、RandowAccessFile存在的价值
1、是JAVA I/O流体系中功能最丰富的文件内容访问类,它提供了众多方法来访问文件内容。
2、由于可以自由访问文件的任意位置,所以如果需要访问文件的部分内容,RandomAccessFile将是更好的选择。
3、可以用来访问保存数据记录的文件,文件的记录的大小不必相同,但是其大小和位置必须是可知的。
3、RandomAccessFile的使用
public class RandomFileDemo {
public static void main(String[] args) {
try {
RandomAccessFile raf = new RandomAccessFile(new File("E:\\a.txt"), "rw");
long offset = raf.getFilePointer();//文件指针
long len= raf.length();//当前文件的字节大小
System.out.println("offset:"+offset+" len:"+len);
//raf.seek(len);//移动到文件末尾,可进行追加文件内容
System.out.println("offset:"+raf.getFilePointer()+" len:"+raf.length());
raf.write(65);//1字节
raf.writeChar(97);//2字节
raf.writeChar('\n');//2字节
raf.writeBytes("test");//4字节
System.out.println("offset:"+raf.getFilePointer()+" len:"+raf.length());
raf.seek(0);//移动文件指针到开始位置
int c = raf.read();
System.out.println(c+" "+(byte)c+" "+(char)c);//从指定位置开始读取一个字节
System.out.println(raf.readChar());//从文件指针(类似一个游标)位置开始读取一个字符(2个字节)
//再次回到文件的开始位置,读取一行
raf.seek(0);
System.out.print(Arrays.toString(raf.readLine().getBytes())+" ");
System.out.println("offset:"+raf.getFilePointer()+" len:"+raf.length());
raf.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果输出(a.txt是空文件):
offset:0 len:0
offset:0 len:0
offset:9 len:9
65 65 A
a
[65, 0, 97, 0] offset:5 len:9
4、进程控制和流
在java程序中执行其他操作系统的程序,并且控制这些程序的输入和输出。主要要是借助流来读取程序的输出。如下:
public class ProcessDemo {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec(new String[]{"cmd.exe","/C","dir"});
BufferedReader br =new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
BufferedReader br2 =new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line=null;
String line2=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
while((line2=br2.readLine())!=null){
System.out.println(line2);
}
br.close();
br2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果:
驱动器 F 中的卷没有标签。
卷的序列号是 3A48-2555 F:\NewStudyWorkSpace\coder_java 的目录 2018/03/19 19:31 <DIR> .
2018/03/19 19:31 <DIR> ..
2018/03/19 19:31 1,433 .classpath
2018/03/19 19:31 562 .project
2018/03/19 19:31 <DIR> .settings
2018/04/05 18:05 702 pom.xml
2018/03/19 19:31 <DIR> src
2018/03/19 19:31 <DIR> target
3 个文件 2,697 字节
5 个目录 341,102,870,528 可用字节
Java IO学习--RandomAccessFile的更多相关文章
- Java IO学习笔记三:MMAP与RandomAccessFile
作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...
- Java IO学习笔记:概念与原理
Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...
- Java IO学习笔记总结
Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- Java IO学习笔记一
Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...
- java IO 学习(三)
java IO 学习(一)给了java io 进行分类,这一章学习这些类的常用方法 一.File 1.创建一个新的File的实例: /** * 创建一个新的File实例 */ File f = new ...
- Java IO学习笔记一:为什么带Buffer的比不带Buffer的快
作者:Grey 原文地址:Java IO学习笔记一:为什么带Buffer的比不带Buffer的快 Java中为什么BufferedReader,BufferedWriter要比FileReader 和 ...
- Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer
作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...
随机推荐
- 11java基础继承
一. 继承相关 18.实现如下类之间的继承关系,并编写Music类来测试这些类. package com.hry.test; public class Instrument { ...
- EF6 AddOrUpdate之后,数据没有改变而是新增了一条数据解决办法
EF:修改不是查询出来的对象dbContext.Web_User.AddOrUpdate(user);dbContext.SaveChanges(); 上面的写法有时候可能不起作用,而且把这条数据重复 ...
- laravel5项目安装debugbar
链接:https://github.com/barryvdh/laravel-debugbar 1.项目目录运行 composer require barryvdh/laravel-debugbar ...
- Python基础—01-认识python,编写第一个程序
认识python 发展历史:点此查看简介 就业方向: WEB.爬虫.运维.数据分析.机器学习.人工智能.... 版本选择 python2.7是最后一个py2的版本,2020年将不再提供支持 pytho ...
- SpringBoot配置全局自定义异常
不同于传统集中时Springmvc 全局异常,具体查看前面的章节https://www.cnblogs.com/zwdx/p/8963311.html 对于springboot框架来讲,这里我就介绍一 ...
- grafana使用Prometheus数据源监控mongo数据库
数据库改用mongo后,监控需求就需要整合进grafana里,由于一直在坚持docker化部署,那么此次也不例外. 1. 安装Prometheus: What is Prometheus? Prome ...
- phpredis命令
<?php //redis //检查一个扩展是否已经加载.大小写不敏感. if (!function_exists('redis')) { echo '不支持 redis'; return ; ...
- python-time模块、sys模块、os模块以及大量实例
模块 通俗的说模块就把一个已经写好的带有可使用的函数的文件,通过文件名进行导入,然后调用里面的函数等来完成所需功能,模块封装了你需要实现功能的代码,使用者只需调用即可,简化代码量,缩短编程时间. ti ...
- dz论坛Discuz_X3.4最新网站漏洞
近期我们sinesafe安全部门审计discuz最新版的时候发现配置文件写入导致代码执行的问题.cms安装的时候一般会分为几个步骤去进行,其中有对配置文件config进行写入的步骤,当写入的时候未严格 ...
- 单片机C51 8位流水灯
#include<reg51.h> sbit P1_0=0X90; sbit P1_1=0x91; sbit P1_2=0x92; sbit P1_3=0x93; sbit P1_4=0x ...