`
hybxiaodao
  • 浏览: 246911 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

RandomAccessFile(转)

    博客分类:
  • j2se
F# 
阅读更多

RandomAccessFile是一个很有用的类,可以将字节流写入到磁盘文件中,对应的也可以从磁盘文件中读取出字节流,在API中关于RandomAccessFile的描述如下:

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

 

通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则抛出 EOFException (是一种 IOException )。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException ,而不是 EOFException 。需要特别指出的是,如果流已被关闭,则可能抛出 IOException

以下是两个RandomAccessFile的写入和读取的简单例子:

1、  将字节流写入到磁盘中

private static void testCreateFile(){

String directory = “D:/program/test”;

String name = “t.gen”;

File f = new File(directory, name);

RandomAccessFile file = null;

try {

file = new RandomAccessFile(f, “rw”);

byte[] b = {5,10,15,20};

try {

//如果没有这行,文件也会生成,只是文件为空

file.write(b,0,4);

} catch (IOException e) {

e.printStackTrace();

}

} catch (FileNotFoundException e) {

e.printStackTrace();

}finally{

if (null!=file){

try {

file.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}
 
2、  从磁盘文件中读取字节流

private static void testReadFile(){

String directory = “D:/program/luceneDemo3.0/test”;

String name = “t.gen”;

File f = new File(directory, name);

RandomAccessFile file = null;

try {

file = new RandomAccessFile(f, “rw”);

byte[] b = new byte[4];

try {

long len = file.length();

file.read(b);

//设置要读取的字节位置

file.seek(1);

System.out.println(file.readByte()+”>>FilePointer>>”+file.getFilePointer());

for (int i=0;i<b.length;i++){

System.out.println(“>>>”+b[i]);

}

} catch (IOException e) {

e.printStackTrace();

}

} catch (FileNotFoundException e) {

e.printStackTrace();

}finally{

if (null!=file){

try {

file.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}
 

说明

1、  这个类依我看来,用来处理字节流(byte)是很好的,如果用来处理字符(串)或其他数据类型,比如int、long,我试了感觉效果并不好,尤其是处理中文字符串的时候,那简直就是一个灾难,你会又碰上纠缠不清的乱码!

2、 seek(long pos)方法

是在读取的时候用来设置读取到哪一个字节的,比如在例子中有5,10,15,20字节,在byte数组中分别对应0、1、2、3位置,同样在文件 file = new RandomAccessFile(f, “rw”);中,也对应着0、1、2、3位置,所以如果设置file.seek(1);就表示通过file.readByte()读取的时候,读取的是第 1位置的数据,也就是10了。

3、  getFilePointer()方法

在通过上面说的seek (long pos)设置后,getFilePointer()得到的就是当前文件中的字节位置,也就是所说的偏移量了。比如在这个例子中,getFilePointer()的值就是1.

4、文件模式

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

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

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

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

附录

void close ()
关闭此随机访问文件流并释放与该流关联的所有系统资源。
FileChannel getChannel ()
返回与此文件关联的唯一 FileChannel 对象。
FileDescriptor getFD ()
返回与此流关联的不透明文件描述符对象。
long getFilePointer ()
返回此文件中的当前偏移量。
long length ()
返回此文件的长度。
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 编码以与机器无关的方式将一个字符串写入该文件。
分享到:
评论
1 楼 wjlbear 2015-01-12  
              

相关推荐

    RandomAccessFile类的用法.doc

    RandomAccessFile类是Java I/O库中的一个重要组件,它提供了对文件进行随机访问的能力,这意味着你可以直接跳到文件的任意位置进行读写操作,而不仅仅局限于从头到尾的顺序访问。这个类非常适合处理大数据量的文件,...

    RandomAccessFile 解决乱码

    ### RandomAccessFile 解决乱码 #### 背景与问题描述 在Java编程中,`RandomAccessFile` 类提供了一种方式来处理文件中的数据,允许程序随机访问文件的任何部分。但在处理中文或其他非ASCII字符时,可能会遇到乱码...

    使用RandomAccessFile流将一个文本文件读出,并导致写入到另一个文件当中。

    ### 使用RandomAccessFile流将一个文本文件读出并写入到另一个文件中的知识点解析 在Java编程语言中,`RandomAccessFile`类提供了一种非常灵活的方式来读取和写入文件。它支持随机访问,意味着我们可以直接跳转到...

    RandomAccessFile向文件中写入中文

    ### RandomAccessFile 向文件中写入中文 在Java编程中,经常需要处理文件操作,尤其是在涉及中文字符的写入时。本篇文章将详细介绍如何利用`RandomAccessFile`类正确地向文件中写入中文字符,并解释不同写入方法的...

    java使用randomaccessfile在文件任意位置写入数据

    随机访问文件(RandomAccessFile)是Java提供的一个类,它允许程序随机访问文件中的任意位置,进行读写操作。使用RandomAccessFile可以在文件的任意位置插入数据,这对于那些需要在文件中间添加内容而不干扰其他数据...

    Java RandomAccessFile 指定位置实现文件读取与写入

    Java的`RandomAccessFile`类是Java I/O流体系中的一种特殊类型,它允许程序员以随机访问模式读取和写入文件。与传统的输入/输出流不同,`RandomAccessFile`可以直接定位到文件的任意位置进行读写操作,这对于处理...

    Java核心编程之文件随机读写类RandomAccessFile详解

    Java中的RandomAccessFile类是用于文件随机读写的工具类,它属于java.io包。RandomAccessFile提供了读取和写入文件的能力,并且允许程序访问文件的任意位置,这使得它能够方便地进行文件的随机访问。...

    JAVA wav转PCM Utils代码工具类

    - 读取WAV文件头信息:通过`java.io.RandomAccessFile`类读取文件,并解析出关键参数。 - 解码WAV数据:使用`java.nio`包中的缓冲区进行高效的数据读取和转换。 - 转换格式:实现音频数据的位深度和声道数转换。 - ...

    okhttp +greendao+线程池+service+RandomAccessFile等技术实现多任务多线程断点续传后台下载

    okhttp +greendao+线程池+service+RandomAccessFile等技术实现多任务多线程断点续传后台下载,完整demo直接就能使用 ,demo中包含greendao 自定义类型转换

    Java的IO流讲解代码: File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型

    File 类、RandomAccessFile 类、字节流(文件字节流、缓冲字节流、基本数据类型字节流、打印流、对象序列化流、字节数组流)、字符流(缓冲字符流、文件字符流、转换流、格式化输出流、字符数组流) 这份代码源码...

    PCM转WAV文件

    例如,使用`java.io.RandomAccessFile`来读写文件,`ByteBuffer`来处理二进制数据,以及手动计算和设置头信息的各个字段。 转换后的WAV文件由于包含了完整的头信息,可以被大多数音频播放器识别并播放,而无需额外...

    jsp基础例子-留言版

    本教程将详细介绍如何使用JSP(JavaServer Pages)创建一个基础的留言版,特别关注如何处理中文乱码问题以及使用`RandomAccessFile`进行文件操作。首先,我们需要理解JSP的核心概念,它是Java技术在Web开发中的一个...

    java读写文件的方法.pdf

    } } /** * 随机读取文件内容 * * @param fileName * 文件名 */ public static void readFileByRandomAccess(String fileName) { RandomAccessFile randomAccessFile = null; try { randomAccessFile = new ...

    从DELPHI到JAVA转换.pdf

    在 DELPHI 中,文件操作是通过 TFileStream 来实现的,而在 JAVA 中,则是通过 InputStream/OutputStream 和 RandomAccessFile 来实现的。 目录操作 在 DELPHI 中,目录操作是通过 FindFirst 等来实现的,而在 ...

    将内容追加到文件尾部

    本文将详细介绍两种常用的方法来实现这一功能:使用`RandomAccessFile`类以及使用`FileWriter`类。 #### 使用`RandomAccessFile` `RandomAccessFile`是Java标准库中的一个类,它提供了对文件进行随机访问的能力。...

    利用纯真IP数据库,通过IP查地址[JAVA]

    4. **随机访问文件类`RandomAccessFile`的应用**:掌握如何使用`RandomAccessFile`类读取大文件并定位特定记录。 #### 二、纯真IP数据库简介 纯真IP数据库是一款由国内开发者开发的免费开源IP数据库,它可以用于...

    java如何将pdf转换成image

    RandomAccessFile raf = new RandomAccessFile(file, "r"); FileChannel channel = raf.getChannel(); MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); PDFFile pdf...

    读写文件到指定位置

    RandomAccessFile raFile = new RandomAccessFile("目标文件路径", "rw"); raFile.seek(定位位置); // 设置写入位置 ``` 3. **写入文件**: - 写入文件时,可以选择`PrintWriter`、`BufferedWriter`或者`...

    java程序设计基本数据的文件读写

    1. **RandomAccessFile类**:这是一个强大的文件I/O类,它不仅支持顺序读写,还能随机访问文件的任意位置。在这个程序中,使用`RandomAccessFile`创建了一个名为`Rdafile`的对象,用于读写文件。构造函数`...

    二级java上机试题汇编

    RandomAccessFile file = new RandomAccessFile("Java_2.java", "r"); long fileLength = file.length(); while (filePoint ) { s = file.readLine(); System.out.println(s); filePoint = file....

Global site tag (gtag.js) - Google Analytics