LeJOS: Как успешно записать целочисленные данные в файл в NXT
Я работаю над каким-то AI-проектом, в котором я должен реализовать контроллер с использованием нечеткой логики на моем 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, но безуспешно. Что я мог делать неправильно?
2 ответа
Я решил проблему, просто подставив dataStream.writeChars(String.valueOf(count))
от dataStream.writeBytes(String.valueOf(count))
,
Вы используете неправильный метод для записи основных текстовых данных в файл. Из документации по API Java 7:
FileOutputStream предназначен для записи потоков необработанных байтов, таких как данные изображения. Для записи потоков символов рассмотрите возможность использования FileWriter.
Кроме того, рекомендуется использовать попытку с ресурсами, а не закрывать файл вручную.
Вот обновленная версия вашего тестового класса, которую я тестировал:
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 для отладки.