在之前的文章我们已经可以对本地对文件和目录进行新建和删除等操作,接下来我们来对文件内对具体内容进行操作。

如下代码,我们实现了一个基本的文件写入:

1 /**

2 * java.io.RandomAccessFile3 * 用来读写文件数据4 * RAF是基于指针进行读写的,即RAF总是在指针指向的位置读写字节,5 * 并且读写后指针会自动向后移动6 * RAF既可以读取文件数据也可以向文件中写入数据7 *8 *@authorwjt9 */

10 public classRandomAccessFileDemo1 {11 public static void main(String[] args) throwsIOException {12 /**

13 * RandomAccessFile(String path, String mode)14 * RandomAccessFile(File file, String mode)15 * 第二个参数为模式:常用对有 r:只读模式 rw:读写模式16 */

17 RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");18 /**

19 * void write(int d)20 * 写出给定的int值对应的2进制的低八位21 * 00000000 00000000 00000000 0000000122 */

23 raf.write(1); //00000001

24 System.out.println("写出完毕!");25 raf.close();26

27 }28 }

在上面的代码中我们可以看出文件的读写想要到 RandomAccessFile,这里需要注意的是要抛出异常,否则编译器会报错,同时我们用到了它的一个 write() 方法来进行文件写入,接收的是一个2进制的低八位数值,假如我们写入 raf.write(97),那么就会被准化为小写字母 a。

既然能读,那就能写,接下来我们将上面写入的 1 再读取出来

1 /**

2 * 读取文件数据3 *4 *@authorwjt5 */

6 public classRandomAccessFileDemo2 {7 public static void main(String[] args) throwsIOException {8 RandomAccessFile raf = new RandomAccessFile("raf.txt", "r");9 /**

10 * int read()11 * 读取一个字节,并以10进制的int型返回12 * 若返回值为-1,则表示读取到了文件的末尾13 */

14 int d =raf.read();15 System.out.println(d); //1

16 raf.close();17 }18 }

接下来我们再来看一下如何对文件进行复制

1 /**

2 * 复制文件3 *4 *@authorwjt5 */

6 public classRandomAccessFileDemo3 {7 public static void main(String[] args) throwsIOException {8 /**

9 * 创建一个RAF读取原文件,10 * 再创建一个RAF向目标文件中写出,11 * 顺序从原文件中读取每一个字节并12 * 写入到目标文件中即可13 */

14 //原文件,在原文件中随便写一些内容

15 RandomAccessFile src = new RandomAccessFile("raf.txt", "r");16 //目标文件

17 RandomAccessFile desc = new RandomAccessFile("raf1.txt", "rw");18 //用来保存读取到每个字节

19 int d = -1;20 long start =System.currentTimeMillis();21 while ((d = src.read()) != -1) {22 desc.write(d);23 }24 long end =System.currentTimeMillis();25 System.out.println("复制完毕!耗时:" + (end - start) + "ms"); //复制完毕!耗时:2ms

26 }27 }

通过上面的代码我们可以实现文件的复制,但是这样复制是比较耗时的,不如在电脑上直接复制粘贴来的快。因为这是一个从硬盘读取到内存中再写到硬盘的过程,频繁的一个字节一个字节的读取频繁地调用这个过程,所以会很慢。

如果我们不是一个字节一个字节读写,而是一组一组的读写就会提升效率,如下:

1 /**

2 * 若向提高读写效率,3 * 可以通过提高每次读写的数据量来减少读写次数达到4 *5 *@authorwjt6 */

7 public classRandomAccessFileDemo4 {8 public static void main(String[] args) throwsIOException {9 RandomAccessFile src = new RandomAccessFile("raf.txt", "r");10 RandomAccessFile desc = new RandomAccessFile("raf1.txt", "rw");11 /**

12 * int read(byte[] data)13 * 一次性尝试读取给定的字节数组总长度的字节量并存入到该数组中,14 * 返回值为实际读取到的字节量,15 * 若返回值为-1,则表示本次没有读取到任何数据(文件末尾)16 */

17 //10K

18 byte[] buf = new byte[1024 * 10];19 //用来保存读取到每个字节

20 int len = -1;21 long start =System.currentTimeMillis();22 while ((len = src.read(buf)) != -1) {23 /**

24 * void write(buf)25 * 一次性将给定的字节数组中的所有数据写入26 * void write(byte[] d, int start, int end)27 * 将所给定数组中从小表start处开始的len个字节一次性写出28 */

29 desc.write(buf, 0, len);30 }31 long end =System.currentTimeMillis();32 System.out.println("复制完毕!耗时:" + (end - start) + "ms"); //复制完毕!耗时:1ms

33 }34 }

在上面的代码中,我们定义了一个 byte 数组来每次读写 10K 的方式进行批量复制,会发现时间变短了,需要注意的是 write() 方法需要使用重载的方法,因为最后一次可能会写入多余的数组len。

我们知道 write() 方法其实写入的是数据的低八位,那我们想要写入不同的数据类型该怎么写呢?如下代码:

1 /**

2 * RAF还提供了方便读写基本类型数据的方法3 *4 *@authorwjt5 */

6 public classRandomAccessFileDemo5 {7 public static void main(String[] args) throwsIOException {8 RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");9 /**

10 * 向文件中写入一个int最大值11 * Integer.MAX_VALUE 的二进制位12 * 011111111 11111111 11111111 1111111113 * 文件写入为二进制的低八位,如果我们直接写入的话14 * 其实写入的是低八位的 11111111,显然是错误的15 * 我们可以通过位移的方式连续写四次来进行写入操作16 */

17 int max =Integer.MAX_VALUE;18

19 raf.write(max >>> 24); //01111111

20 raf.write(max >>> 16); //11111111

21 raf.write(max >>> 8); //11111111

22 raf.write(max); //1111111123

24 //RAF 其实提供了更方便的方法来进行不同类型数据的写入

25 raf.writeInt(max);26 raf.writeDouble(11.11);27 raf.writeLong(1234L);28 raf.close();29 }30 }

从上面的代码中我们可以通过位移的方式按顺序每次写入一个int值的八位,写四次正好是一个int值的四个字节,当然我们我们也可以用提供好的 writeInt() 方法来直接写入,其底层代码远离其实也是用到了位移的思想,如下源码:

java开发13寸_Java 从入门到进阶之路(二十九)相关推荐

  1. SpringBoot从入门到精通教程(二十九)- 微信企业支付集成(五分钟集成)

    需求背景 SpringBoot用法:微信企业支付集成(五分钟集成) 问题痛点 通过SpringBoot框架,集成服务端微信企业支付接口,做到下载即用(填写好相关微信支付后台相关Key信息),最快五分钟 ...

  2. java定义接口区分飞机和汽车_JAVA菜鸟入门篇 - 抽象类、接口 (十九)

    一.抽象类 抽象类(abstract class):使用了abstract关键字所修饰的类叫做抽象类. 为什么需要抽象类?如何定义抽象类? 是一种模板模式.抽象类为所有子类提供一个通用模板,子类可以再 ...

  3. Vue 从入门到进阶之路(十四)

    之前的文章我们对 vue 的基础用法已经有了很直观的认识,本章我们来看一下 vue 中的生命周期函数. 上图为 Vue官方为我们提供的完整的生命周期函数的流程图,下面的案例我们只是走了部分情况流程,但 ...

  4. Bootstrap入门(二十九)JS插件6:弹出框

    Bootstrap入门(二十九)JS插件6:弹出框 加入小覆盖的内容,像在iPad上,用于存放非主要信息 弹出框是依赖于工具提示插件的,那它也和工具提示是一样的,是需要初始化才能够使用的 首先我们引入 ...

  5. SAP UI5 应用开发教程之二十九 - SAP UI5 的路由和导航功能介绍试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  6. 【零基础学Java】—final关键字与四种用法(二十九)

    [零基础学Java]-final关键字与四种用法(二十九) 一.final关键字 final关键字代表最终.不可改变的 常见的四种用法: 可以用来修饰一个类 可以用来修饰一个方法 可以用来修饰一个局部 ...

  7. java开发程序员_Java大牛给入门Java开发程序员的10个学习建议

    Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其底层实现原理. 纸上得来终觉浅,绝知此事要躬行. 学习Java基础的时候,应 ...

  8. java开发电脑软件_JAVA开发程序员,开发使用笔记本推荐?

    同 java 路过. 买笔记本,我们可以从以下几点来选购参考. "硬参数"CPU 内存 硬盘 显卡 "软参数"屏幕 重量 散热 那依次来按照顺序来介绍下. &q ...

  9. java object转泛型_JAVA快速入门——基本结构、基本数据类型

    Java程序基本结构 一个完整的Java程序基本结构: 下面我们来一点点解剖上面代码的含义: class是关键字,这里定义的class名字就是HelloWorld: 类名必须以英文字母开头,后接字母, ...

最新文章

  1. 1. CVPR2021-Papers-with-Code-Demo(CVPR2021论文下载)
  2. 我在不炎熱也不抑鬱的秋天,依然不抽煙
  3. centos mysql stop_[MySQL] 在Centos下的启动和关闭 | 学步园
  4. mac linux工具下载,xshell mac版
  5. dnf剑魂buff等级上限_DNF:传说BUFF换装副本周一更新次数,胜-深渊之麟掉价至1600W...
  6. php使用openssl进行Rsa长数据加密,解密保存问题
  7. 游戏建模成熟期:在这个阶段,技术已经比较成熟了,可以独挡一面
  8. nndl学习笔记(二)反向传播公式推导与详解
  9. pythonpil安装教程_Python 3.6 -win64环境安装PIL模块的教程
  10. 抗衰老,吃这些食物越来越年轻
  11. HDU 4849 Wow! Such City!陕西邀请赛C(最短路)
  12. 演化博弈matlab代码,Matlab演化博弈仿真
  13. 电脑出现无法访问您试图使用的功能所在的网络位置问题的解决方式
  14. 米勒-拉宾质数判断证明
  15. mysql MERGE 错误(differently defined or of non-MyISAM type)
  16. 【工具篇】maven指令大全
  17. 烟沙浮生 | 曾几何时,还是游吟长安的醉客 1
  18. 大厂程序员裸辞,全职接单一个月的感触!
  19. VS2008(2010)开发C++
  20. 统计学(第七版)第二章 数据的收集

热门文章

  1. nginx之lua_shared_dict
  2. unity创建项目报错:解决sentinel key not found (h0007) Unity
  3. 区块链技术的发展现状_区块链的现状及其发展趋势
  4. 公有云 私有云 混合云_混合云不断变化的面貌
  5. opensource项目_最佳Opensource.com:艺术与设计
  6. (44)css面试题集锦一
  7. JS节点树的一个实例
  8. ES6规格之数组的空位
  9. 服务器测试文档,服务器测试流程-20210321064941.docx-原创力文档
  10. oracle不同环境数据迁移,生产环境下,oracle不同用户间的数据迁移。第一部分