尝试读取和创建文件时无限循环
Infinite loop when trying to read and create a file
此 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.");
}
}
}
问题在于:
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 处添加新元素时,索引处的前一个元素将右移。不会被取代。
使用较新的 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);
此 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.");
}
}
}
问题在于:
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 处添加新元素时,索引处的前一个元素将右移。不会被取代。
使用较新的 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);