Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用RandomAccessFile到达文件中的特定行_Java_File_Random Access - Fatal编程技术网

Java 使用RandomAccessFile到达文件中的特定行

Java 使用RandomAccessFile到达文件中的特定行,java,file,random-access,Java,File,Random Access,是否可以通过RandomAccessFile将光标定位到文件中特定行的开头 例如,我想将文件中第111行中从char 10开始的字符串更改为20。该文件具有固定长度的记录。 是否可以使用RandomAccessFile直接将光标定位到第111行的开头 更新: 我使用了以下代码。但是,它返回null 行长度为200个字符(如果我没有错,则为200字节) 我哪里出错了?您不能直接使用RandomAccessFile执行此操作。它负责处理二进制文件,并帮助您在任意随机位置读取和写入此类文件片段。这就是

是否可以通过RandomAccessFile将光标定位到文件中特定行的开头

例如,我想将文件中第111行中从char 10开始的字符串更改为20。该文件具有固定长度的记录。

是否可以使用RandomAccessFile直接将光标定位到第111行的开头

更新:

我使用了以下代码。但是,它返回null

行长度为200个字符(如果我没有错,则为200字节)


我哪里出错了?

您不能直接使用
RandomAccessFile
执行此操作。它负责处理二进制文件,并帮助您在任意随机位置读取和写入此类文件片段。这就是为什么该类被称为
RandomAccessFile

但它对文本不起作用,所以它无法识别行尾,也根本不适用于行


所以,要实现您想要的,您应该使用
BufferedReader
,逐行读取,如果您想要存储每行开始的位置,那么您将能够跳过所需的字节数,以跳转到所需行的开头

我不确定,但我的文件似乎不支持这种功能。 由于RAF使用字节操作,我们可以跳过特定数量的字节,如果您的文件具有固定的线宽,则可以通过

file.skipBytes(110 * lineSizeInBytes);
否则,您需要以下内容:

for (int i = 0; i < 110; i++) file.readLine();
String line = file.readLine();
(inti=0;i<110;i++)文件的
for.readLine();
字符串行=file.readLine();

要使用RandomAccessFile,您需要有固定长度的记录,或者在每个记录(例如,每10条记录)的开始处有一个偏移量的“摄影矢量”。这些可能适合您的问题,也可能不适合您的问题。

正如其他一些人所说,还有一些专门设计用于读取文本行的类,例如BufferedReader。但是,如果需要使用RandomAccessFile,则可以读取文本行,但需要以编程方式查找一行的结束位置和另一行的开始位置

一个简单的例子可能是

RandomAccessFile raf = new RandomAccessFile("c:\test.txt","r");
String line = "";
while (raf.available()){
  byte b = raf.read();
  if (b == '\n'){
    // this is the end of the current line, so prepare to read the next line
    System.out.println("Read line: " + line);
    line = "";
    }
  else {
    line += (char)b;
    }
  }
这为查找每行末尾的阅读器提供了基本的构建块

如果你打算继续使用RandomAccessFile,你可以从这个框架开始,但是你需要注意一些缺点,比如。。。 1.Unix和Windows使用不同的行标记-您需要查找'\n'、'\r'以及这两者的组合 2.一次读取一个字节的速度非常慢-您应该将一个字节块读入数组缓冲区(例如字节[2048]数组),然后遍历数组,当到达缓冲区数组的末尾时,从RandomAccessFile重新填充数组。 3.如果要处理Unicode字符,则需要一次读取和处理2个字节,而不是单个字节


RandomAccessFile功能非常强大,但如果您可以使用BufferedReader之类的工具,那么您可能会更好地使用它,因为它会自动处理所有这些问题。

+1,但OP后来评论说该文件有固定长度的记录。@Andrew Thompson,您是对的。我没有注意这个细节。没有,只是在你的答案发布后才提到。我将其编辑到问题中,以避免进一步混淆。每行包含\n个字符。因此,实际上您应该跳过lineCount*(lineSize+1)。
RandomAccessFile raf = new RandomAccessFile("c:\test.txt","r");
String line = "";
while (raf.available()){
  byte b = raf.read();
  if (b == '\n'){
    // this is the end of the current line, so prepare to read the next line
    System.out.println("Read line: " + line);
    line = "";
    }
  else {
    line += (char)b;
    }
  }