gpt4 book ai didi

java - 为什么运行方法结束时的打印输出语句不打印出来

转载 作者:行者123 更新时间:2023-12-02 06:42:51 25 4
gpt4 key购买 nike

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

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

不知道为什么 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文件联网没有问题

最佳答案

我找到了问题的答案。

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 服务器在 for 循环中的阻塞或挂起。

来自 Android 客户端的代码

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

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

关于java - 为什么运行方法结束时的打印输出语句不打印出来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18959863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com