2

現在、このプログラムをコマンドラインでボートの名前を入力できるように設定しています。つまり、 C:\java Proj3 "Boat 1" "Boat 2" "Boat 3" に基づいてコマンドラインに結果を出力します。仕様。代わりに、コマンドライン C:\java Proj3 "C:\class\Java\boatnames.txt" "C:\class\Java\results.txt" に次のように入力して、引数が指定されたファイルから取得されるようにします結果は、画面ではなくテキスト ファイルに出力されます。println を printf に変更しましたが、ここまでです。これで失敗した他のすべての試みを削除しました。プライベート Formatter x; を持つ createfile.java という別のクラスを作成してみました。いくつかのopenFile、closeFile、およびaddRecordsメソッドがありますが、出力をそこに移動してaddRecordsに入れようとすると、うまくいきません.

これが私のコードです(コマンドラインの引数をコマンドラインのtxtファイルの引数に置き換えるだけなので、他のクラスは含めませんでした):

import java.util.*;
import java.io.*;
import java.lang.*;
import java.swing.*;

public class Proj3 {
    public static void main(String args[]) {

            Boat[] Boats;
        char   firstChar;
        char   secondChar;
        int    i;    

        Boats = new Boat[args.length];

        for (i = 0; i < args.length; i++) {

            firstChar = args[i].toUpperCase().charAt(0);
            secondChar = args[i].toUpperCase().charAt(1);

            if ((firstChar == 'B') || (firstChar == 'C') || (firstChar ==     'N')) {
                Boats[i] = new SailBoat();
            } else {
                Boats[i] = new RaceBoat();
            }

            Boats[i].setName(args[i]);

            if ((secondChar == 'A') || (secondChar == 'E')) {
            Boats[i].goFast();
            } else {
                Boats[i].goSlow();
            }
        }


        for (i = 0; i < args.length; i++) {
            System.out.printf("Boat number " + (i + 1) + " - \n");
            System.out.printf("   ");
            Boats[i].printBoat();
            System.out.printf("   ");
            Boats[i].whatIsBoatState();
        }




    }
}
4

4 に答える 4

3

現在、最上位のプログラム ロジックは 1 つのモノリシックmain()メソッドに含まれています。作業を楽にするために、論理的な部分に分割し、各部分を個別のメソッドで実装する必要があります。たとえば、main()メソッドは次のようになります。

public static void main(String[] args) {
    ArrayList<Boat> boats = getBoats(args[0]);
    PrintStream out = getOutputStream(args[1]);
    printBoats(boats, out);
    out.close();
}

次に、サポート ルーチンを作成する必要があります。

private ArrayList<Boat> getBoats(String inputFileName) {
    ...
}
PrintStream getOutputStream(String outputFileName) {
    ...
}
void printBoats(ArrayList<Boat> boats, PrintStream output) {
    ...
}

I/O 例外 (ファイルの欠落、書き込み許可など) を処理するには、おそらくすべてをもう少し複雑にする必要があります。また、メソッドを変更しBoat.printBoat()、引数Boat.whatIsBoatState()を取る必要があります。PrintStream

于 2012-09-25T01:52:46.307 に答える
3

最も簡単な方法は、既存のライブラリを使用してファイルを読み込むことです。非常に一般的に使用されるライブラリは、ユーティリティ メソッドを持つapache commons-ioです。FileUtils.readLines()

import org.apache.commons.io.FileUtils;

// pass the filename is to your program on the command line

List<Sting> lines = FileUtils.readLines(new File(args[0]));
for (String line : lines) {
    // use "line" instead of args[i] in your current code
    ...
}
于 2012-09-25T01:47:43.640 に答える
1

私はこれをテストしていませんが、詳細をテストしていません

public static void main(String[] args) {

    if (args.length == 2) {

        String inFileName = args[0];
        String outFileName = args[1];

        File inFile = new File(inFileName);
        if (inFile.exists()) {

            try {

                List<Boat> boats = new ArrayList<Boat>(25);

                // Read the "boats" file...
                BufferedReader br = null;
                try {

                    br = new BufferedReader(new FileReader(inFile));
                    String text = null;
                    while ((text = br.readLine()) != null) {

                        char firstChar = text.toUpperCase().charAt(0);
                        char secondChar = text.toUpperCase().charAt(1);

                        Boat boat = null;
                        if ((firstChar == 'B') || (firstChar == 'C') || (firstChar == 'N')) {
                            boat = new SailBoat();
                        } else {
                            boat = new RaceBoat();
                        }

                        boat.setName(text);

                        if ((secondChar == 'A') || (secondChar == 'E')) {
                            boat.goFast();
                        } else {
                            boat.goSlow();
                        }

                        boats.add(boat);

                    }

                } finally {
                    try {
                        br.close();
                    } catch (Exception e) {
                    }
                }

                BufferedWriter bw = null;
                try {

                    bw = new BufferedWriter(new FileWriter(outFileName, false));
                    for (int index = 0; index < boats.size(); index++) {

                        bw.write("Boat number " + (index + 1) + " - ");
                        bw.newLine();
                        bw.write("    " + boat.toString() + "    " + boat.getBoatState());

                    }

                    bw.flush();

                } finally {
                    try {
                        bw.close();
                    } catch (Exception e) {
                    }
                }

            } catch (IOException exp) {
                exp.printStackTrace();
            }

        }

    }

}

Boatもう1つの問題は、クラスに追加機能を提供する必要があることです

つまり、印刷中の値を返す必要があるものと、印刷boat.toString()中の値を返す必要があるものを使用しましたBoat.printBoat()boat.getBoatState()Boat.getBoatState()

于 2012-09-25T01:52:57.847 に答える
1

これに従ってください

java-引数をメインメソッドに渡す

ファイルベースの絶対パスを取得し、ファイルオブジェクトを取得してから、ファイルオブジェクトを読み取ってコンテンツを取得します。

于 2012-09-25T01:42:56.960 に答える