Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/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_Io_Random Access - Fatal编程技术网

Java RandomAccessFile-返回空字符串

Java RandomAccessFile-返回空字符串,java,file,io,random-access,Java,File,Io,Random Access,我有一个固定格式的文件 我想根据行号访问此文件中的特定行 e、 g.读第100行 每行的长度为200字节 因此,使用RandomAccessFile将光标直接移动到第100行,如下所示: File f = new File(myFile); RandomAccessFile r = new RandomAccessFile(f,"rw"); r.skipBytes(200 * 99); // linesize * (lineNum - 1) System.out.println(r.read

我有一个固定格式的文件

我想根据行号访问此文件中的特定行

e、 g.读第100行

每行的长度为200字节

因此,使用RandomAccessFile将光标直接移动到第100行,如下所示:

File f = new File(myFile);
RandomAccessFile r = new RandomAccessFile(f,"rw");
r.skipBytes(200 * 99);   // linesize * (lineNum - 1)
System.out.println(r.readLine());
但是,我得到的输出为null

我错过了什么

这个问题是对我上一个问题的继续回答

更新:

以下程序完全符合我的预期:

行大小为200个字符

File f = new File(myFile);
RandomAccessFile r = new RandomAccessFile(f,"rw");
r.seek(201 * (lineNumber-1));   // linesize * (lineNum - 1)
System.out.println(r.readLine());
给定行号(整个文件中的任何行号)就是打印该行


@请解释一下

RandomAccessFile.readLine()
在文件末尾返回null。正如Javadoc中所说的

byte[] line = new byte[200];
r.seek(200 * 99);
r.read(line);
String s = new String(line, "UTF-8"); // Or probably "Cp1252"
所以你们在文件的末尾


所以你的计算结果是不正确的。

EJP所说的是正确的:

  • 确认您必须更正文件。使用不存在的文件创建RandomAccessFile将引发异常。由于没有异常,因此您已经使用一个文件创建了RandomAccessFile。确保它是正确的
  • RandomAccessFile使用内部文件位置指针。如果您已经在文件末尾,并且再次跳过了一些字节,那么它将解释您提到的行为。请确保您在文件中的位置正确

首先,如果您只是从文件中读取,而不是写入文件,那么我建议您将RandomAccessFile打开为“r”,而不是“rw”。原因是,如果文件已打开以允许写入访问,则实际上可以将文件中的指针移动到大于文件长度的位置,因为您可以将文件写入所需的大小

例如,如果您有一个长度为100字节的文件,以只读模式打开它将强制您将指针保持在这100字节的某个位置。但是,如果您以读写模式打开同一个文件,您可以告诉RandomAccessFile进行查找(250),它将毫无问题地服从,因为它认为您可能希望在文件中的这一点写入数据

因此,正如其他一些人所说的,您可能已经移动到文件末尾,这在“rw”模式下非常有效

其次,如果要从文件开头读取,我建议您使用seek()而不是skipBytes()。通过使用seek(),您可以确保移动到您想要的确切位置,因为它始终相对于文件的开头。但是,skipBytes()是相对于文件中的当前指针位置的,因此,如果您意外地在RandomAccessFile构造函数和skipBytes()方法调用之间的代码中的某个位置移动指针,您将无法到达正确的位置


因此,如果您要从文件的开头开始工作,seek()提供了更高级别的安全性,无论您对RandomAccessFile做了什么,都可以在文件的正确位置结束。

如何知道每行大小为100字节。1个字符表示1个字节。。行长度是200字符意味着200字节…但是假设在单字节中添加多个空间,字节,那么它将为此添加额外的字节,这是糟糕的编程。如果您想阅读100行,请使用readline from Starting阅读此链接或阅读此链接,例如@downvoter:请鼓起勇气解释downvoting!我不明白你想做什么!他试图读取字节数组并将其转换为字符串。@Gjis Overvliet:我在下面的更新部分的问题末尾附加的代码。。对吗?我只是想确认它在不同的操作系统(unix、linux、windows等)上是否会有不同的行为?代码似乎是正确的。不同的操作系统之间不应该有任何区别。