0

我有一个运行方法,它启动一个新线程,并希望在它结束后从它启动另一个方法,但这不起作用。在方法的最后,我放了一些打印输出语句,它们只显示了几次,就像我第一次加载 java 程序时一样。通常他们不显示。

我想知道为什么它们没有出现,并且有一种可靠的方法,例如在 AsyncTask 的 onPostExecute() 中的回调方法,我可以在 Java 线程上使用它。

不知道为什么打印输出语句没有显示 98% 的时间。有任何想法吗?

这里有点困惑。因为我认为文件将到达末尾,而while循环中的count变量将变为0或-1,然后while循环将结束并执行进程,它将退出while循环并继续线程。这没有发生,也没有意义。

我收到的带有此代码的文件是完整的,没有问题。但是我需要启动另一个线程方法来向 Android 客户端发送一条消息,告诉它文件已成功接收。

其余的代码

 @Override
public void run() {

    FileOutputStream fos = null;
    BufferedOutputStream bos = null;
    BufferedInputStream bis = null;
    DataInputStream dis = null;
    int bufferSize = 0;

    File file = new File("/Users/UserName/sampleFile.db");

    // get input streams
    try {
    fos = new FileOutputStream(file);
    bos = new BufferedOutputStream(fos);
    bis = new BufferedInputStream(socket.getInputStream());
    dis = new DataInputStream(bis);
    } catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    try {
        bufferSize = socket.getReceiveBufferSize();
    } catch (SocketException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    int fileSizeFromClient = 0;
    long serialNumber = 0;

    try {
        fileSizeFromClient = dis.readInt();
        serialNumber = dis.readLong();
    } catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    String serialString = String.valueOf(serialNumber);

    System.out.println("filesize " + fileSizeFromClient);
    System.out.println("serialNumber " + serialString);
    System.out.println("bufferSize " + bufferSize);

    int count = 0;
    try {
        bos.flush();
    } catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    byte[] buffer = new byte[fileSizeFromClient];
    try {
        while((count = dis.read(buffer)) > 0){
            bos.write(buffer, 0, count);

           if(count == -1){ // <-- this line does not help break out of loop
             break;
            }


        }

        System.out.println("size of file written " + buffer.length); // <-- does not print out
        socket.close();

        System.out.println("test out 1"); // <-- does not print out

    } catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);

     } catch (Exception ex) {
            Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
        }

  System.out.println("test out 2"); // <-- does not print out

}  // end run

编辑:忘了提到这是针对 Java 桌面应用程序,而不是 Android,但它连接到的客户端是 Android 设备。任何文件的收发都没有问题,socket和TCP/IP文件联网没有问题

4

1 回答 1

2

我找到了问题的答案。

Java 服务器在此行卡住或挂起:

  while((count = dis.read(buffer)) > 0){
        bos.write(buffer, 0, count);

因为服务器连接到的 Android 客户端中的 outputStream 对象。如果您像这样关闭客户端中的 outputStream:

 dos.close();   // for DataOutputStream dos;

客户端中的 InputStream 对象没有任何作用,它只是 OutputStream。如果客户端中的 OutputStream 在 for 循环之后立即关闭,则它会停止 Java Sever 在其 for 循环中的阻塞或挂起。

来自 Android 客户端的代码

   while ((count = bis.read(bytes)) > 0) {
          dos.write(bytes, 0, count);
         }
             dos.close();

经过这次调整,Java 服务器中 for 循环之后的所有 System.out.println 语句现在都可以工作了。一直到run方法的最后一行。

于 2013-09-23T13:59:42.170 回答