【问题标题】:Infinite loop when trying to read and create a file尝试读取和创建文件时的无限循环
【发布时间】:2016-04-19 06:09:45
【问题描述】:

此 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.");
}


  }
}

【问题讨论】:

  • 你的程序怎么知道它需要停止寻找输入?

标签: java printwriter


【解决方案1】:

问题在于:

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

您实际上是在 for 循环内增加 ArrayList 的大小。 readFile.add(i,n); 。 readFile 的大小在每次循环迭代时都会增加,因此循环条件永远不会计算为 false。

当您在索引 i 处添加新元素时,索引处的前一个元素将向右移动。它不会被替换。

【讨论】:

  • 他实际上需要打电话给.set而不是.add
【解决方案2】:

使用较新的 Files/Path 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);

【讨论】:

    猜你喜欢
    • 2012-10-27
    • 1970-01-01
    • 2015-09-13
    • 2021-06-27
    • 2013-08-07
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多