当前位置: 首页 > 面试题库 >

Java:从具有缓冲输入的随机访问文件中读取字符串

葛承嗣
2023-03-14
问题内容

之前我从未接触过Java IO API,现在真的很沮丧。我发现很难相信这是多么的奇怪和复杂,以及完成一项简单的任务有多困难。

我的任务:我有2个位置(开始字节,结束字节)pos1pos2。我需要读取这两个字节之间的行(包括开始的一个,不包括结束的一个),并将它们用作UTF8字符串对象。

例如,在大多数脚本语言中,这将是非常简单的1-2-3-liner(在Ruby中,但对于Python,Perl等基本上相同):

f = File.open("file.txt").seek(pos1)
while f.pos < pos2 {
  s = f.readline
  # do something with "s" here
}

Java IO API很快就使您陷入困境;)实际上,我看到了两种\n从常规本地文件中读取行(以结尾)的方式:

  • RandomAccessFile具有getFilePointer()seek(long pos),但它的readLine()读取非UTF8字符串(甚至不是字节数组),但是具有破损编码的非常奇怪的字符串,并且没有缓冲(这可能意味着每个read*()调用都将转换为单个不拖延的OS read()= >相当慢)。
  • BufferedReader有一个很棒的readLine()方法,它甚至可以使用进行某些搜索skip(long n),但是它无法确定已读取的偶数字节,没有提及文件中的当前位置。

我尝试使用类似:

    FileInputStream fis = new FileInputStream(fileName);
    FileChannel fc = fis.getChannel();
    BufferedReader br = new BufferedReader(
            new InputStreamReader(
                    fis,
                    CHARSET_UTF8
            )
    );

…然后fc.position()用于获取当前文件的读取位置并fc.position(newPosition)设置一个,但是在我的情况下似乎不起作用:看起来它返回由BufferedReader完成的缓冲区预填充的位置,或类似的东西-
这些计数器似乎以16K的增量取整。

我是否真的必须自己实现所有功能,即一个文件读取接口,该接口将:

  • 请允许我获取/设置文件位置
  • 缓冲文件读取操作
  • 允许读取UTF8字符串(或至少允许类似“将所有内容读取到下一个\n”之类的操作)

有没有比自己全部实施更快的方法?我在监督什么吗?


问题答案:
import org.apache.commons.io.input.BoundedInputStream

FileInputStream file = new FileInputStream(filename);
file.skip(pos1);
BufferedReader br = new BufferedReader(
   new InputStreamReader(new BoundedInputStream(file,pos2-pos1))
);

如果您不关心pos2,那么您就不需要Apache Commons IO。



 类似资料:
  • 上面几节生成了随机访问文件并将数据写入这个文件中。本节要开发一个程序,顺序读取这个文件.只打印包含数据的记录。该程序还有另一好处,将在本节最后说明,读者不妨先猜猜看。 istream 的函数 read 从指定流的当前位置向对象输入指定字节数。例如,图 14.14 中下列语句: inCredit.read(reinterpret_cast<char *)(&client), sizeof(clien

  • 问题内容: 我有一个Java程序,它将一些文本输出到控制台。它使用,和其他一些方法来执行此操作。 在程序的最后,我想读取控制台中的所有文本并将其复制到String缓冲区中。我该如何用Java做到这一点?我需要阅读和独立。 问题答案: 好的,这是一个有趣的问题。似乎不是一种同时解决所有方法的优雅方法。(不幸的是没有。) 我确实写了一个丑陋的基于反射的解决方法(我想不要在生产代码中使用它:) …可以像

  • 问题内容: 我正在尝试从FTP服务器读取文件。该文件是一个文件。我想知道在套接字打开的情况下是否可以对此文件执行操作。我试图按照什么分两个问题,提到的阅读文件,而不写入磁盘和读取从FTP文件,而无需下载,但没有成功。 我知道如何提取下载文件上的数据/工作,但不确定是否可以即时执行。有没有一种方法可以连接到站点,在缓冲区中获取数据,还可以提取某些数据并退出? 尝试StringIO时出现错误: 我只需

  • 我有一个生成器,它使用随机键和值生成完全的json脚本(quickcheck.generator)。我想读取这个字符串并获得键的值。问题是,每次创建的新json字符串的大小都不一样,而且无法了解键名或值名。我应该盲目地读琴弦,并触及每一个键。有什么解决办法吗?提前谢谢!

  • 问题内容: 我正在Node.js中编写一个程序,该程序(在某些情况下)希望充当一个简单的过滤器:读取从stdin(直到文件结尾)的所有内容,进行一些处理,然后将结果写入stdout。 您如何“从stdin中读取所有内容”部分?到目前为止,我找到的最接近的解决方案似乎可以从控制台一次运行一行,或者仅在stdin是文件而不是管道时才能工作。 问题答案: 我为此编写的样板与上面评论中描述的解决方案非常相

  • 我是Java的新手,我正在尝试从一个多行的输入中获取一个字符串。 例如,一个字符串=“the quick brown fox jumps over the lazy dog.the quick brown fox jumps over the lazy dog.the quick fox jumps over the lazy dog.”输入如下: 敏捷的棕色狐狸跳过懒惰的狗。 敏捷的棕色狐狸跳过