读取文件任意位置的内容——RandomAccessFile

http://www.cnblogs.com/Sunw/p/3801145.html

http://www.cnblogs.com/dukc/p/4776868.html

http://www.cnblogs.com/zhujiabin/p/5660541.html

总结

  1、构造方法:RandomAccessFile有两个构造方法

    (1) RandomAccessFile(File file, String mode)

    (2) RandomAccessFile(String filepath, String mode)

    mode参数表示打开文件方式,其值及含义如下:



含意

"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd" 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。

  2、文件长度属性:同java.io.File对象一样的length

  3、指针定位方法:

    public void seek(long pos) throws IOException {}    参数pos - 从文件开头以字节为单位测量的偏移量位置,在该位置设置文件指针。

    (1) pos位于 [0, length] 之间,超出范围则报错;

    (2) 一般在读取文件时,不要将pos指向length,因为pos指向length表示文件已读完,这时再调用read方法则会抛出异常,如果是反向读取文件,可以设置pos=length-1,这表示下一次read得到的事最后一个字符;

    (3) 定义了多种read方法,用于读取不同类型的数据,具体请查看API

  4、读取文件时要注意指针位置

    (1) 指针自动移动:每次调用read的时候,指针pos会自动移动到read的数据之后,这就表示,如果需要重复read某一段数据,那么每次read前都要手动调用一次seek(pos)方法;

    (2) 反向读取需注意:在反向读取文件时,我这里使用了 if(logFile.readByte() == ‘\n‘) {} 来判断是否读取到了换行符,由于(1)的关系,在执行这个if之后,指针向后移动了一个字节长度,所以在if块中,我们可以直接调用readLine来获取下一行的数据,也正因为如此,我们在这个if块中,只能获取到前面存在换行符‘\n‘的数据,这就表明了,这里面永远不可能获取到第一行的数据(因为第一行前面没有行了,也就没有换行符‘\n‘了),所以这里对首行数据进行单独读取。

    (3) 空行处理:line = logFile.readLine(); 如果读取了空行,则这里 line = null; (个人认为这是不对,原因很简单:既然是空行,就表示存在这个行,只是没有数据而已,所以个人认为应该是 "" 而不是 null);所以在这里不要直接使用line,小心报NullPointException哦;

    (4) 字符集问题:readLine()存在中文乱码问题;我没有深入研究过是否能直接read中文,这里只是对read结果做了简单处理,如果你有更好的中文乱码解决方案,也请你能留言告诉我。

时间: 2024-10-10 00:00:01

读取文件任意位置的内容——RandomAccessFile的相关文章

类 RandomAccessFile 在文件任意位置进行读写

public class RandomAccessFile extends Object implements DataOutput, DataInput, Closeable 此类同时实现了DataOutput和DataInput接口,此类的实例支持对随机访问文件的读取和写入.随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组.存在指向该隐含数组的光标或索引,称为文件指针:输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针.如果随机访问文件以读取/写入模式创建,则

利用RandomAccessFile类在指定文件指定位置插入内容

package File; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; /*利用RandomAccessFile类在指定文件指定位置插入内容.*/ public class InsertContent { public static void ins

shell读取文件的每一行内容并输出【转】

写法一: #!/bin/bash while read line do echo $line done < file(待读取的文件) 写法二: #!/bin/bash cat file(待读取的文件) | while read line do echo $line done 写法三: for line in `cat file(待读取的文件)` do echo $line done 说明:for逐行读和while逐行读是有区别的,如: $ cat file aaaa bbbb cccc dddd

测试python awk sed 读取文件指定位置时的性能

#!/bin/env python #coding:utf8 ''' awk 打印指定行数 sed 打印指定行数 python 打印指定位置,某长度字符串 awk 耗时最长,很长 sed awk 时间一半 python 耗时 基本忽略不计 使用脚本监控日志文件的时候,每次记录上次退出的位置 python效率最高. ''' import os from  time import time from os.path import getsize testfile='/dev/shm/%s' % ti

【C#】打开并读取文件第1行内容

//1.创建StreamReader对象,并指定要读取的文件,与编码格式 StreamReader sr = new StreamReader(@"Content.txt", Encoding.UTF8); //2.调用StreamReader对象的readline方法,读取第1行 string content = sr.ReadLine(); //3.释放资源 sr.Dispose(); //3.弹窗 MessageBox.Show(content);

shell:读取文件的每一行内容并输出

写法一:#!/bin/bash while read linedoecho $linedone < file(待读取的文件) 写法二: #!/bin/bash cat file(待读取的文件) | while read linedoecho $linedone 写法三: for line in `cat file(待读取的文件)`doecho $linedone 以上三种写法都是我摘自网上的,共同分享一下. http://blog.de3eb.cn/2012/03/shell%E8%AF%BB%

python读取文件中的路径内容,保存到另外的路径中

#encoding=utf-8import os import os.path import shutil def moveFileto(sourceDir, targetDir): shutil.copy(sourceDir, targetDir) target = raw_input('targetDir') filename = raw_input('enter pathfile name:')fobj = open(filename,'r')for x in fobj: print x;

在任意位置为stringbuffer 添加内容

package tianjia.cn; /* * 在任意位置 添加内容 * api方法: * StringBuffer insert(int offset, boolean b) 将 boolean 参数的字符串表示形式插入此序列中. StringBuffer insert(int offset, char c) 将 char 参数的字符串表示形式插入此序列中. StringBuffer insert(int offset, char[] str) 将 char 数组参数的字符串表示形式插入此序

python读取文件小结

python读取文件小结 你想通过python从文件中读取文本或数据. 一.最方便的方法是一次性读取文件中的所有内容并放置到一个大字符串中: all_the_text = open('thefile.txt').read( )     # 文本文件中的所有文本 all_the_data = open('abinfile','rb').read( )    # 二进制文件中的所有数据 为了安全起见,最好还是给打开的文件对象指定一个名字,这样在完成操作之后可以迅速关闭文件,防止一些无用的文件对象占用