【问题标题】:Need Help Reading Data From Inputstream需要帮助从输入流中读取数据
【发布时间】:2010-07-28 13:34:03
【问题描述】:

我有一个机器人和一个在 GUI 上运行的 GUI 应用程序。我在机器人端有一个 while 循环,它不断向 GUI 发送数据。

在我发送一个值之前,我首先发送一个值,GUI 将使用该值来确定它必须在之后读取多少个连续值,例如我发送类似的东西;

dataout.writeInt(2);
dataout.writeInt(50);
dataout.writeInt(506);
dataout.writeInt(50);
dataout.flush 

这里 GUI 读取 2,然后在情况 2 下,它将读取接下来的两个整数。

在 GUI 端,我有 i while 循环,它位于一个线程的 run() 中,该线程连续地从输入流中读取数据。

在 GUI 的循环中,我有一个 switch case 语句。

例子

while(true){
int val = dataIn.readIn()

switch(val){

    case 1:
            int color = readInt();
      break;

case 2:
         int me= readInt();
         int you= readInt();
      break;

case 3:
         int megg = readInt();
         int youss = readInt();
          int mes = readInt();
         int youe = readInt();
      break;

}

} 

t 没有按我的意愿工作。这就是我得到的:

在它读取第一个 int 后,我​​得到一系列从输入流中读取的数字。我不知道这些数字是从哪里来的。

我认为如果它无法读取我发送的数字,那么它必须阻止,但事实并非如此。

对于上面的示例,这是我得到的:

2
1761635840
1946182912
1845523456
1761636096
1845523200
1006658048
16274152968 

2 之后的所有数字,我不知道它们来自哪里。它不会读取我发送的 2 之后的数字。

我尝试插入一些 Thread.sleep(1000) 但不起作用。

我做错了什么?需要帮助

代码

//This code on the robot


public class ForkliftColorSensorReader implements Runnable{

 DataOutputStream outputStream;
    ColorSensor colorSensor;


public ForkliftColorSensorReader(ColorSensor colorSensor, DataOutputStream outputStream) {

        this.outputStream = outputStream;
        this.colorSensor = colorSensor;
}


  public void run() {
        int code = 1;

        while (code == 1){

     try {
        Thread.sleep(1000);
    outputStream.writeInt(10);
    outputStream.flush();
    outputStream.writeInt(2);
    outputStream.flush();
    } catch (Exception e) {

                                }         
                 }



     try {
        Thread.sleep(1000);
    outputStream.writeInt(20);
    outputStream.flush();
    outputStream.writeInt(4);
    outputStream.flush();
    } catch (Exception e) {

                                }         
                 }

  }

}



//This code on the GUI

public class Receive  implements Runnable{


int num = this.dataIn.readInt();

public void run(){
switch(num){
    case 10:

    int color = this.dataIn.read();

    break;


    case 20:

    int c = this.dataIn.read();

    break;


default;


}

}

}


// I am using NXTConnector from the GUI to make the connection to the robot. 
//I then use the DataOutputstream from the connection to read the data

【问题讨论】:

    标签: java inputstream lejos-nxj


    【解决方案1】:

    文字intentions<b 对您有什么意义吗?您正在从输入流中读取它;这就是这些数字在某个字符集中对应的内容。我的猜测是你有一些 HTML 写入你的输出流。您确定您只写入 DataOutputStream 而不是同时写入底层 OutputStream 吗?另外,这真的是您阅读的代码的样子吗?如果有,readInt()方法是怎么定义的?

    编辑:用于解决上述问题的代码段。

    int input = 184549376 ;
    byte[] bytes = { (byte)(input >> 24), (byte)(input >> 16),
            (byte)(input >> 8), (byte)(input) };
    System.out.printf("int: %d hex: %08X string: %s",
            input, input, new String(bytes));
    

    EDIT #2:在您的代码中,您使用writeInt() 编写并使用read() 读取这正是我所说的那种非对称性.您必须使用readInt() 来读取使用writeInt() 编写的字段。 InputStream.read(),您正在使用什么,读取一个 byte 数据并将其存储在一个 int 中。不是你想要的。

    【讨论】:

    • 你说得对。非常感谢你。我现在得到不同的数字。 1677721600 184549376 1694498816 184549376 1694498816 请告诉我你是如何转换数字的,以便我可以用它来解决剩下的问题。感谢您的帮助
    • 我只是使用 Windows 计算器转换为十六进制,然后在 ASCII 表中查找每个字节。但我会发布一个同样的 Java 代码片段。
    • 顺便说一句,您似乎不再在阅读字符了。看看你是如何真正写作和阅读的会很有用。特别是,无论何时使用 DataInput/OutputStream,您的操作和排序都必须严格对称。
    • 感谢您的帖子。机器人不断向 GUI 发送信息,我必须阅读它们才能更新 GUI。有什么建议吗?我认为从 while 循环中读取是最好的方法。
    • 从 while 循环中读取是可以的。但是你没有给出一个正确的例子,所以我不能告诉你你是否做得正确。例如,您的示例中有拼写错误(readIn?),您还没有说 readInt() 是否应该是 dataIn.readInt() 或者它是否是您在其他地方定义的方法。另外,您的示例不对齐:在写入时,您在“2”之后写入三个整数,但当您阅读时,您在读取“2”后仅读取两个整数。
    猜你喜欢
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多