我在更改文件中的行时遇到问题,此代码的目的是将文件的第一个数字更改为自身+ 1.由于某种原因,代码似乎没有一切正常,任何帮助将不胜感激!
public static void changenumber(String fileName)
{
ArrayList<String> list = new ArrayList<String>();
File temp = new File(fileName);
Scanner sc;
try {
sc = new Scanner(temp);
while (sc.hasNextLine())
{
list.add(sc.nextLine());
}
sc.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
String first = list.get(0);
int i = Integer.parseInt(first);
i = i+1;
first = Integer.toString(i);
list.set(0, first);
writenumber(list,fileName);
}
public static void writenumber(ArrayList<String> list, String fileName)
{
PrintWriter write;
try {
write = new PrintWriter(new FileWriter(fileName, true));
for(int i = 0; i<list.size();i++)
{
write.append(list.get(i));
}
}
catch(IOException err)
{
err.printStackTrace();
}
}
答案 0 :(得分:1)
您的问题是您从未关闭FileWriter
。
使用try-with-resources确保正确关闭文件流。
您的代码的其他一些改进:
不要忽略异常。继续执行 - 如果没有发生任何不好的事情将导致许多问题。让异常退回到调用者,并让调用者决定在无法更新文件时该怎么做。
Scanner
很慢。由于您正在阅读所有内容,请改为使用BufferedReader
。
内存中的行不以换行符结尾,因此在将行写回时需要使用println()
方法,否则结果是一个文件,其中所有行连接成一行单行。
重命名的变量更具描述性。
public static void changenumber(String fileName) throws IOException {
ArrayList<String> lines = new ArrayList<>();
try (BufferedReader in = new BufferedReader(new FileReader(fileName))) {
for (String line; (line = in.readLine()) != null; ) {
lines.add(line);
}
}
int i = Integer.parseInt(lines.get(0));
i++;
lines.set(0, Integer.toString(i));
writenumber(lines, fileName);
}
public static void writenumber(List<String> lines, String fileName) throws IOException {
try (PrintWriter out = new PrintWriter(new FileWriter(fileName, true))) {
for (String line : lines) {
out.println(line);
}
}
}
当然,您可以使用Java 7中添加的较新NIO.2类,特别是java.nio.file.Files
类来极大地简化代码。
public static void changenumber(String fileName) throws IOException {
Path filePath = Paths.get(fileName);
List<String> lines = Files.readAllLines(filePath);
lines.set(0, Integer.toString(Integer.parseInt(lines.get(0)) + 1));
Files.write(filePath, lines);
}