0

我当前的程序读取一个文件并将其复制到另一个目录,但我希望它将一个单个字符更改为 x,它由行号和行中字符数的两个整数给出。例如,如果 int line = 5 且 int char = 4,则第五行中的第四个字符变为 x,其余字符保持不变。如何将其添加到我的程序中?

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

public class copytest {

    public static void main(String[] args) throws Exception {       
        readFile();
    }

    public static void readFile() throws Exception {

        // Location of file to read
        File file = new File("Old.txt");

        Scanner scanner = new Scanner(file);

        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            //System.out.println(line);
            writeFile(line);
        }
        scanner.close();
        System.out.println("File Copied"); 
    }

    public static void writeFile(String copyText) throws Exception {

        String newLine = System.getProperty("line.separator");

        // Location of file to output
        Writer output = null;
        File file = new File("New.txt");
        output = new BufferedWriter(new FileWriter(file, true));
        output.write(copyText);
        output.write(newLine);
        output.close();     
    }
 }
4

2 回答 2

2

将循环更改为:

 int i=0;
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        if (i == lineNumber) {
            if (line.length() >= charNumber) {
                line = line.substring(0,charNumber) + wantedChar +
                       line.substring(charNumber);
            }
        }
        writeFile(line);
        i++;
    }

请注意,仅当行长时它才会替换字符。

于 2013-07-06T13:41:41.823 回答
0

Ran Eldan 已经回答了您的问题,但我想指出您的代码的其他几个主要问题:

  1. 您违反了 Java 的标识符样式规则。Java 类名应该是“驼峰式”,第一个字符应该是大写字母;IE

    public class copytest {
    

    应该

    public class CopyTest {
    

    这不仅仅是一个随机的挑剔。如果您忽略这些样式规则,那么当您的类名之一与您的...或其他人的代码定义的成员或包名冲突时,您很可能会陷入困境。这些错误很难被发现。

    当然,如果你无视风格规则,当其他程序员需要阅读你的代码时,你会不断受到批评。

  2. 你的writeFile方法效率极低。每次调用它时,您打开文件,写一行并再次关闭它。这导致每行写入至少 3 个系统调用。系统调用开销很大。

    除了效率低下之外,当程序多次运行时,您还会遇到处理现有输出文件的问题。

    您应该做的是在运行开始时打开文件一次,并在整个过程中使用相同的 BufferedWriter。

于 2013-07-06T14:50:06.410 回答