- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道如何直接到达java中文本文件的特定行号。一种方法是这样的。
int line=0;
BufferedReader read=new BufferedReader(new FileReader(Filename));
while(read.readLine()!=null){
line++;
if(line==LIMIT) break;
}
但这会创建很多 String 对象,除非运行 gc,否则这些对象不会被释放。请提供一个快速且不消耗大量内存的解决方案。
PS:我正在读取一个有数百万行的文件。
最佳答案
我们假设文本文件具有可变长度的行,并且您尚未对其进行预处理以创建索引。 (否则,应该可以预先确定第N行的位置,然后“寻找”它。)
第一个观察结果是(根据上述假设),如果不检查第 N 行开始之前的每个字符,就不可能找到第 N 行。
但是您仍然可以以不会产生大量垃圾的方式执行此操作。这是一个简单的版本:
BufferedReader br = new BufferedReader(new FileReader(filename));
for (int i = 1; i < LIMIT; i++) {
while ((ch = br.read()) != '\n') {
if (ch == -1) {
// reached the end of file too soon ...
throw new IOException("The file has < " + LIMIT + " lines");
}
}
}
line = br.readLine();
技巧是跳过这些行而不将它们形成 String
对象。
现在上面有一个小缺陷。假设文本文件的行以换行符('\n'
)终止,而readLine
可以处理3种行分隔符。但这是可以解决的……而不会产生额外的垃圾。我将把它作为“给读者的练习”,并研究一些调整,例如使用 read(char[])
而不是 read()
。
如果您使用 FileInputStream
打开文件、获取 FileChannel
、将字节读入 ByteBuffer
并然后在其中搜索 (byte) '\n'
。但代码要复杂得多。
但是,我想强调评论中提出的观点。您可能在这方面浪费时间。尽管会产生大量垃圾,但您的原始版本很可能运行速度足以满足您的目的。实际上,当垃圾与非垃圾的比例较高时,GC 会很快。对于读取丢弃行的程序,几乎可以保证会出现这种情况。
与其花时间在错误的前提下弄清楚如何使程序更快,不如编写一个简单的版本并在典型输入文件上测量其性能。仅当程序实际上太慢时才进行优化。
关于java - Java中转到文件行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21576584/
我已经在 jQuery transit 中加载了,我确定我是在加载 jQuery 之后才做的,但我仍然得到这个错误: 我查看了 Chrome 中的资源面板,在 jQuery 之后加载了 jQuery
我目前收到一个字符串,例如 Hello there my\r\nName is\r\nJohn Smith\r\nand\r\nstuff 我想将每一行放在一个新列表项...例如: 期望的结果(带有单
我正在尝试使用 MapKit 路线请求获取两个坐标之间的交通路线。 当我切换到其他(非 Transit)类型时,下面的代码可以工作,但是当我切换到 Transit 时,它会抛出一个错误,这个错误在 A
我是一名优秀的程序员,十分优秀!