2

したがって、次のプログラムは、コマンドライン引数として入力ファイルと出力ファイルを取り込む必要があります。java FileCopy input.txt output.txtプログラムを実行するためにコマンドラインに入力しています。プログラムを実行すると、ファイル名がになりますargs。これをテストすると、argsに値がありません。さらに、へのメソッド呼び出しが機能しfileExists()ておらず、これらの呼び出しが実行されていない理由がわかりません。注意として、getOutputFileメソッドは不完全であり、上記のエラーのために現在実行されているコードはありません。

class FileCopy
{
public static void main(String[] args) throws IOException
{
    String infile = null;
    String outfile = null;
    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));    

    if (args.length >= 2) //both files given via command line
    {
        infile = args[0];
        if (fileExists(infile) == false)
        {
            infile = getInputFile();
        }
        outfile = args[1];
    }
    else if (args.length == 1) //input file given via command line
    {
        infile = args[0];
        outfile = getOutputFile(infile);
    }
    else //no files given on command line
    {
        infile = getInputFile();
        outfile = getOutputFile(infile);
    }

    //create file objects to use
    File in = new File(infile);
    File out = new File(outfile);

    /*
     *rest of code
     */
}

//get the input file from the user if given file does not exist
public static String getInputFile() //throws IOException
{
    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
    String fileName = null;
    boolean haveFile = false;

    while(haveFile == false)
    {
        System.out.println("Enter a valid filename for input:");
        System.out.print(">> ");
        try
        {
            fileName = stdin.readLine();
        }
        catch (IOException e)
        {
            System.out.println("Caught exception: " + e);
        }
        haveFile = fileExists(fileName);
    }

    return fileName;    
}

//get the output file and test things
public static String getOutputFile(String infile)
{
    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
    File input = new File(infile);
    String filename = null;
    boolean more = true;
    while(more)
    {
        System.out.println("Enter a valid filename for output:");
        System.out.print(">> ");
        try
        {
            filename = stdin.readLine();
        }
        catch (IOException e)
        {
            System.out.println("Caught exception: " + e);
        }
        File output = new File(filename);
        if (output.exists())
        {
            more = false;
        }
        if (filename == infile)
        {
            int selection;
            String inputString = null;

            System.out.println("The output file given matches the input file. Please choose an option:");
            System.out.println("1) Enter new filename");
            System.out.println("2) Overwrite existing file");
            System.out.println("3) Backup existing file");
            System.out.print(">> ");
            try
            {
                inputString = stdin.readLine();
            }
            catch (IOException e)
            {
                System.out.println("Caught exception: " + e);
            }
            selection = Integer.valueOf(inputString);
            switch (selection)
            {
                case 1: //new filename
                case 2: //overwrite
                case 3: //backup
                default: System.exit(0);
            }
        }
    }
    return null;
}

//check the given file to see if it exists in the current working directory
public static boolean fileExists(String n)
{
    return (new File(n)).exists();
}
}
4

3 に答える 3

0

クラスは公開されるべきではありませんか?

public class FileCopy

それで問題が解決するかどうかはわかりません。

于 2012-09-16T22:28:33.473 に答える
0

これをEclipseデバッガーでテストしたばかりで、コマンドライン引数がargsに正しく配置されているので、テストするファイルがプロジェクトフォルダーまたは実際のディレクトリ"。"にあるかどうかを確認できます。そうでない場合は、とにかく新しいファイルの入力を求められるためです。

 if (fileExists(infile) == false)
    {
        infile = getInputFile();
    }
于 2012-09-16T22:32:36.993 に答える
0

プロジェクトの構造に応じて、完全修飾パスを入力する必要があります。私のテスト環境では、デフォルトでIDEのプロジェクトのルートレベルになります。通常、new File(n)呼び出しはデフォルトでシステム依存のデフォルトディレクトリになります。私はこれをパッケージなしの単一のディレクトリからコンパイルして実行し、抽象ファイル名(つまりinput.txtoutput.txt)を正常に使用することができました。ユーザーに完全修飾ファイル名を提供するように強制すること、または少なくともargs値をチェックすることだけに害はありますか?これにより、ユーザーに追加のファイル名の入力を求めることを心配することなく、無効な引数で早期に失敗することができます。

于 2012-09-16T23:46:17.697 に答える