首页 > 解决方案 > 如何从 cmd 参数获取文件名以创建副本?

问题描述

我正在开发一个程序,该程序从具有我制作的自定义扩展名的文件中读取。这个想法是每次读取文件时都会创建一个错误报告。错误报告必须位于调用源文件的任何文件夹中。错误文件是源文件的副本,但它在每行的开头都有一个行号,并在该行的末尾指示该行是否发生错误。(我不是想设置这个问题的编号,这个问题只是关于创建副本)

例如,当我从命令提示符调用我的程序时:

C:\MyLocation>java =jar myJavaProgram.jar myFileToRead.CustomExtension 

除了读取文件之外,它还应该在名为 myFileToRead-ErrorReport.txt 的同一位置创建一个副本另外:如果源文件没有扩展名,我必须假设它仍然是正确的扩展名,所以不会总是有要替换为 .txt 的“.myCustomExtension”段

问题是我不知道如何获取文件名,因为它来自 main 方法的 args 列表。我正在使用以下内容来读取文件

public static void main(String[] args) throws FileNotFoundException {
        try{
            File inputFile = new File(args[0]);
        
            Scanner sc = new Scanner(inputFile);
            while(sc.hasNext()){
                System.out.println(sc.nextLine());
            }
        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
            System.out.println("File not found.");
        }
    }

那么我怎样才能得到那个文件名来制作类似的东西

File errorReport = new File("./" + inputFileName + ".txt");?

标签: javajava.util.scanner

解决方案


首先是代码。解释出现在代码之后。

public static void main(String[] args) {
    if (args.length < 1) {
        System.out.println("ERROR: Missing filename argument.");
    }
    else {
        String filename = args[0];
        if (filename.length() == 0) {
            System.out.println("ERROR: Empty filename argument.");
        }
        else {
            if (!filename.endsWith(".CustomExtension")) {
                filename += ".CustomExtension";
            }
            String name = filename.substring(0, filename.indexOf(".CustomExtension"));
            name += "-ErrorReport.txt";
            File inputFile = new File(filename);
            File directory = inputFile.getParentFile();
            File errorReport = new File(directory, name);
            System.out.println(errorReport.getAbsolutePath());
        }
    }
}

我养成了检查参数的习惯。因此,我首先检查是否提供了文件名。如果是,那么我检查它是否不是空字符串。请注意,我省略了一些检查,例如检查命名文件是否存在并且是否可读。

您在问题中写道,文件名参数可能包含也可能不包含.CustomExtension. 因此,我检查提供的名称是否以所需的扩展名结尾,并在必要时附加它。现在,由于我知道文件名以什么结尾,这意味着名称的必需部分是扩展名之前的所有内容,这就是调用substring()给我的内容。

获得所需名称后,我只需附加您要附加的部分,即-ErrorReport.txt.

getParentFile()类中的方法java.io.File返回文件所在的目录。因此我有输入文件所在的目录。最后我可以在与输入文件相同的目录中创建错误报告文件,并使用所需的文件名。为此,我使用java.io.File带有两个参数的类的构造函数。有关详细信息,请阅读javadoc

请注意,创建File对象不会创建文件。创建一个对象以写入文件,例如FileWriterOutputStreamWriter


推荐阅读