LeJOS: Как успешно записать целочисленные данные в файл в NXT

Я работаю над каким-то проектом ИИ, в котором я должен реализовать контроллер с использованием нечеткой логики на моем NXT. Чтобы правильно оценить мою стратегию управления, мне необходимо отслеживать информацию, измеренную датчиком цвета, и данные, которые отправляются на двигатели. Для этого я пытался реализовать простой код для записи подобной информации в файл .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, но безуспешно. Что я могу делать не так?


person Mudkip    schedule 27.06.2015    source источник


Ответы (2)


Вы используете неправильный метод для записи основных текстовых данных в файл. Из документов Java 7 API:

FileOutputStream предназначен для записи потоков необработанных байтов, таких как данные изображения. Для записи потоков символов рассмотрите возможность использования 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());
        }
    }

}

Имейте в виду, что целое число должно быть сначала преобразовано в строку, иначе оно будет рассматриваться как ссылка на символ.

Кроме того, System.out.println() можно использовать с EV3 в качестве альтернативы LCD.drawString() для регистрации ошибок, поскольку он записывает следующую доступную строку на ЖК-экране (с прокруткой), а также сохраняет вывод в файл на EV3 для отладки.

person shea    schedule 07.07.2015

Я решил проблему, просто заменив dataStream.writeChars(String.valueOf(count)) на dataStream.writeBytes(String.valueOf(count)).

person Mudkip    schedule 12.03.2016