java-randomAccessFile

心之所向,素履以往,生如逆旅,一苇以航。

randomAccessFile介绍

  • RandomAccessFile父类是Object,没有继承字节流、字符流家族中任何一个类。并且它实现了DataInput、DataOutput这两个接口,它既可以读也可以写。
  • 以前接触的输入流和输出流都是从头部进行读文件或者写文件,不能从中间开始,如果是开多线程下载一个文件我们之前学过的FileWriter或者FileReader等等都无法完成,而当前介绍的RandomAccessFile他就可以解决这个问题,因为它可以指定位置读,指定位置写,通常开发过程中,多用于多线程下载一个大文件。

常用方法

构造方法
RandomAccessFile(File file, String mode) 
          创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。 
RandomAccessFile(String name, String mode) 
          创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。 
          
	mode 参数指定用以打开文件的访问模式。允许的值及其含意为: 
     "r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。  
     "rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。  
	"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。  
	"rwd" 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。  
          
普通方法概述
 long length() 
          返回此文件的长度。 
void seek(long pos) 
       设置读写的位置,pos指针偏移量
void setLength(long newLength) 
          设置此文件的长度。 newLength为0相当于清空文件
long getFilePointer() 
          返回此文件中的当前偏移量。 

   read和write方法 和字节流,字符流的一致
   
  int read() 
          从此文件中读取一个数据字节。 
 int read(byte[] b) 
          将最多 b.length 个数据字节从此文件读入 byte 数组。 
 int read(byte[] b, int off, int len) 
          将最多 len 个数据字节从此文件读入 byte 数组。 
 int read() 
          从此文件中读取一个数据字节。 
 int read(byte[] b) 
          将最多 b.length 个数据字节从此文件读入 byte 数组。 
 int read(byte[] b, int off, int len) 
          将最多 len 个数据字节从此文件读入 byte 数组。 
 boolean readBoolean() 
          从此文件读取一个 boolean。 
 byte readByte() 
          从此文件读取一个有符号的八位值。 
 char readChar() 
          从此文件读取一个字符。 
 double readDouble() 
          从此文件读取一个 double。 
 float readFloat() 
          从此文件读取一个 float。 
 void readFully(byte[] b) 
          将 b.length 个字节从此文件读入 byte 数组,并从当前文件指针开始。 
 void readFully(byte[] b, int off, int len) 
          将正好 len 个字节从此文件读入 byte 数组,并从当前文件指针开始。 
 int readInt() 
          从此文件读取一个有符号的 32 位整数。 
 String readLine() 
          从此文件读取文本的下一行。 
 long readLong() 
          从此文件读取一个有符号的 64 位整数。 
 short readShort() 
          从此文件读取一个有符号的 16 位数。 
 int readUnsignedByte() 
          从此文件读取一个无符号的八位数。 
 int readUnsignedShort() 
          从此文件读取一个无符号的 16 位数。 
 String readUTF() 
          从此文件读取一个字符串。 
 void seek(long pos) 
          设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。 
 void setLength(long newLength) 
          设置此文件的长度。 
 int skipBytes(int n) 
          尝试跳过输入的 n 个字节以丢弃跳过的字节。 
 void write(byte[] b) 
          将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。 
 void write(byte[] b, int off, int len) 
          将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。 
 void write(int b) 
          向此文件写入指定的字节。 
 void writeBoolean(boolean v) 
          按单字节值将 boolean 写入该文件。 
 void writeByte(int v) 
          按单字节值将 byte 写入该文件。 
 void writeBytes(String s) 
          按字节序列将该字符串写入该文件。 
 void writeChar(int v) 
          按双字节值将 char 写入该文件,先写高字节。 
 void writeChars(String s) 
          按字符序列将一个字符串写入该文件。 
 void writeDouble(double v) 
          使用 Double 类中的 doubleToLongBits 方法将双精度参数转换为一个 long,然后按八字节数量将该 long 值写入该文件,先定高字节。 
 void writeFloat(float v) 
          使用 Float 类中的 floatToIntBits 方法将浮点参数转换为一个 int,然后按四字节数量将该 int 值写入该文件,先写高字节。 
 void writeInt(int v) 
          按四个字节将 int 写入该文件,先写高字节。 
 void writeLong(long v) 
          按八个字节将 long 写入该文件,先写高字节。 
 void writeShort(int v) 
          按两个字节将 short 写入该文件,先写高字节。 
 void writeUTF(String str) 
          使用 modified UTF-8 编码以与机器无关的方式将一个字符串写入该文件。 

案例
讲一个文件中的内容分块读出,并写入到另一个文件中

package RandomAccessFileDemo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;

import org.omg.CORBA.PRIVATE_MEMBER;

public class randomAccessFileDemo {
    private static String readFilePath = "C:/Users/asus-pc/Desktop/1.mp4";
    private static String writeFilePath = "C:/Users/asus-pc/Desktop/javaProject/Demo/src/RandomAccessFileDemo/1.mp4";
    static int loadNum = 0;
	static int bufferSize = 10240;
	static long   totalSize = 0;
	public static void main(String[] args) {
	   
		//jdk7之后 放在try后面的(),可以自动关闭流的资源。
	try(
			//读文件
			 RandomAccessFile	rFile    =new RandomAccessFile(readFilePath, "r");
			//写文件
			RandomAccessFile wFile  = new RandomAccessFile(writeFilePath, "rw");
			
			) {
	
		
		totalSize = rFile.length();
		
		while(totalSize>loadNum){
			byte bytes[]=new byte[bufferSize];
			//读取10240个字节到内存中,read读完之后,自动更改了当前指针位置
			int readSize = rFile.read(bytes);
			System.out.println("当前指针位置"+rFile.getFilePointer());
			if(readSize==0)
				break;
			else{
				loadNum+=readSize;
				wFile.write(bytes);
				System.out.println("当前进度:"+(loadNum*1.0/totalSize*100)+"%");
			}
			
		}
	
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
	
	}
}

猜你喜欢

转载自blog.csdn.net/kuangpeng1956/article/details/83818782
今日推荐