欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA随机存储流(RandomAccessFile)的应用

程序员文章站 2022-07-12 12:36:37
...

   JAVA核心技术I 对RandomAccessFile有描述,所以才决定学习一下这个类的使用,不看不知道,原来这个类有点高大上..........;

     RandomAccessFile类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。

 

 

该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。

 

 

 

RandomAccessFile实现了数据输入输出流的接口;可以随机存储硬盘的文件,但是来自网络的文件就不行

 

 

 

    RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式("r"),还是以读写方式("rw")打开文件

 

 

 

1, 第一个疑问;随机存储流在读写文件时如何定位

 

代码如下;

 

 

package 随机存储流;

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

/**
 * 随机存储流的测试,随机存储流不会删除前面的,会在后面添加
 * 
 * @author Administrator
 * 
 */
public class DemoRandomIO {

	public static void main(String[] args) {

		try {
			//实例化随机存储流,不需要创建文件的路径
			RandomAccessFile Raf = new RandomAccessFile("file", "rw");
			//创建一个字符串数组并初始化
			String[] name = new String[3];
			name[0] = "JAVA";
			name[1] = "android";
			name[2] = "C++";
			//遍历数组
			for(int i = 0;i<name.length;i++){
				//使用随机流将数组写出去
				Raf.writeUTF(name[i]);	
			}
			
			//添加元素
			Raf.seek(Raf.length());
			Raf.writeUTF("SSH");
			
			//使用seek将Raf.length()执行数组的第一个
			Raf.seek(0);
			
			//遍历使用偏移量来遍历,每移动一下就打印出数据
			while(Raf.getFilePointer()<Raf.length()){
				System.out.println(Raf.readUTF());
			}
					
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

 

运行结果;

JAVA
android
C++

SSH

 

 

2,++++++++随机存储流实现文件的复制

 

package 随机存储流;

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

/**
 * 随机存储流的测试,
 * 
 * @author Administrator
 * 
 */
public class DemoRandomIO {

	public static void main(String[] args) {

		try {
			//实例化随机存储流,不需要创建文件的路径
			RandomAccessFile Raf = new RandomAccessFile("file", "rw");
			//创建一个字符串数组并初始化
			String[] name = new String[3];
			name[0] = "JAVA";
			name[1] = "android";
			name[2] = "C++";
			//遍历数组
			for(int i = 0;i<name.length;i++){
				//使用随机流将数组写出去
				Raf.writeUTF(name[i]);	
			}
			
			//添加元素
			Raf.seek(Raf.length());
			Raf.writeUTF("SSH");
			
			//使用seek将Raf.length()执行数组的第一个
			Raf.seek(0);
			
//			//遍历
//			while(Raf.getFilePointer()<Raf.length()){
//				System.out.println(Raf.readUTF());
//			}
			System.out.println(Raf.readUTF());
			System.out.println(Raf.readUTF());
			System.out.println(Raf.readUTF());
			
			//文件复制
			System.out.println("开始复制.......");
			Raf.seek(0);//将文件指向开始的地方
			//定义复制的文件
			RandomAccessFile fileCopy = new RandomAccessFile("fileCopy", "rw");
			//获取Raf文件长度
			int len  = (int)Raf.length();
			//根据文件的长度创建字节数组
			byte[] by = new byte[len];
			//将Raf的文件内容读到数组中
			Raf.readFully(by);
			//将写到InRaf文件中
			fileCopy.write(by);
			System.out.println("复制完毕.....");
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

 

 运行结果:

 

 

 

 JAVA
 android
 C++
SSH
开始复制.......
复制完毕.....

 

 

 

怎么知道filecopy文件是否已经真的全部复制Raf文件中的数据,遍历filecopy文件中的数据

 

 

 

                         fileCopy.seek(0);
			System.out.println("复制的;"+fileCopy.readUTF());
			System.out.println("复制的;"+fileCopy.readUTF());
			System.out.println("复制的;"+fileCopy.readUTF());
			

 运行结果;

复制的;JAVA
复制的;android
复制的;C++

 

 

3,+++++实现多线程同时下载,将文件内容分割成几小块下载,代码如下

 

package 随机存储流;
/**
 * 随机数据存储流多线程下载文件的简单实现,主窗口
 */
import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

public class DemoTest {
	public static void main(String[] args) {
		
		try {
			// 实例化随机存储流,创建文件的路径
			File file = new File("F:Raf.txt");
			RandomAccessFile Raf = new RandomAccessFile("file", "rw");
			//设置文件的大小
			Raf.setLength(22*3);
			Raf.close();
			// 创建一个字符串数组并初始化
			String[] name = new String[3];
			name[0] = "JAVA";
			name[1] = "android";
			name[2] = "C++";
			
			//使用多线程来下载
			for(int i = 0;i<name.length;i++){
				DemoTestThread th = new DemoTestThread(1024*i,name[i].getBytes());
				th.start();
			}
			System.out.println("下载完毕...");

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 

package 随机存储流;

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

/**
 * 创建线程
 * 
 * @author Administrator
 * 
 */
public class DemoTestThread extends Thread {
	// 创建线程需要文件大小和文件内容
	private int len;
	private byte[] con;
	private boolean islive = true;
    //创建构造方法
	public DemoTestThread(int len, byte[] con) {
		this.len = len;
		this.con = con;
	}

	@Override
	public void run() {
		while(islive){
		try {
			RandomAccessFile Raf = new RandomAccessFile("F:Raf.txt", "rw");
		     Raf.seek(len);
		     Raf.write(con);
		     Thread.sleep(50);
		} catch (Exception e) {
			islive =false;
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	}
}

 

 运行结果:

创建的文件


JAVA随机存储流(RandomAccessFile)的应用
            
    
    博客分类: JAVA 基础 IO流随机存储流多线程下载文件复制RandomAccessFile 
 

 文件中的内容
JAVA随机存储流(RandomAccessFile)的应用
            
    
    博客分类: JAVA 基础 IO流随机存储流多线程下载文件复制RandomAccessFile 
 

 

 

  • JAVA随机存储流(RandomAccessFile)的应用
            
    
    博客分类: JAVA 基础 IO流随机存储流多线程下载文件复制RandomAccessFile 
  • 大小: 30.4 KB
  • JAVA随机存储流(RandomAccessFile)的应用
            
    
    博客分类: JAVA 基础 IO流随机存储流多线程下载文件复制RandomAccessFile 
  • 大小: 44.4 KB