您的位置:首页 > 编程语言 > Java开发

【JavaSE】day08_RandomAccessFile

2015-08-28 22:24 344 查看
【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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: