标签:
【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(); } }
* 从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(); } }
*将给定的字节数组中的所有字节一次性写出。
具体细节及补充内容见代码:
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(); } }
* 一次性尝试读取给定的字节数组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(); } }
* 获取当前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(); } }
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