1

私は、NXT でファジー ロジックを使用してコントローラーを実装することになっている AI プロジェクトに取り組んでいます。私の制御戦略を適切に評価するために、カラーセンサーによって測定された情報とモーターに送信されているデータを追跡する必要があります。このために、いくつかの同様の情報を .txt ファイルに書き込む簡単なコードを実装しようとしていました。これが私がこれまでに達成したことです:

import java.io.*;
import lejos.nxt.*;

public class DataLogger {

    public static void main(String[] args) {

        int count = 0;
        FileOutputStream fileStream = null;
        try {
            fileStream = new FileOutputStream(new File("Test.txt"));
        } catch (Exception e) {
            LCD.drawString("Can't make a file", 0, 0);
            System.exit(1);
        }

        DataOutputStream dataStream = new DataOutputStream(fileStream);

        do {
                try {
                    dataStream.writeChars(String.valueOf(count));
                   fileStream.flush();
                    count++;
                } catch (IOException e) {
                    LCD.drawString("Can't write to the file", 0, 1);
                    System.exit(1);
                }
        } while (count < 100);

        try {
            fileStream.close();
        } catch (IOException e) {
            LCD.drawString("Can't save the file", 0, 1);
            System.exit(1);
        }
    }

}

このコードでは、基本的に 0 から 99 までの数字を Test.txt というファイルに書き込もうとしています。理由はわかりませんが、プログラムは次のようにデータを書き込んでいます。

0 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 ...

ご覧のとおり、すべての桁の間に空白を追加しています。私はすでに DataOutputStream の多くの書き込み方法を試しましたdataStream.writeChars(String.valueOf(count));が、「最も成功した」方法でした ( writeInt(int b)ASCII テーブルに従ってデータを書き込むような他の方法)。BufferedOutputStream クラスも使用しようとしましたが、成功しませんでした。私が間違っている可能性があるのは何ですか?

4

2 に答える 2

0

基本的なテキスト データをファイルに書き込む方法が間違っています。Java 7 APIドキュメントから:

FileOutputStream は、画像データなどの raw バイトのストリームを書き込むためのものです。文字のストリームを書き込むには、FileWriter の使用を検討してください。

さらに、ファイルを手動で閉じるのではなく、try-with-resourcesを使用することをお勧めします。

私がテストしたテストクラスの更新版は次のとおりです。

import java.io.*;

public class DataLogger {

    public static void main(String[] args) {

        int count = 0;
        String filename = "Test.txt";
        File file = new File(filename);

        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) {

            if ( ! file.exists() ) {
                file.createNewFile();
            }

            do {

                writer.write(Integer.toString(count));
                count++;

            } while (count < 100);

        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

}

整数は最初に文字列に変換する必要があることに注意してください。そうしないと、文字参照として扱われます。

また、LCD 画面の次の使用可能な行に書き込み (スクロールあり)、デバッグ用に EV3 のファイルに出力を保存するため、エラーをリギングSystem.out.println()する代わりに EV3 で使用することもできます。LCD.drawString()

于 2015-07-07T08:11:22.437 に答える