Java---31---RadnomAccessFile

RandomAccessFile:

随机访问文件,自身具备读写的方法。通过skipBytes(int x),seek(int x)来达到随机访问。

该类不算是IO体系中子类,而是直接继承自Object

但是它是IO包中成员,因为它具备读写功能。

随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。 通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException(是一种 IOException)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException,而不是 EOFException。需要特别指出的是,如果流已被关闭,则可能抛出 IOException。


构造方法摘要


RandomAccessFile(File file, String mode)

创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。


RandomAccessFile(String name, String mode)

创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。

Mode:操作模式

"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。

"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。

"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。

"rwd"   打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。

如果模式为r(只读),不会创建文件,如果文件不存在会出现异常

如果模式为rw,文件不存在会自动创建,如果存在则不会覆盖

RandomAccessFile支持从任意位置读写文件,这种特性非常符合多线程下载的原理。

假设一个文件大小为20,那么开4个线程,每个线程下载5

0--5

6--10

11-15

16--20

创建RandomAccessFile对象:

RandomAccessFile raf = new RandomAccessFile("data.txt", "rw");

读写方法:

raf.write("张三".getBytes());
raf.writeInt(97);

byte buff[] = new byte[4];
raf.read(buff);

调整对象中指针

 raf.seek(8);

跳过指定的字节数

raf.skipBytes(8);

举个栗子:

public class RandomAccessFileDemo {

	public static void main(String[] args) throws Exception {
		writeFile();//
		// readFile();
		// writeFile2();// 从指定位置开始写文件
		writeFile3();// 从原文件中间开始写文件,会覆盖当前指针之后的同等长度内容
	}

	private static void writeFile3() throws Exception {
		RandomAccessFile raf = new RandomAccessFile("data.txt", "rw");

		// seek 和 skipBytes 两个方法都会覆盖之后的内容
		// raf.seek(8);
		raf.skipBytes(8);
		raf.write("老李".getBytes());
		raf.write(102);
		raf.close();
	}

	public static void writeFile2() throws Exception {
		RandomAccessFile raf = new RandomAccessFile("data.txt", "rw");

		// 从24个字节之后开始写
		raf.seek(8 * 3);

		raf.write("周期".getBytes());
		raf.write(103);
	}

	public static void readFile() throws Exception {

		RandomAccessFile raf = new RandomAccessFile("data.txt", "r");
		// raf.write("hahaha".getBytes());
		// 调整对象中指针
		// raf.seek(8);
		// 从第8个字节开始读文件,读出来的是李斯

		// 跳过指定的字节数
		// raf.skipBytes(8);

		byte buff[] = new byte[4];
		raf.read(buff);
		String s = new String(buff);
		System.out.println("name = " + s);
		int age = raf.readInt();
		System.out.println("age = " + age);

		raf.close();
	}

	public static void writeFile() throws Exception {

		RandomAccessFile raf = new RandomAccessFile("data.txt", "rw");
		raf.write("张三".getBytes());
		raf.writeInt(97);

		raf.write("李斯".getBytes());
		raf.writeInt(99);

		raf.close();
	}

}
时间: 2024-12-28 21:03:16

Java---31---RadnomAccessFile的相关文章

java (31) - 序列化实现深克隆

一.序列化:    把对象写到流里面的过程是序列化,而把对象从流中读出来的过程叫做反序列化.在java中实现深克隆对象,常常可以先使对象实现Serializable接口,然后把对象写到一个流里面,然后再从流中读取出来,便可以重建对象. 二.序列化实现: <strong><span style="font-size:14px;">public class Main { public static void main(String[] args) throws Ex

Java - 31 Java 发送邮件

Java 发送邮件 使用Java应用程序发送E-mail十分简单,但是首先你应该在你的机器上安装JavaMail API 和Java Activation Framework (JAF) . 你可以在 JavaMail (Version 1.2) 下载最新的版本. 你可以再 在JAF (Version 1.1.1)下载最新的版本. 下载并解压这些文件,最上层文件夹你会发现很多的jar文件.你需要将mail.jar和activation.jar 添加到你的CLASSPATH中. 如果你使用第三方邮

那些年,一起学的Java 3-1

/**实验3.1 * 创建一个MyValue类的对象myValue * 为myValue对象中的value域赋值10 * 使用getValue()方法获得myValue对象的数据并将它打印在屏幕上 **/ public class FirstProgram { public static void main (String[] args) { MyValue myValue = new MyValue(); myValue.setValue(10); System.out.println("Re

使用Socket简单模拟C/S消息传递——Java(31)

1.socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式. 2.通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据.3.我们把插头插到插座上就能从电网获得电力供应,同样,为了与远程计算机进行数据传输,需要连接到因特网,而 socket 就是用来连接到因特网的工具. 客户端 public class MyClient { public static final String SERV

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Cause: java.sql.SQLException: 无法转换为内部表示(Mybatis)

公司开发档案系统使用框架:Spring+Struts2+Mybatis+EasyUI,在开发过程中出现sql异常:“Cause: java.sql.SQLException: 无法转换为内部表示”,错误如下: org.springframework.jdbc.UncategorizedSQLException: ### Error querying database. Cause: java.sql.SQLException: 无法转换为内部表示 ### The error may involv

(转载)Java多线程入门理解

转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalan

java线程详细介绍

目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1

Java多线程学习

写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线

Java笔记(26):网络编程

1.网络模型概述和图解 网络模型7层概述:1.物理层:主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介质的传输速率等.它的主要作用是传输比特流(就是由1.0转化为电流强弱来进行传输,到达目的地后在转化为1.0,也就是我们常说的数模转换与模数转换).这一层的数据叫做比特. 2. 数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装.常把这一层的数据叫做帧.在这一层工作的设备是交换机,数据通过交换机来传输. 3. 网络层:主要将从下层接收到的数据进行IP地