1

我写了这个程序,但它从来没有达到line b. 我确信循环正在完成。有谁知道出了什么问题?:D 谢谢

while((x = inr.read(chars, 0, chars.length)) != -1){
    result += String.valueOf(chars[0]);
    Log.d("@@@", "a " + result);  // line a
};
Log.d("@@@", "a " + result); // line b

输出

05-31 10:18:20.249: D/@@@(676): Starting iMNSConnection...
05-31 10:18:20.249: D/@@@(676): Is trying to connect to server...
05-31 10:18:20.289: D/@@@(676): a W
05-31 10:18:20.289: D/@@@(676): a We
05-31 10:18:20.289: D/@@@(676): a Wel
05-31 10:18:20.289: D/@@@(676): a Welc
05-31 10:18:20.289: D/@@@(676): a Welco
05-31 10:18:20.294: D/@@@(676): a Welcom
05-31 10:18:20.294: D/@@@(676): a Welcome
05-31 10:18:20.294: D/@@@(676): a Welcome 
05-31 10:18:20.294: D/@@@(676): a Welcome !
05-31 10:18:20.294: D/@@@(676): a Welcome !!
05-31 10:18:20.294: D/@@@(676): a Welcome !!!
05-31 10:18:20.299: D/dalvikvm(676): GC_CONCURRENT freed 1196K, 36% free 16727K/25991K, paused 1ms+2ms, total 15ms
05-31 10:18:20.299: D/dalvikvm(676): WAIT_FOR_CONCURRENT_GC blocked 13ms

已编辑

实际上,我正在使用带有 Java 客户端的 C++ 服务器

C++ 端

char* classroomList = "{........}";
send(ConnectedSocket, classroomList, strlen(classrooomList), 0);

然后客户端 silde (Java) 如果我使用 BufferedReader 并且不打印任何内容。所以我用这个,

InputStreamReader inr = new InputStreamReader(ins);
char[] chars = new char[1024];
while((x = inr.read(chars, 0, chars.length - 1)) != -1){
    result += String.valueOf(chars);
}

输出如下:

05-31 10:47:32.464: D/@@@(14850): Is trying to connect to server...
05-31 10:47:32.494: D/@@@(14850): 11a Welcome !!!������...(and 2028 same characters)

所以我尝试添加这个

while((x = inr.read(chars, 0, chars.length - 1)) != -1){
    chars[x] = '\0';
    result += String.valueOf(chars);
    Log.d("@@@", x + "a " + result);
}

这在 Java 将数据结束到 C++ 服务器时起作用。我在 C++ 上执行此操作,但不适用于 Java

最后我试试这个,

while((x = inr.read(chars, 0, chars.length - 1)) != -1){
    chars[x] = '\0';
    result += String.valueOf(chars);
    Log.d("@@@", x + "a " + result);
}

或者使用 StringBuilder 也不起作用。

跟随SM工作后,

Log.d("@@@", "Waiting for server reply...");
            InputStream in = socket.getInputStream();
            InputStreamReader inr = new InputStreamReader(in);
            BufferedReader br = new BufferedReader(inr);

            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                Log.d("@@@", ": " + line);
                sb.append(line);
            }
            br.close();
            Log.d("@@@", ": " + sb.toString());

输出不通过 while 循环

05-31 11:04:37.734: D/dalvikvm(22624): GC_FOR_ALLOC freed 1621K, 39% free 15950K/25991K, paused 18ms, total 18ms
05-31 11:04:37.749: D/@@@(22624): Starting iMNSConnection...
05-31 11:04:37.749: D/@@@(22624): Is trying to connect to server...
05-31 11:04:37.759: D/@@@(22624): Waiting for server reply...
05-31 11:04:37.789: D/dalvikvm(22624): GC_CONCURRENT freed 1194K, 36% free 16744K/25991K, paused 1ms+1ms, total 13ms
05-31 11:04:37.789: D/dalvikvm(22624): WAIT_FOR_CONCURRENT_GC blocked 12ms
05-31 11:04:37.809: D/AbsListView(22624): Get MotionRecognitionManager
05-31 11:04:37.819: D/SensorManager(22624): unregisterListener::  Listener= android.view.OrientationEventListener$SensorEventListenerImpl@41d85420
05-31 11:04:37.819: D/Sensors(22624): Remain listener = Sending .. normal delay 200ms
05-31 11:04:37.819: I/Sensors(22624): sendDelay --- 200000000
05-31 11:04:37.819: D/SensorManager(22624): JNI - sendDelay
05-31 11:04:37.819: I/SensorManager(22624): Set normal delay = true
05-31 11:05:41.944: D/dalvikvm(22624): GC_CONCURRENT freed 1078K, 33% free 17590K/25991K, paused 21ms+20ms, total 82ms
4

2 回答 2

1

谁产生文本Welcome !!!?也许对方没有关闭流。

无论如何,您的代码是非常无效的。您正在创建许多 String 对象,每个读取的字符一个。如果您正在从流中读取文本,则最好使用以下内容:

BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
    sb.append(line);
}
br.close(); // and catch exception
于 2013-05-31T02:39:56.597 回答
0

Java 字符串不是以空值结尾的。如果您将x字节接收到byte[]缓冲区buffer中,则从中构造 String 的正确方法是new String(buffer, 0, x)

于 2013-05-31T11:08:19.530 回答