java.io.RandomAccessFile:专门用来读写文件数据的类,其读写是基于指针进行的,即RAF总是在指针指向位置读取或者写出字节。
RAF有两种常用的模式:
 * r:只读模式,只能读取文件数据,不可以做写操作。
 * rw:读写模式,即可读也可写。

1.写出数据(一个字节):void write(int d)

package raf;import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFileDemo {public static void main(String[] args) throws IOException {/** 对项目目录下的文件test.dat文件进行读写操作* * RandomAccessFile(String path, String mode)* RandomAccessFile(File file, String mode)*/RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");System.out.println("raf已创建!");/** void write(int d)* 该方法可以向文件中写入一个字节,写入的是* 给定的int值所对应的2进制的"低八位". *                            vvvvvvvv* 00000000 00000000 00000001 00000001*/raf.write(1);       System.out.println("写出完毕!");raf.close();}
}

2.读取数据(一个字节):int read()

package raf;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;/*** 从文件中读取一个字节* @author adminitartor*/
public class ReadDemo {public static void main(String[] args) throws IOException {RandomAccessFile raf = new RandomAccessFile("test.dat", "r");/** int read()* 从文件中读取1个字节,并以int形式返回。若返回* 值为-1,则表示文件读取到末尾了* 00000000 00000000 00000000 00000001*/int d = raf.read();System.out.println(d);d = raf.read();System.out.println(d);raf.close();}
}

3.demo——文件复制(随机读写方式)

package raf;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;/*** 文件复制操作* @author adminitartor*/
public class CopyDemo {public static void main(String[] args) throws IOException {/** 1:创建一个RAF用于读取原文件* 2:创建一个RAF用于写入复制文件* 3:循环从原文件读取每一个字节并写入到复制文件*   中完成copy工作*///1RandomAccessFile src= new RandomAccessFile("img.jpg", "r");//2RandomAccessFile desc= new RandomAccessFile("img_cp.jpg","rw");//3int d = -1;while((d = src.read())!=-1){desc.write(d);}System.out.println("复制完毕!");src.close();desc.close();}
}

4.demo——文件复制(块读写方式)

若想提高读写效率,可以通过提高每次实际读写的数据量减少实际读写次数来达到。
 * 单字节读写称为——随机读写方式
 * 一次读写一组字节称为——块读写方式

package raf;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class CopyDemo2 {public static void main(String[] args) throws IOException {//1RandomAccessFile src= new RandomAccessFile("movie.avi", "r");//2RandomAccessFile desc= new RandomAccessFile("movie_cp2.avi","rw");      /** RAF提供的块读写方法:* int read(byte[] data)* 一次性从文件中读取给定的数组长度的字节量,并* 存入到该数组中,返回值为实际读取到的字节量。* 若返回值为-1,表示本次没有读取到任何数据(实际* 是已经是文件末尾了)* * void write(byte[] data)* 一次性将给定的字节数组中所有字节写出* * void write(byte[] data,int index,int len)* 一次性将给定的字节数组中index处开始的连续* len个字节写出*/int len = -1;//表示每次实际读取到的字节量byte[] data = new byte[1024*10];//10klong start = System.currentTimeMillis();while((len = src.read(data))!=-1){desc.write(data,0,len);}long end = System.currentTimeMillis();System.out.println("复制完毕!耗时:"+(end-start)+"ms");src.close();desc.close();}
}

5.RAF基于指针的读写操作以及RAF读写基本类型数据的操作

package raf;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFileDemo2 {public static void main(String[] args) throws IOException {RandomAccessFile raf= new RandomAccessFile("raf.dat", "rw");/** 获取raf当前指针位置,RAF刚创建时是在文件最* 开始,对应的位置为0.*/long pos = raf.getFilePointer();System.out.println("pos:"+pos);/** 向文件中写入一个int最大值*                            vvvvvvvv* 01111111 11111111 11111111 11111111* * max>>>24* 00000000 00000000 00000000 01111111*/int max = Integer.MAX_VALUE;       raf.write(max>>>24);System.out.println("pos:"+raf.getFilePointer());raf.write(max>>>16);raf.write(max>>>8);raf.write(max);System.out.println("pos:"+raf.getFilePointer());/** void writeInt(int d)* 将给定的int值的4个字节一次性写入文件,等同* 上面的4次write操作*/raf.writeInt(max);System.out.println("pos:"+raf.getFilePointer());/** RAF提供了所有基本类型的写出操作*/raf.writeLong(123L);System.out.println("pos:"+raf.getFilePointer());raf.writeDouble(123.123);System.out.println("pos:"+raf.getFilePointer());System.out.println("写出完毕!");/** 操作指针* * void seek(long pos)* 将指针移动到指定位置* */raf.seek(0);System.out.println("pos:"+raf.getFilePointer());/** raf也提供了读取基本类型的相关方法*/int d = raf.readInt();System.out.println(d);//maxSystem.out.println("pos:"+raf.getFilePointer());//读取long//1将指针移动到long的第一个字节位置raf.seek(8);//2连续读取8个字节long l = raf.readLong();System.out.println(l);double dou = raf.readDouble();System.out.println(dou);//指针应当再次到达文件末尾System.out.println("pos:"+raf.getFilePointer());/** 当调用readInt这样的方法过程中发现读取到了文件* 末尾时,会抛出EOFException表示文件末尾。* EOF end of file*/
//      d = raf.readInt();
//      System.out.println(d);raf.close();}
}

6.读取字符串

package raf;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class ReadStringDemo {public static void main(String[] args) throws IOException {/** 将note.txt文件中的所有字符读取出来*/RandomAccessFile raf = new RandomAccessFile("note.txt", "r");       /** 若想读取一个字符,应当读取几个字节?* 不同的字符集,对应的文字占用的字节量是不同的* 英文是相同的,无论哪个字符集都是1字节,都用* 的asc编码的部分。但是对于中文而言则不然,* 在GBK编码中,每个中文字占用2字节,在utf-8中* 每个中文字占用3个字节。* 占用的这些字节对应的2进制不全是表达字符本身的* 数据,还含有算法(通过这个,得知应当读取几个* 字节表示一个文字)。*//** 创建一个与文件一样大的字节数组(若文件过大,* 不适合这样做)*/byte[] data = new byte[(int)raf.length()];//读取指定的字节量(这里等于将文件所有字节读入)raf.read(data);/** String的构造方法允许我们将指定的字节数组中* 所有的字节按照给定的字符集转换为一个字符串*/String string = new String(data,"UTF-8");System.out.println(string);raf.close();}
}

7.向文件中写出字符串

package raf;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;public class WriteStringDemo {public static void main(String[] args) throws IOException {RandomAccessFile raf= new RandomAccessFile("raf.txt", "rw");String line = "像一颗海草海草海草海草~";/** 将字符串首先根据给定的字符集转换为一组字节* 常见的支持中文的字符集有:* GBK,UTF-8*/byte[] data = line.getBytes("UTF-8");raf.write(data);raf.write("随风飘摇~".getBytes("UTF-8"));System.out.println("写出完毕!");raf.close();}
}

Java基础【08】常用API——RandomAccessFile相关API相关推荐

  1. Java包括jvm及API,Java基础(下)(JVM、API)

    Java基础(下) 第三部分:Java源程序的编辑 我们知道,计算机是不能直接理解源代码中的高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序. 翻译 ...

  2. Java基础复习-常用类

    Java基础复习-常用类 本文仅对学习过程中所缺java知识点的查缺补漏复习 String 代表字符串.Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现. St ...

  3. java算法题常用到的一些api,含面试题+答案

    一面(电话面+后期在线coding) ①你们为什么要使用mongdoDb?你们的这个系统中涉及到哪些表? ②hytrix 的实现原理是什么?隔离策略有哪些?你们使用的是哪一些?你们项目中哪些地方使用到 ...

  4. Java基础学习总结(165)——API 安全最佳实践

    虽然本质上 API 就是拿来用的,但即便某个 API 的使用者全是内部人员,它还是可能会出现安全问题.为了解决 API 安全问题,在本文我们收集了一系列 API 的最佳实践,希望你记住这些 Tips ...

  5. Java基础(08) 面向对象

    Java基础(八)-- 面向对象 ​ 面向对象(Object Oriented Programming, 简称OOP )是Java基础学习的重点,必须掌握每个细节,接下来对面向对象的学习主要围绕以下三 ...

  6. Java基础知识-------常用API(6)

    第1章Date 1.1Date类概述 类 Date 表示特定的瞬间,精确到毫秒. 继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日 ...

  7. 后端技术:Java程序员常用的11个API,你都知道吗?

    1.Scanner 类 一个可以解析基本类型和字符串的简单文本扫描器. package cn.wxuns;import java.util.Scanner;public class MyScanner ...

  8. 怎样查阅java的api文档_【java基础(十)】查阅API文档

    为什么要查询API文档 就好比学习汉字,学习英语,都免不了要查询字典.词典.因为包含东西太多,切不必每个都需要学习.记住,在需要用的时候可以快速查询即可. String类就包含50多个方法,且几乎所有 ...

  9. java基础知识——流式计算Stream API

    文章目录 一.基本概念 二.创建流 三.中间操作 3.1 filter 3.2 map 3.3 distinct 3.4 sorted 3.5 limit 3.6 skip 3.7 flatMap 四 ...

最新文章

  1. Python 简介day01
  2. iOS进阶之类扩展(Extension)(8)
  3. 方舟 game.ini 配置文件_方舟突然回归|这次居然是住院篇!
  4. python文件读写库_【8】python文件的读写方法
  5. Bootstrap4+MySQL前后端综合实训-Day06-PM【MD5加码-生成32位md5码、ResultData.java、分页查询用户数据、添加用户按钮的实现】
  6. rac下重做控制文件
  7. 不装oracle进行远程连接解决办法 .
  8. 数据结构——双向链表的实现
  9. 3 css 奖品出现弹出动画_基于jquery css3实现点击动画弹出表单源码特效
  10. oracle 误删表空间文件启动不了数据库的解决办法
  11. mac 黑窗口连接mysql_mac系统下mysql环境变量设置及远程连接
  12. python缩进块是什么_python中缩进是用来做什么的
  13. 数据库设计及案例分析
  14. scrapy实现爬取全书网小说到本地TXT文件
  15. 【院校信息】2021北京航空航天大学计算机考研数据汇总
  16. 利用uncode-schedule(冶卫军)构建分布式任务调度
  17. 【无标题】用ubuntu通过c语言实现俄罗斯方块小游戏的方案及改进思路
  18. 健康小贴士:喝酒时别点哪些菜_新闻中心_新浪网
  19. Django项目 | 使用MongoDB存储图片
  20. 基于STM32单片机的倒车雷达系统设计Proteus仿真程序

热门文章

  1. resultful使用
  2. 联合省选 2021 解题报告
  3. 在线直播源码评论弹幕是如何“练”成的?
  4. 微信小程序 - 基本原理
  5. 单片机作业1_为OLED制作汉字字库_第3部分
  6. wps英文参考文献怎么对齐_wps英文参考文献怎么对齐_【论文攻略】排版技巧——如何用 Word 编辑参考文献......
  7. Oracle分区表详解,分区表创建,分区表按日期划分
  8. c++并发编程(concurrency)----线程管理
  9. 大病众筹平台会成为下一个“网络诈骗”工具吗?
  10. 复杂多边形的三角剖分