关于Java Socket读入字节流的问题

问题描述

InputStream读入字节时,CPU会爆满

问题出现的环境背景及自己尝试过哪些方法

经过排查修改,找到了问题,但是很迷惑,不知道为什么会出现这种情况,如图

clipboard.png

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

@Override
    public void run() {
        byte[] b = new byte[1024];
        InputStream is = null;
        OutputStream os = null;
        int n=0;
        try {
            is = readSocket.getInputStream();
            os = writeSocket.getOutputStream();
            while(!readSocket.isClosed() && !writeSocket.isClosed() && (n=is.read(b))>-1){
                //int size = is.read(b);

                os.write(b, 0, n);
                os.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            System.out.println("finally进入");
            try {
                if (is != null) {
                    is.close();
                }
                if (null != os) {
                    os.flush();
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

你期待的结果是什么?实际看到的错误信息又是什么?

我希望了解为什么n=is.read(b)这句代码放在不同的位置会造成完全不同的影响,感谢

阅读 2.8k
1 个回答

放到while里面是有判断的,读取不到数据不会进循环体。
你放到循环体里面的话,要对n加判断才行,不然CPU读不到数据也会往SOCKET写数据

while(!readSocket.isClosed() && !writeSocket.isClosed()){
                int size = is.read(b);
                if(size==-1) {
                    continue;
                }

                os.write(b, 0, n);
                os.flush();
            }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题