博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JavaSE】day08_RandomAccessFile
阅读量:4305 次
发布时间:2019-05-27

本文共 5605 字,大约阅读时间需要 18 分钟。

【JavaSE】day08_RandomAccessFile

1)java.io.RandomAccessFile

 * 该类用于读写文件数据。

 * 创建该类有两种模式:

 * 1:只读(r),对文件仅进行读取操作

 * 2:读写(rw),对文件数据读写

2)常用构造方法:

 * RandomAccessFile(File file,String mode)

 * RandomAccessFile(String path,String mode)

3)void write(int i)

         * 该方法向文件中写出一个字节,即8位的二进制

         * 写的是该int值的二进制形式中“低八位”

代码演示:

package day01;import java.io.IOException;import java.io.RandomAccessFile;/** * java.io.RandomAccessFile * 该类用于读写文件数据。 * 创建该类有两种模式: * 1:只读,对文件仅进行读取操作 * 2:读写,对文件数据读写  * * 常用构造方法: * RandomAccessFile(File file,String mode) * RandomAccessFile(String path,String mode) */public class RandomAccessFileDemo1 {	public static void main(String[] args) throws IOException {		/*		 * 对当前项目根目录下的文件test.dat文件进行操作		 */		RandomAccessFile raf = new RandomAccessFile("test.dat","rw");				/*		 * void write(int i)		 * 该方法向文件中写出一个字节,即8位的二进制		 * 写的是该int值的二进制形式中“低八位”		 */		raf.write(-1);				raf.close();					}}
4)int read()

         * 从raf当前指针位置读取该字节,若读取到了文件末尾会返回-1.

代码演示:

package day01;import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile;/** * 读取一个字节 * */public class RandomAccessFileDemo2 {	public static void main(String[] args) throws IOException {		/*		 * 读取test.dat文件中的第一个字节		 */		RandomAccessFile raf = new RandomAccessFile("test.dat","r");				/*		 * int read()		 * 从raf当前指针位置读取该字节,若读取到了文件末尾会返回-1.		 */		int a = raf.read();		System.out.println(a);				raf.close();	}}
5)void write(byte[] data)

 *将给定的字节数组中的所有字节一次性写出。

具体细节及补充内容见代码:

package day02;import java.io.IOException;import java.io.RandomAccessFile;import java.util.Arrays;/** * 批量读写数据 * *void write(byte[] data) *将给定的字节数组中的所有字节一次性写出。 */public class RandomAccessFileDemo1 {	public static void main(String[] args) throws IOException {		RandomAccessFile raf = new RandomAccessFile("demo.txt","rw");				String str = "摩擦摩擦,是魔鬼的步伐.";				/*		 * 将字符串按照当前系统默认的字符集转换为一组字节。		 * 字符串提供了一个方法:		 * byte getBytes()		 * 		 * 常见字符集:		 * GBK:国标编码,中文2字节,英文1字节		 * UTF-8:俗称万国码,中文3个字节,英文1个字节		 *         该编码集中1-4个字节构成不同国家语言的文字		 * ISO8859-1:一个欧洲常用字符集,不支持中文。		 * 		 * String提供了一个重载的getBytes()方法,允许		 * 根据给定的字符集将当前字符串转换为对应的字节。		 * byte[] getBytes(String charsetName)		 * 		 */		byte[] data = str.getBytes("GBK");		//byte[] data = str.getBytes();		System.out.println(Arrays.toString(data));				//将给定的字节数组中的所有字节一次性写入文件。		raf.write(data);		//raf.write(-26);				raf.close();	}}
6)int read(byte[] data)

         * 一次性尝试读取给定的字节数组data的长度的字节量,并将这些存到数组中。返回值为实际读取到的字节量,若返回值为-1,表示读取到了文件末尾(EOF end of file)。

具体细节见代码:

package day02;import java.io.IOException;import java.io.RandomAccessFile;/** * 批量读取字节 * */public class RandomAccessFileDemo2 {	public static void main(String[] args) throws IOException {		RandomAccessFile raf = new RandomAccessFile("demo.txt","rw");				/*		 * int read(byte[] data)		 * 一次性尝试读取给定的字节数组data的长度的字节量,并将这些		 * 存到数组中。返回值为实际读取到的字节量,若返回值为-1,表示		 * 读取到了文件末尾(EOF end of file)		 */		byte[] data = new byte[50];				int len = raf.read(data);		System.out.println("实际读取了:"+len+"个字节");				/*		 * String提供了一个构造方法,允许我们将给定的		 * 字节数组中的字节转换为对应的字符串。		 * 		 * String(byte[] data)		 * 按照当前系统默认字符集将字节数组中所有字节转换为字符串。		 * 		 * String(byte[] data,int start,int len)		 * 将当前字节数组中从start处开始的字节,连续取len个,		 * 然后将他们按照当前系统默认的字符集转换为字符串。		 * 		 * String(byte[] data,int start,int len,String charsetName)		 * 将字节数组中部分内容按照给定的字符集转换为对应的字符串。		 */		String str = new String(data,0,len,"GBK");		System.out.println(str);				raf.close();			}}
7)long getFilePointer()

         * 获取当前RandomAccessFile的指针位置(指向文件的第几个字节)

         * 刚创建出来的RAF默认指向文件第一个字节。下标从0开始。

代码演示:

package day02;import java.io.IOException;import java.io.RandomAccessFile;/** * RandomAccessFile总是基于指针当前位置进行读或写操作的。 * 并且每当读或写完当前字节后,指针会自动向后移动。 * * */public class RandomAccessFileDemo3 {	public static void main(String[] args) throws IOException {		RandomAccessFile raf = new RandomAccessFile("raf.dat","rw");				/*		 * long getFilePointer()		 * 获取当前RandomAccessFile的指针位置		 * (指向文件的第几个字节)		 * 刚创建出来的RAF默认指向文件第一个字节。		 * 下标从0开始。		 */		long pos = raf.getFilePointer();		System.out.println(pos); //0				//写入一个字节		raf.write(1);		pos = raf.getFilePointer();		System.out.println(pos); //1				//写一个int最大值		//01111111 11111111 11111111 11111111		int max = Integer.MAX_VALUE;		raf.write(max>>>24);		raf.write(max>>>16);		raf.write(max>>>8);		raf.write(max);				pos = raf.getFilePointer();		System.out.println(pos); //5				/*		 * void writeInt(int i)		 * 连续写出4个字节,将给定的int值完整写出。		 * 写出其他类型数据的方法也有。		 */		raf.writeInt(Integer.MAX_VALUE); //4个字节				raf.writeLong(123L); //8个字节				raf.writeDouble(123.123); //8个字节,float-4个字节				pos = raf.getFilePointer();		System.out.println(pos); //25				/*		 * 读取上面写入的long值,需要先将指针移动到		 * long值的第一个字节处,然后连续读出8个字节		 * 将其读取回来。		 * 		 * void seek(long pos)		 * 该方法可以将指针移动到指定位置.		 */		raf.seek(9);				/*		 * long readLong()		 * 从指针当前位置处开始,连续读取8个字节		 * 并转换为long值返回。		 */		long num = raf.readLong();		System.out.println("num:"+num); //num:123				pos = raf.getFilePointer();		System.out.println(pos); //17						raf.close();	}}
8)复制文件Demo

package day02;import java.io.IOException;import java.io.RandomAccessFile;/** * 若想提高读写效率我们需要提高每次读写的数据量 * 从而减少读写硬件的次数来提高。 * */public class CopyDemo1 {	public static void main(String[] args) throws IOException {		RandomAccessFile src = new RandomAccessFile("img.jpg","r");		RandomAccessFile desc = new RandomAccessFile("img_c.jpg","rw");				int len = -1;//每次读取到的实际字节量				byte[] buf = new byte[1024*10];//10kb比较合理				long start = System.currentTimeMillis();		while((len=src.read(buf))!=-1){			//desc.write(buf); //这样写可能会出现很多垃圾数据			/*			 * 将给定的字节数组中从0开始连续len个字节写出。			 */			desc.write(buf,0,len);		}		long end = System.currentTimeMillis();		System.out.println((end-start)+"ms");				src.close();		desc.close();	}}

转载地址:http://arews.baihongyu.com/

你可能感兴趣的文章
文件拷贝(IFileOperation::CopyItem)
查看>>
MapReduce的 Speculative Execution机制
查看>>
大数据学习之路------借助HDP SANDBOX开始学习
查看>>
Hadoop基础学习:基于Hortonworks HDP
查看>>
为什么linux安装程序 都要放到/usr/local目录下
查看>>
Hive安装前扫盲之Derby和Metastore
查看>>
永久修改PATH环境变量的几种办法
查看>>
大数据学习之HDP SANDBOX开始学习
查看>>
Hive Beeline使用
查看>>
Centos6安装图形界面(hdp不需要,hdp直接从github上下载数据即可)
查看>>
CentOS7 中把yum源更换成163源
查看>>
关于yum Error: Cannot retrieve repository metadata (repomd.xml) for repository:xxxxxx.
查看>>
linux下载github中的文件
查看>>
HDP Sandbox里面git clone不了数据(HTTP request failed)【目前还没解决,所以hive的练习先暂时搁置了】
查看>>
动态分区最佳实践(一定要注意实践场景)
查看>>
HIVE—索引、分区和分桶的区别
查看>>
Hive进阶总结(听课总结)
查看>>
大数据领域两大最主流集群管理工具Ambari和Cloudera Manger
查看>>
Sqoop往Hive导入数据实战
查看>>
Mysql到HBase的迁移
查看>>