0

The solution works and is capsulated and everything is fine, but .... I wonder if there is a better solution, maybe with new functions from Java 8 or some other improvements that can be done?

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(); 
    }

}
Vega
  • 2,661
  • 5
  • 24
  • 49
  • @Vega http://stackoverflow.com/questions/19605151/using-java-8-what-is-the-most-preferred-and-concise-way-of-printing-all-the-lin will be of benefit. – 01es May 12 '15 at 22:29

2 Answers2

2

Update

Didn't think file size was a concern given your posted example, but if it is you can read your file and write to a temp file all at once and then delete your old file and rename the new file to the old file name.

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);
}

If you're not dead set on having a reading & writing class, you could shorten all of your code to this...

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();
} 
Shar1er80
  • 9,001
  • 2
  • 20
  • 29
  • Wouldn't that collapse if I read a big file? File.readAllLines buffers the complete file in memory afaik before it does anything. – Vega May 12 '15 at 23:22
  • @Vega Didn't think file size was a concern for you, but see updated answer – Shar1er80 May 13 '15 at 00:15
1

Maybe the class will suite you (pay attention to getLineNumber() method): https://docs.oracle.com/javase/7/docs/api/java/io/LineNumberReader.html

Aliaxander
  • 2,547
  • 4
  • 20
  • 45
  • That looks nice, but I wonder if this is better than the new Java 8 Streams 01es linked above. Now I have 2 options, anyone know which one is better? – Vega May 12 '15 at 22:34