按行读取文件并按行写入并添加行号

Read file by line and write by line with the line number added

解决方案有效并被封装,一切都很好,但是....我想知道是否有更好的解决方案,也许使用 Java 8 的新功能或可以完成的其他一些改进?

Main.java

package test;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

class Main {
public static void main(String[] args) {

    // zum speichern der Zeilen je Arrayfeld
    List<String> lines = new ArrayList<String>();

    // Inputdatei bestimmen
    File file = new File("C:\...\test.txt");

    // Inputdatei zeilenweise einlesen
    ReadFile readfile = new ReadFile();
    try {
        // und in der ArrayList "lines" speichern
        lines = readfile.byLine(file);
    } catch (IOException e) {
        e.printStackTrace();
    }

    // Inputdatei zeilenweise schreiben (neue Datei) mit Zeilennummer
    WriteFile writefile = new WriteFile();
    try {
        writefile.byLine(lines);
    } catch (IOException e) {
        e.printStackTrace();
    }

}   
}

ReadFile.java

package test;

import java.util.List;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class ReadFile {

List<String> lines = new ArrayList<String>();
String line;
int lineNumber = 0;

protected List<String> byLine(File file) throws IOException {
    // Inputdatei einlesen
    FileReader fileReader = new FileReader(file);
    BufferedReader bufferedReader = new BufferedReader(fileReader);

    // schauen ob Zeilenende erreicht wurde
    while ((line = bufferedReader.readLine()) != null ) {
        // Zeilen in Array speichern
        lines.add(line);
    }

    // Reader schließen
    bufferedReader.close();
    // Array zurückgeben
    return lines;
}
}

WriteFile.java

package test;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

public class WriteFile {

int lineNumber = 1;

protected void byLine(List<String> lines) throws IOException {
    // neue Datei erstellen
    PrintWriter writer = new PrintWriter("C:\...\test2.txt", "UTF-8");
    // für jeden String (eingelesene Zeile) in der Arraylist
    for( String line: lines) {
        // Counter für die Zeilennummern
            writer.println("*/ " + lineNumber + " /*" + " " + line);
            lineNumber++;
        }
    // Writer schließen
    writer.close(); 
    }

}

也许class适合你(注意getLineNumber()方法): https://docs.oracle.com/javase/7/docs/api/java/io/LineNumberReader.html

更新

考虑到您发布的示例,文件大小不是问题,但如果是,您可以一次读取文件并写入临时文件,然后删除旧文件并将新文件重命名为旧文件名。

public static void main(String[] args) throws Exception {
    insertLineNumbersIntoFile("C:\...\test2.txt");
}

private static void insertLineNumbersIntoFile(String filePath) throws Exception {
    String tempFile = "temp.txt";

    // Open reader and writer
    FileWriter writer = new FileWriter(tempFile);
    FileReader fileReader = new FileReader(filePath);
    BufferedReader bufferedReader = new BufferedReader(fileReader);

    // Read lines
    int lineNumber = 1;
    String line = "";
    while ((line = bufferedReader.readLine()) != null) {
        // Insert line number
        line = "*/ " + lineNumber + " /* " + line;
        // Write new line to new file
        writer.write(line + "\r\n");
        // Increment line number
        lineNumber++;
    }

    // Close reader and writer
    bufferedReader.close();
    writer.close();

    // Delete old file and rename new file to old
    File oldFile = new File(filePath);
    File newFile = new File(tempFile);

    oldFile.delete();
    newFile.renameTo(oldFile);
}

如果您对阅读和写作没有死心塌地class,您可以将所有代码缩短为...

public static void main(String[] args) throws Exception {
    List<String> lines = Files.readAllLines(Paths.get("C:\...\test2.txt"));

    FileWriter writer = new FileWriter("C:\...\test2.txt"); 
    for (int i = 0; i < lines.size(); i++) {
        lines.set(i, "*/ " + (i+1) + " /* " + lines.get(i));
        writer.write(lines.get(i) + "\r\n");
    }
    writer.close();
}