ใน Java มีวิธีการอ่านบรรทัดใดบรรทัดหนึ่งจากไฟล์หรือไม่? ตัวอย่างเช่นอ่านบรรทัดที่ 32 หรือหมายเลขบรรทัดอื่น ๆ
ใน Java มีวิธีการอ่านบรรทัดใดบรรทัดหนึ่งจากไฟล์หรือไม่? ตัวอย่างเช่นอ่านบรรทัดที่ 32 หรือหมายเลขบรรทัดอื่น ๆ
คำตอบ:
หากคุณไม่มีความรู้มาก่อนเกี่ยวกับบรรทัดในไฟล์ไม่มีวิธีใดที่จะเข้าถึงบรรทัดที่ 32 ได้โดยตรงโดยไม่ต้องอ่าน 31 บรรทัดก่อนหน้านี้
นั่นเป็นความจริงสำหรับทุกภาษาและระบบไฟล์สมัยใหม่ทั้งหมด
อย่างมีประสิทธิภาพคุณจะอ่านบรรทัดจนกว่าคุณจะพบบรรทัดที่ 32
สำหรับไฟล์ขนาดเล็ก:
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();
}
ไม่ใช่ว่าฉันรู้ แต่สิ่งที่คุณทำได้คือวนรอบ 31 บรรทัดแรกโดยไม่ทำอะไรเลยโดยใช้ฟังก์ชัน readline () ของ BufferedReader
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();
แน่นอนว่า Joachim เปิดอยู่และการใช้งานทางเลือกกับ Chris '(สำหรับไฟล์ขนาดเล็กเท่านั้นเพราะโหลดทั้งไฟล์) อาจใช้ commons-io จาก Apache (แม้ว่าคุณอาจไม่ต้องการแนะนำการพึ่งพาใหม่สำหรับ สิ่งนี้หากคุณพบว่ามันมีประโยชน์สำหรับสิ่งอื่น ๆ ด้วยมันก็สมเหตุสมผล)
ตัวอย่างเช่น:
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)
คุณอาจลองทำดัชนี - ไฟล์อ่าน (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: ฉันเขียนห้องสมุดนี้
แม้ว่าจะกล่าวไว้ในคำตอบอื่น ๆ แต่ก็เป็นไปไม่ได้ที่จะไปถึงบรรทัดที่แน่นอนโดยไม่ทราบค่าชดเชย (ตัวชี้) มาก่อน ดังนั้นฉันจึงทำได้โดยการสร้างไฟล์ดัชนีชั่วคราวซึ่งจะเก็บค่าออฟเซ็ตของทุกบรรทัด หากไฟล์มีขนาดเล็กพอคุณสามารถจัดเก็บดัชนี (ออฟเซ็ต) ไว้ในหน่วยความจำได้โดยไม่ต้องใช้ไฟล์แยกต่างหาก
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 ดังที่แสดงด้านบน
หมายเหตุ : หากคุณต้องการทั้งหมดในบรรทัด "32" คุณเพียงแค่เรียก readLine () ที่มีอยู่ในคลาสอื่น ๆ '32' ครั้ง วิธีการข้างต้นมีประโยชน์หากคุณต้องการรับบรรทัดเฉพาะ (ตามจำนวนบรรทัดของหลักสูตร) หลาย ๆ ครั้ง
ขอบคุณ!
อีกวิธีหนึ่ง
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);
}
ไม่เว้นแต่ในรูปแบบไฟล์นั้นความยาวบรรทัดจะถูกกำหนดไว้ล่วงหน้า (เช่นทุกบรรทัดที่มีความยาวคงที่) คุณจะต้องวนซ้ำทีละบรรทัดเพื่อนับ
หากคุณกำลังพูดถึงไฟล์ข้อความไม่มีวิธีใดที่จะทำได้โดยไม่ต้องอ่านบรรทัดทั้งหมดที่อยู่ข้างหน้า - ท้ายที่สุดแล้วบรรทัดจะถูกกำหนดโดยการมีขึ้นบรรทัดใหม่ดังนั้นจึงต้องอ่าน
ใช้สตรีมที่รองรับการอ่านบรรทัดและอ่าน X-1 บรรทัดแรกและถ่ายโอนผลลัพธ์จากนั้นประมวลผลรายการถัดไป
ใน 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();
}
ที่มา: การอ่านบรรทัดที่ n จากไฟล์
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;
}
ได้ผลสำหรับฉัน: ฉันได้รวมคำตอบของการ อ่านไฟล์ข้อความธรรมดา ๆ
แต่แทนที่จะส่งคืนสตริงฉันกำลังส่งคืน LinkedList of Strings จากนั้นก็เลือกเส้นที่ต้องการได้เลย
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;
}
ใช้รหัสนี้:
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);
}
}
คุณสามารถใช้ LineNumberReader แทน BufferedReader ผ่าน api คุณสามารถค้นหาวิธี setLineNumber และ getLineNumber
คุณสามารถดูที่ LineNumberReader คลาสย่อยของ BufferedReader นอกจากวิธีการอ่านแล้วยังมีวิธี setter / getter เพื่อเข้าถึงหมายเลขบรรทัด มีประโยชน์มากในการติดตามจำนวนบรรทัดที่อ่านในขณะที่อ่านข้อมูลจากไฟล์
คุณสามารถใช้ฟังก์ชัน 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);
}
วิธีง่ายๆ - การอ่านบรรทัดโดยใช้หมายเลขบรรทัด สมมติว่าหมายเลขบรรทัดเริ่มต้นจาก 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
}
}
พวกเขาผิดทั้งหมดฉันเพิ่งเขียนสิ่งนี้ในเวลาประมาณ 10 วินาที ด้วยวิธีนี้ฉันสามารถเรียก 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; }}