码迷,mamicode.com
首页 > 数据库 > 详细

【JavaSE】day08_RandomAccessFile

时间:2015-08-28 23:22:58      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:

【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();
	}

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

【JavaSE】day08_RandomAccessFile

标签:

原文地址:http://blog.csdn.net/u011637069/article/details/48063577

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!