Java之随机访问文件RandomAccessFile

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38225558/article/details/82585656

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

ex:网路下载资源断点续传(传入一半,网络断了,接着上一个位置继续数据的传输写入
     网络下载资源空间大小检查

注意事项:
      ①在输出的时候,没有设置文件指针,会从头开始写数据,之前有的数据会被覆盖(不会覆盖所有的, 而是新数据所占据的位置)
      ②每次启动程序,默认的指针在文件的开头

构造方法摘要
RandomAccessFile(File file, String mode)
          创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。

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

mode 参数指定用以打开文件的访问模式。允许的值及其含意为:

含意

"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd"   打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
方法摘要
 void close()
          关闭此随机访问文件流并释放与该流关联的所有系统资源。
 long getFilePointer()
          返回此文件中的当前偏移量。
 long length()
          返回此文件的长度。
 int read()
          从此文件中读取一个数据字节。
 int read(byte[] b)
          将最多 b.length 个数据字节从此文件读入 byte 数组。
 int read(byte[] b, int off, int len)
          将最多 len 个数据字节从此文件读入 byte 数组。
 String readLine()
          从此文件读取文本的下一行。
 void seek(long pos)
          设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
 void setLength(long newLength)
          设置此文件的长度。
 void write(byte[] b)
          将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。
 void write(byte[] b, int off, int len)
          将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。
 void write(int b)
          向此文件写入指定的字节。

ex:

/**
 * 随机访问文件RandomAccessFile:网络传输的时候 ,断点续传(传入一半,网络断了,接着上一个位置继续数据的传输写入)
 * 1.强大:可读写
 * 2.随机访问文件
 * 
 * 随机读写文件RandomAccessFile的重要方法:
 * long getFilePointer():获得偏移量
 * void seek(long pos):设置文件指针
 * long length():返回此文件的长度 
 * void setLength(long newLength):设置此文件的长度 
 * @author 郑清
 */
public class Demo {
	 
	public static void main(String[] args) throws IOException {
		RandomAccessFile rw = new RandomAccessFile("D:1/1/1.txt", "rw");//"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。  
		//写
		rw.write("RandomAccessFile可以读写内容!!".getBytes());
		//读     (这里注意上面有了写,下面无法读取出内容!)
		/*int len;
		byte[] b = new byte[1024];
		while((len = rw.read(b)) != -1){
			System.out.println(new String(b,0,len));
		}*/

		System.out.println(rw.getFilePointer());//32   表示该文件偏移量是32,从0开始的,从第0个字节开始
		rw.write("helloworld".getBytes());
		System.out.println(rw.getFilePointer());//42   getFilePointer作用:可以获得下一次该写入数据的位置为42
		
		//随机读写文件好处:断点续传,传入一半,网络断了,接着上一个位置继续数据的传输写入
		rw.seek(16);//设置指针位置16 ==> 即设置的偏移量16
		rw.write("开始".getBytes());//即将第16个字节处开始的内容【可以】 写成了 【开始】 
		System.out.println(rw.getFilePointer());//20  rw偏移量 ==> 16+4
		
		System.out.println(rw.length());//42  获取文件的长度 
		
		rw.setLength(1024*1024);//1024byte=1KB   1024*1024=1M
		//setLength可以做上传下载【下载视频  ==》磁盘占用存储空间】 
		
		rw.close();
	}

}

猜你喜欢

转载自blog.csdn.net/qq_38225558/article/details/82585656