java:如何使用 bufferedreader 读取特定行
Posted
技术标签:
【中文标题】java:如何使用 bufferedreader 读取特定行【英文标题】:java: how to use bufferedreader to read specific line 【发布时间】:2012-12-22 11:36:33 【问题描述】:假设我有一个名为:data.txt(包含 2000 行)的文本文件
我如何读取给定的特定行:500-1500,然后是 1500-2000 并显示特定行的输出?
此代码将读取整个文件(2000 行)
public static String getContents(File aFile)
StringBuffer contents = new StringBuffer();
try
BufferedReader input = new BufferedReader(new FileReader(aFile));
try
String line = null;
while (( line = input.readLine()) != null)
contents.append(line);
contents.append(System.getProperty("line.separator"));
finally
input.close();
catch (IOException ex)
ex.printStackTrace();
return contents.toString();
如何修改上述代码以读取特定行?
【问题讨论】:
你为什么不只计算你是哪一行,如果你在想要的范围内,你会逐行输出? 我该怎么做?我知道如何计算,但不确定输出范围内的行 你计数,然后用if
语句检查计数。
你可能需要绝对文件访问权限,试试 SeekableStream
你应该从文件的开头开始计算行数,或者使用LineNumberReader
更好地解析
【参考方案1】:
我建议使用 java.io.LineNumberReader。它扩展了 BufferedReader 和
您可以使用它的LineNumberReader.getLineNumber();
来获取当前行号
您也可以使用 Java 7 java.nio.file.Files.readAllLines
,如果它更适合您,它会返回 List<String>
注意:
1) 支持 StringBuilder 而不是 StringBuffer,StringBuffer 只是一个遗留类
2) contents.append(System.getProperty("line.separator"))
不好看
改用contents.append(File.separator)
3) 捕捉异常似乎无关紧要,我还建议将您的代码更改为
public static String getContents(File aFile) throws IOException
BufferedReader rdr = new BufferedReader(new FileReader("aFile"));
try
StringBuilder sb = new StringBuilder();
// read your lines
return sb.toString();
finally
rdr.close();
在我看来,现在代码看起来更干净了。如果您使用的是 Java 7,请使用 try-with-resources
try (BufferedReader rdr = new BufferedReader(new FileReader("aFile")))
StringBuilder sb = new StringBuilder();
// read your lines
return sb.toString();
所以最后你的代码可能看起来像
public static String[] getContents(File aFile) throws IOException
try (LineNumberReader rdr = new LineNumberReader(new FileReader(aFile)))
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
for (String line = null; (line = rdr.readLine()) != null;)
if (rdr.getLineNumber() >= 1500)
sb2.append(line).append(File.pathSeparatorChar);
else if (rdr.getLineNumber() > 500)
sb1.append(line).append(File.pathSeparatorChar);
return new String[] sb1.toString(), sb2.toString() ;
请注意,它返回 2 个字符串 500-1499 和 1500-2000
【讨论】:
Redbox 似乎想要 500-1500 和 1500 - 2000 作为两个单独的文本,或者看起来是这样 我想将 (500-1500) 的文本放到 stringA 然后将 (1500-2000) 的文本作为 stringB 可以这样做吗? 那就用LineNumberReader,效率更高 还有1个问题,StringBuilder是针对jdk 1.4及以上的吗? 除了stringbuilder你还有别的办法吗?由于我的项目使用的是旧版本的 jdk,因此 stringbuilder 无法正常工作..【参考方案2】:更简洁的解决方案是在 apache commons 中使用 FileUtils。 http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html 示例 sn-p:
String line = FileUtils.readLines(aFile).get(lineNumber);
【讨论】:
我需要加载 apache 库吗?我正在使用 jdeveloper 是的,apache commons-io jar 文件应该在类路径中。 jarfinder.com/index.php/java/info/… 您答案中的链接已失效您在此处找到 FileUtils:commons.apache.org/proper/commons-io【参考方案3】:更好的方法是使用 BufferedReader。例如,如果您想阅读第 32 行:
for(int x = 0; x < 32; x++)
buf.readLine();
lineThreeTwo = buf.readLine();
现在在 String lineThreeTwo 中,您已经存储了第 32 行。
【讨论】:
BufferedReader 比 LineNumberReader 快。最快的解决方案。以上是关于java:如何使用 bufferedreader 读取特定行的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中使用 BufferedReader 反转希腊字母?
如何在 Java 中使用 BufferedReader [关闭]
如何在 Java 中使用 BufferedReader 读取文件末尾 (EOF)?
java中BufferedReader的问题 一个程序中如何多次调用BufferedReader 我第二次调用的时候无法读取数据 如
如何使用 java.nio.channels.FileChannel 读取到 ByteBuffer 实现类似 BufferedReader#readLine() 的行为