`
百合不是茶
  • 浏览: 354757 次
社区版块
存档分类
最新评论

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

阅读更多

   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();
		}
	}
	}
}

 

 运行结果:

创建的文件



 

 文件中的内容

 

 

 

  • 大小: 30.4 KB
  • 大小: 44.4 KB
0
0
分享到:
评论

相关推荐

    Java中IO流 RandomAccessFile类实例详解

    Java中IO流 RandomAccessFile类实例详解 Java中的IO流 RandomAccessFile类实例详解是Java中IO流的重要组成部分。RandomAccessFile类提供了对文件内容的访问,既可以读文件,也可以写文件。同时,RandomAccessFile类...

    Java随机文件存储杂货店问题

    在“Java随机文件存储杂货店问题”中,我们面临的是一个典型的文件系统应用,它需要管理和操作一个商品库存的数据。下面将详细阐述这个场景中涉及的Java编程知识点。 首先,我们需要创建一个数据结构来表示商品。每...

    java的RandomAccessFile对文件进行读写操作

    Java中的`RandomAccessFile`类是用于处理文件的高级接口,它允许我们对文件进行随机访问,即在文件的任何位置进行读写操作,而不仅仅是从文件头开始顺序读写。这种能力使得`RandomAccessFile`在处理大文件或者需要...

    java第十三章Java 输入输出流.rar

    理解并熟练运用这些Java输入输出流的知识点,对于开发涉及数据交换的Java应用至关重要,无论是处理本地文件、内存数据还是网络通信,都能游刃有余。在实际开发中,我们通常会根据需求选择合适的流类型,并通过组合...

    Java随机文件读写操作探讨.pdf

    【Java随机文件读写操作探讨】 Java编程语言在处理文件时提供了多种操作方式,包括文本文件、二进制文件和随机文件。本文主要关注的是Java中的随机文件读写操作,这是通过`java.io.RandomAccessFile`类实现的。随机...

    Java的io的应用

    RandomAccessFile类提供了对文件进行随机读写的能力,可以定位到文件的任意位置进行读写操作。 10. **字符编码**: Java中的流默认使用平台默认的字符编码,但可以通过指定编码(如UTF-8)来处理不同语言的字符。...

    java文件流操作[定义].pdf

    在软件开发中,熟练掌握文件流操作是至关重要的,因为它涉及到了数据的持久化存储和文件的交互,是任何应用程序的基础部分。了解并灵活运用这些知识,可以帮助开发者创建高效、可靠的文件处理功能。

    java的IO流操作

    ### Java的IO流操作 #### 一、Java IO流概述 在Java中,输入/输出(Input/Output,简称IO)流是进行数据读写的基础技术。Java的IO流主要包含两大类:字节流(byte stream)和字符流(character stream)。字节流...

    JAVA IO流小结

    JAVA IO流小结 JAVA IO流是指Java语言中用来实现输入/输出操作的机制。IO流是指任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象。他屏蔽了实际的I/O设备处理数据的细节。 一、流的定义和分类 流是...

    Java使用RandomAccessFile类对文件进行读写

    Java中的`RandomAccessFile`类是一个强大的文件操作工具,它允许程序员以随机访问模式读取和写入文件。与标准的`FileInputStream`和`FileOutputStream`不同,`RandomAccessFile`不仅支持顺序读写,还能直接跳转到...

    体会RandomAccessFile

    `RandomAccessFile`是Java中的一个类,位于`java.io`包中,它提供了对文件进行读写的能力,并且可以随机地定位到文件中的任何位置进行数据的读取或写入,这使得在处理大型文件时更为灵活高效。与`FileInputStream`和...

    dnzyz.rar_RandomAccessFile_java 文件管理_文件操作

    `RandomAccessFile`是Java.io包中的一个核心类,它结合了输入流和输出流的功能,允许我们以字节或字符为单位对文件进行随机读写。它不遵循传统的流式模型,即数据只能从源到目的地单向流动,而是可以在文件的任意...

    java输入输出流和反射

    对于随机访问文件,Java提供了RandomAccessFile类,允许在文件中任意位置进行读写操作,这在处理大型文件或需要定位特定数据时非常有用。 Java的序列化机制允许将对象转换为字节流并保存到文件中,或者从文件中恢复...

    了解Java:RandomAccess

    在Java中,RandomAccess主要用于标记那些支持高效随机读取的输入流。这意味着,对于实现了RandomAccess接口的输入流,我们可以直接跳转到流中的任意位置进行读取,而无需从头开始逐个字节地移动。 描述中的链接指向...

    马士兵老师的java io流课程

    6. **对象序列化**:通过实现Serializable接口,可以将Java对象转换为字节流进行存储或网络传输。 7. **文件操作**:包括文件的创建、读写、追加和删除,以及文件流的使用。 8. **管道流**:PipedInputStream和...

    java_I/O流的教程

    6. **随机访问文件RandomAccessFile**:不同于顺序读写的流,`RandomAccessFile`允许在文件中的任意位置读写数据,支持随机访问,常用于大文件处理。 7. **DataOutputStream及DataInputStream**:这两类流提供了一...

    java高级特性 - io流

    Java的IO流是Java平台中的核心特性之一,它在处理数据输入和输出方面扮演着至关重要的角色。在Java中,I/O(Input/Output)流是一组类和接口,它们允许程序读取和写入数据到不同的源和目标,如键盘、显示器、磁盘...

    java流技术

    Java流技术是Java编程语言中处理输入/输出(I/O)操作的重要组成部分,它为数据传输提供了一种统一的抽象接口。在Java中,流被用来处理任何类型的数据,包括字符、字节以及对象,使得程序员可以高效地读取和写入数据...

    java高级特性 - io流笔记

    Java的IO流是其高级特性中的重要组成部分,它在处理数据输入与输出方面扮演着核心角色。Java的IO系统设计得相当灵活,可以处理各种类型的数据,包括字符、字节,甚至对象。以下是对Java IO流的详细解读。 1. **IO流...

Global site tag (gtag.js) - Google Analytics