按行读取文件并按行写入并添加行号
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();
}
解决方案有效并被封装,一切都很好,但是....我想知道是否有更好的解决方案,也许使用 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();
}