Java LeJOS:如何在NXT中成功地将整数数据写入文件

Java LeJOS:如何在NXT中成功地将整数数据写入文件,java,dataoutputstream,nxt,lejos-nxj,Java,Dataoutputstream,Nxt,Lejos Nxj,我正在做一个人工智能项目,我想在NXT上用模糊逻辑实现一个控制器。为了正确评估我的控制策略,我需要跟踪颜色传感器测量的信息和发送到电机的数据。为此,我尝试实现一个简单的代码,将一些类似的信息写入.txt文件。以下是我迄今为止所取得的成就: import java.io.*; import lejos.nxt.*; public class DataLogger { public static void main(String[] args) { int count

我正在做一个人工智能项目,我想在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);
        }
    }

}
import java.io.*;
导入lejos.nxt.*;
公共类数据记录器{
公共静态void main(字符串[]args){
整数计数=0;
FileOutputStream fileStream=null;
试一试{
fileStream=newfileoutputstream(新文件(“Test.txt”);
}捕获(例外e){
LCD.drawString(“无法生成文件”,0,0);
系统出口(1);
}
DataOutputStream数据流=新的DataOutputStream(fileStream);
做{
试一试{
dataStream.writeChars(String.valueOf(count));
flush();
计数++;
}捕获(IOE异常){
LCD.drawString(“无法写入文件”,0,1);
系统出口(1);
}
}而(计数<100);
试一试{
fileStream.close();
}捕获(IOE异常){
LCD.drawString(“无法保存文件”,0,1);
系统出口(1);
}
}
}
使用这段代码,我基本上是试图将0到99之间的数字写入一个名为Test.txt的文件。我不知道为什么,但程序是这样写数据的:

01 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(intb)
根据ASCII表写入数据)。我也尝试过使用BufferedOutputStream类,但没有成功。我可能做错了什么?

您使用了错误的方法将基本文本数据写入文件。从文档中:

FileOutputStream用于写入原始字节流,如图像数据。若要编写字符流,请考虑使用文件写入器。< /P> 此外,最好使用而不是手动关闭文件

下面是我测试过的测试类的更新版本:

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());
        }
    }

}
import java.io.*;
公共类数据记录器{
公共静态void main(字符串[]args){
整数计数=0;
字符串filename=“Test.txt”;
文件=新文件(文件名);
try(BufferedWriter=new BufferedWriter(new FileWriter(filename))){
如果(!file.exists()){
createNewFile();
}
做{
write.write(Integer.toString(count));
计数++;
}而(计数<100);
}捕获(IOE异常){
System.out.println(e.getMessage());
}
}
}
请记住,必须首先将整数转换为字符串,否则它将被视为字符引用


另外,
System.out.println()
可以与EV3一起使用,作为
LCD.drawString()
的替代,用于在LCD屏幕上的下一行上写入错误(带滚动),还可以将输出保存到EV3上的文件中以进行调试。

您使用了错误的方法将基本文本数据写入文件。从文档中:

FileOutputStream用于写入原始字节流,如图像数据。若要编写字符流,请考虑使用文件写入器。< /P> 此外,最好使用而不是手动关闭文件

下面是我测试过的测试类的更新版本:

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());
        }
    }

}
import java.io.*;
公共类数据记录器{
公共静态void main(字符串[]args){
整数计数=0;
字符串filename=“Test.txt”;
文件=新文件(文件名);
try(BufferedWriter=new BufferedWriter(new FileWriter(filename))){
如果(!file.exists()){
createNewFile();
}
做{
write.write(Integer.toString(count));
计数++;
}而(计数<100);
}捕获(IOE异常){
System.out.println(e.getMessage());
}
}
}
请记住,必须首先将整数转换为字符串,否则它将被视为字符引用


另外,
System.out.println()
可以与EV3一起使用,作为
LCD.drawString()
的替代品,用于在LCD屏幕上的下一行上写入错误(带滚动),还可以将输出保存到EV3上的文件以进行调试。

我通过简单地替换
dataStream.writeChars解决了这个问题(String.valueOf(count))
by
dataStream.writeBytes(String.valueOf(count))

我只需用
dataStream.writeChars(String.valueOf(count))
替换
dataStream.writeBytes(String.valueOf(count))
就解决了这个问题