LeJOS:如何在 NXT 中将整数数据成功写入文件
LeJOS: How write integer data succesfully to a file in 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));
是"most successfull"一种(其他如writeInt(int b)
是按照ASCII table写数据)。我也尝试过使用 BufferedOutputStream class,但没有成功。我可能做错了什么?
您使用错误的方法将基本文本数据写入文件。来自 Java 7 API 文档:
FileOutputStream is meant for writing streams of raw bytes such as image data. For writing streams of characters, consider using FileWriter.
此外,最好使用 try-with-resources 而不是手动关闭文件。
这是我测试过的测试 class 的更新版本:
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()
的替代方法,因为它会在 LCD 屏幕上的下一个可用行上写入(滚动)并保存输出到 EV3 上的文件进行调试。
我通过简单地将 dataStream.writeChars(String.valueOf(count))
替换为 dataStream.writeBytes(String.valueOf(count))
解决了这个问题。
我正在从事一些 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));
是"most successfull"一种(其他如writeInt(int b)
是按照ASCII table写数据)。我也尝试过使用 BufferedOutputStream class,但没有成功。我可能做错了什么?
您使用错误的方法将基本文本数据写入文件。来自 Java 7 API 文档:
FileOutputStream is meant for writing streams of raw bytes such as image data. For writing streams of characters, consider using FileWriter.
此外,最好使用 try-with-resources 而不是手动关闭文件。
这是我测试过的测试 class 的更新版本:
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()
的替代方法,因为它会在 LCD 屏幕上的下一个可用行上写入(滚动)并保存输出到 EV3 上的文件进行调试。
我通过简单地将 dataStream.writeChars(String.valueOf(count))
替换为 dataStream.writeBytes(String.valueOf(count))
解决了这个问题。