在Java中,是否有任何方法可以从文件中读取特定行?例如,读取第32行或任何其他行号。
答案 0 :(得分:88)
Java 8解决方案:
适用于小文件:
String line32 = Files.readAllLines(Paths.get("file.txt")).get(32)
适用于大型文件:
try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
line32 = lines.skip(31).findFirst().get();
}
答案 1 :(得分:67)
除非您事先了解文件中的行,否则无法在不读取前31行的情况下直接访问第32行。
所有语言和所有现代文件系统都适用。
如此有效,你只需读取直到你找到第32行。
答案 2 :(得分:37)
我不知道,但你可以做的是使用BufferedReader的readline()函数循环前31行无效
FileInputStream fs= new FileInputStream("someFile.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fs));
for(int i = 0; i < 31; ++i)
br.readLine();
String lineIWant = br.readLine();
答案 3 :(得分:15)
例如:
String line32 = (String) FileUtils.readLines(file).get(31);
http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#readLines(java.io.File,java.lang.String)
答案 4 :(得分:10)
您可以尝试indexed-file-reader(Apache License 2.0)。 IndexedFileReader类有一个名为readLines(int from, int to)的方法,它返回一个SortedMap,其键是行号,值是读取的行。
示例:
File file = new File("src/test/resources/file.txt");
reader = new IndexedFileReader(file);
lines = reader.readLines(6, 10);
assertNotNull("Null result.", lines);
assertEquals("Incorrect length.", 5, lines.size());
assertTrue("Incorrect value.", lines.get(6).startsWith("[6]"));
assertTrue("Incorrect value.", lines.get(7).startsWith("[7]"));
assertTrue("Incorrect value.", lines.get(8).startsWith("[8]"));
assertTrue("Incorrect value.", lines.get(9).startsWith("[9]"));
assertTrue("Incorrect value.", lines.get(10).startsWith("[10]"));
以上示例按以下格式读取由50行组成的文本文件:
[1] The quick brown fox jumped over the lazy dog ODD
[2] The quick brown fox jumped over the lazy dog EVEN
Disclamer:我写了这个库
答案 5 :(得分:5)
虽然如其他答案中所述,但在不知道之前的偏移(指针)的情况下,不可能到达确切的行。所以,我通过创建一个临时索引文件来实现这一点,该文件将存储每一行的偏移值。如果文件足够小,您可以将索引(偏移量)存储在内存中,而不需要单独的文件。
The offsets can be calculated by using the RandomAccessFile
RandomAccessFile raf = new RandomAccessFile("myFile.txt","r");
//above 'r' means open in read only mode
ArrayList<Integer> arrayList = new ArrayList<Integer>();
String cur_line = "";
while((cur_line=raf.readLine())!=null)
{
arrayList.add(raf.getFilePointer());
}
//Print the 32 line
//Seeks the file to the particular location from where our '32' line starts
raf.seek(raf.seek(arrayList.get(31));
System.out.println(raf.readLine());
raf.close();
另请访问java文档以获取更多信息: https://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html#mode
复杂性:这是O(n),因为它读取整个文件一次。请注意内存要求。如果它太大而无法存储在内存中,那么创建一个临时文件来存储偏移而不是ArrayList,如上所示。
注意:如果你想要的只是&#39; 32&#39;你只需要调用readLine()也可以通过其他类来调用&#39; 32&#39;倍。如果您想多次获取特定行(基于行号),上述方法非常有用。
谢谢!
答案 6 :(得分:4)
不,除非以该文件格式预先确定行长度(例如,所有具有固定长度的行),否则您必须逐行迭代以计算它们。
答案 7 :(得分:3)
另一种方式。
try (BufferedReader reader = Files.newBufferedReader(
Paths.get("file.txt"), StandardCharsets.UTF_8)) {
List<String> line = reader.lines()
.skip(31)
.limit(1)
.collect(Collectors.toList());
line.stream().forEach(System.out::println);
}
答案 8 :(得分:2)
如果你正在谈论一个文本文件,那么如果没有读取它之前的所有行,就没有办法做到这一点 - 毕竟,行是由换行符的存在决定的,所以必须要读取它。
使用支持readline的流,只需读取第一行X-1行并转储结果,然后处理下一行。
答案 9 :(得分:2)
在Java 8中,
对于小文件:
String line = Files.readAllLines(Paths.get("file.txt")).get(n);
对于大文件:
String line;
try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
line = lines.skip(n).findFirst().get();
}
在Java 7中
String line;
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
for (int i = 0; i < n; i++)
br.readLine();
line = br.readLine();
}
答案 10 :(得分:1)
对我有用: 我结合了答案 Reading a simple text file
但是我没有返回一个字符串,而是返回一个字符串的LinkedList。然后我可以选择我想要的那条线。
public static LinkedList<String> readFromAssets(Context context, String filename) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(context.getAssets().open(filename)));
LinkedList<String>linkedList = new LinkedList<>();
// do reading, usually loop until end of file reading
StringBuilder sb = new StringBuilder();
String mLine = reader.readLine();
while (mLine != null) {
linkedList.add(mLine);
sb.append(mLine); // process line
mLine = reader.readLine();
}
reader.close();
return linkedList;
}
答案 11 :(得分:1)
使用此代码:
import java.nio.file.Files;
import java.nio.file.Paths;
public class FileWork
{
public static void main(String[] args) throws IOException {
String line = Files.readAllLines(Paths.get("D:/abc.txt")).get(1);
System.out.println(line);
}
}
答案 12 :(得分:0)
public String readLine(int line){
FileReader tempFileReader = null;
BufferedReader tempBufferedReader = null;
try { tempFileReader = new FileReader(textFile);
tempBufferedReader = new BufferedReader(tempFileReader);
} catch (Exception e) { }
String returnStr = "ERROR";
for(int i = 0; i < line - 1; i++){
try { tempBufferedReader.readLine(); } catch (Exception e) { }
}
try { returnStr = tempBufferedReader.readLine(); } catch (Exception e) { }
return returnStr;
}
答案 13 :(得分:0)
你可以使用skip()函数跳过开头的行。
public static void readFile(String filePath, long lineNum) {
List<String> list = new ArrayList<>();
long totalLines, startLine = 0;
try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
totalLines = Files.lines(Paths.get(filePath)).count();
startLine = totalLines - lineNum;
// Stream<String> line32 = lines.skip(((startLine)+1));
list = lines.skip(startLine).collect(Collectors.toList());
// lines.forEach(list::add);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
list.forEach(System.out::println);
}
答案 14 :(得分:0)
您还可以查看BufferedReader的子类LineNumberReader。与readline方法一起,它还具有访问行号的setter / getter方法。在从文件中读取数据时跟踪读取的行数非常有用。
答案 15 :(得分:0)
您可以使用LineNumberReader而不是BufferedReader。通过api。你可以找到setLineNumber和getLineNumber方法。
答案 16 :(得分:0)
便捷方式-使用行号读取行。 假设行号从1开始到null。
public class TextFileAssignmentOct {
private void readData(int rowNum, BufferedReader br) throws IOException {
int n=1; //Line number starts from 1
String row;
while((row=br.readLine()) != null) { // Reads every line
if (n == rowNum) { // When Line number matches with which you want to read
System.out.println(row);
}
n++; //This increments Line number
}
}
public static void main(String[] args) throws IOException {
File f = new File("../JavaPractice/FileRead.txt");
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
TextFileAssignmentOct txf = new TextFileAssignmentOct();
txf.readData(4, br); //Read a Specific Line using Line number and Passing buffered reader
}
}
答案 17 :(得分:-7)
他们都错了我只是在大约10秒钟内写下这个。 有了这个,我设法在main方法中调用object.getQuestion(“linenumber”)来返回我想要的任何行。
public class Questions {
File file = new File("Question2Files/triviagame1.txt");
public Questions() {
}
public String getQuestion(int numLine) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(file));
String line = "";
for(int i = 0; i < numLine; i++) {
line = br.readLine();
}
return line; }}