Java-код для удаления начальных строк файла, выполняющегося очень медленно

Я написал код Java, чтобы удалить начальные символы из файла с 200k-записями, файл удаляет исходные символы, но он читает файл строки за строкой и удаляет символы. Программа выполняется очень медленно. Любые настройки могут быть сделаны ниже кода, чтобы выполнить его быстрее?

Программа выполняет и записывает вывод в файл, но его очень медленный

import java.io.*;
import java.util.Scanner;

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

 // The name of the file to open.
 String inputfile = "C:\\Program Files\\eclipse\\twfiles.txt";
 String outputfile = "C:\\Program Files\\eclipse\\rename.txt";

 // This will reference one line at a time
 String line = "";
 int number_of_char_to_erased =19;

 try {
 // FileReader reads text files in the default encoding.
 FileReader fileReader = 
 new FileReader(inputfile);

 // Always wrap FileReader in BufferedReader.
 BufferedReader bufferedReader = 
 new BufferedReader(fileReader);

 while((line = bufferedReader.readLine()) != null) {
 System.out.println(line);

 File input = new File(inputfile);
 Scanner scan = new Scanner(input);
 File output = new File(outputfile);
 PrintStream print = new PrintStream(output);

 while (scan.hasNext()) {
 line = scan.nextLine();
 line = line.substring(number_of_char_to_erased);
 print.println(line);
 }

 scan.close();
 print.close();
 } 

 // Always close files.
 bufferedReader.close(); 
 }
 catch(FileNotFoundException ex) {
 System.out.println(
 "Unable to open file '" + 
 inputfile + "'"); 
 }
 catch(IOException ex) {
 System.out.println(
 "Error reading file '" 
 + inputfile + "'"); 
 // Or we could just do this: 
 // ex.printStackTrace();
 }
 }
}
2 ответа

Здесь, похоже, проблема заключается в том, что вы просто создали буферизованный читатель для чтения файла. Затем он считывает первую строку файла. Затем вы создаете сканер, чтобы читать ВСЕ строки в файле, опуская определенные символы. Затем ваш BufferedReader считывает следующую строку в файле. И процесс повторяется. Итак, все, что вам нужно сделать, это:

File output = new File(outputfile);
 PrintStream print = new PrintStream(output); 

 while((line = bufferedReader.readLine()) != null) {

 print.println(line.substring(number_of_char_to_erased);

 }
 print.close();

Это должно быть намного быстрее. В принципе, поскольку вы уже выделили строку для строки чтения из файла, вы можете просто распечатать эту строку, минус количество символов, в выходной файл. Весь цикл for со сканером был совершенно ненужным, и закрытие и открытие потока печати для каждой строки также было излишним.

EDIT: Убрана инструкция println, так как она немного замедлит ее.


Попробуйте это (Scanner и Println удалены, выходной файл реорганизуется вне цикла):

import java.io.*;

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

 // The name of the file to open.
 String inputfile = "C:\\Program Files\\eclipse\\twfiles.txt";
 String outputfile = "C:\\Program Files\\eclipse\\rename.txt";

 // This will reference one line at a time
 String line = "";
 int number_of_char_to_erased =19;

 try {
 // FileReader reads text files in the default encoding.
 FileReader fileReader = new FileReader(inputfile);

 // Always wrap FileReader in BufferedReader.
 BufferedReader bufferedReader = new BufferedReader(fileReader);

 File output = new File(outputfile);
 PrintStream print = new PrintStream(output);

 while((line = bufferedReader.readLine()) != null) {

 String trimmedLine = line.substring(number_of_char_to_erased);
 print.println(trimmedLine);


 } 

 // Always close files.
 bufferedReader.close();
 print.close(); 
 }
 catch(FileNotFoundException ex) {
 System.out.println(
 "Unable to open file '" + 
 inputfile + "'"); 
 }
 catch(IOException ex) {
 System.out.println(
 "Error reading file '" 
 + inputfile + "'"); 
 // Or we could just do this: 
 // ex.printStackTrace();
 }
}
}

licensed under cc by-sa 3.0 with attribution.