【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值的二进制形式中“低八位”
代码演示:
4)int read()
* 从raf当前指针位置读取该字节,若读取到了文件末尾会返回-1.
代码演示:
5)void write(byte[] data)
*将给定的字节数组中的所有字节一次性写出。
具体细节及补充内容见代码:
6)int read(byte[] data)
* 一次性尝试读取给定的字节数组data的长度的字节量,并将这些存到数组中。返回值为实际读取到的字节量,若返回值为-1,表示读取到了文件末尾(EOF end of file)。
具体细节见代码:
7)long getFilePointer()
* 获取当前RandomAccessFile的指针位置(指向文件的第几个字节)
* 刚创建出来的RAF默认指向文件第一个字节。下标从0开始。
代码演示:
8)复制文件Demo
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(); } }
相关文章推荐
- java jvm 不同的垃圾回收器的比较
- java对象与json对象间的相互转换
- JavaCore/HeapDump文件及其分析方法
- Java的File类相关知识
- Java格式化CST日期时间
- Java格式化CST日期时间
- Java格式化CST日期时间
- 【转载】注入安卓进程,并hook java世界的方法
- JSTL报错javax.el.PropertyNotFoundException
- eclipse import 工程出现错误怎么办
- 对象间的联动——观察者模式与Java事件处理(五)
- leetcode Palindrome Number java编程学习(三)
- spring MVC jsp页面EL表达式无效
- Java泛型中E、T、K、V等的含义
- 逻辑回归(LR)算法java实现
- Spring笔记④--spring整合hibernate链接数据库
- 使用myeclipse2014整合ss2h
- java实现多种方式求解最大公约数
- java基础(数组 排序)
- Java String.split()方法