2016-04-19 5 views
1

Этот код Java компилируется. Но когда я запускал эту программу, она длилась очень долго и не получала никаких результатов, и, наконец, сказала runofoutspace, я думаю, она попала в бесконечный цикл, но я не могу понять, почему.Бесконечный цикл при попытке чтения и создания файла

import java.util.*; 
import java.io.*; 
public class Exercise3{ 
public static void main (String[] args){ 
File infile = new File(args[0]); 
File outfile = new File("Ex3.txt"); 
try { 
    Scanner scan = new Scanner(infile); 
    ArrayList<String> readFile = new ArrayList<String>(); 
    String findWord = args[1]; 
    String replaceWord = args[2]; 

    while(scan.hasNextLine()) 
    { 
    readFile.add(scan.nextLine()); 
    } 
    //System.out.println(readFile); 
    for (int i=0; i<readFile.size();i++) 
    { 
    String n = readFile.get(i); 
    n = n.replaceAll(findWord,replaceWord); 
    readFile.add(i,n); 
    } 

    PrintWriter output = new PrintWriter(outfile); 
    for (int i=0; i<readFile.size();i++) 
    { 
    output.println(readFile.get(i)); 
    } 
    output.close(); 
    scan.close(); 
} 
catch (FileNotFoundException e){ 
    System.err.println("file not found."); 
} 


    } 
} 
+0

Как ваша программа знает, что ей необходимо прекратить поиск ввода? –

ответ

2

Проблема заключается с:

for (int i=0; i<readFile.size();i++) 
    { 
    String n = readFile.get(i); 
    n = n.replaceAll(findWord,replaceWord); 
    readFile.add(i,n); 
    } 

Вы фактически приращением размера ArrayList, внутри для петли. readFile.add (i, n);. Размер readFile увеличивается на каждой итерации цикла, поэтому условие цикла никогда не будет оцениваться как false.

Когда вы добавляете новый элемент в индекс i, прежний элемент в индексе будет смещен вправо. Он не будет заменен.

+2

Ему действительно нужно вызвать '.set' вместо' .add' – Ferrybig

0

Эта задача может быть выполнена более простой с использованием новых API файлов/путей. Недостатком курса было использование add - действительно добавление.

Path infile = Paths.get(args[0]); 
Path outfile = Paths.get("Ex3.txt"); 
String findWord = args[1]; // Maybe Pattern.quote(args[1]) 
String replaceWord = args[2]; 

Charsetch charset = Charset.defaultCharset(); // StandardCharsets.UTF_8; 
List<String> lines = Files.readAllLines(inFile, charset); 
for (int i = 0; i < lines.size(); ++i) { 
    lines.set(i, lines.get(i).replaceAll(findWord, replaceWord)); 
} 
Files.write(outFile, lines, charset);