首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BufferedInputStream available()

BufferedInputStream available()
EN

Stack Overflow用户
提问于 2011-11-21 17:02:18
回答 2查看 1.8K关注 0票数 2

我正在从套接字(通过TCP协议)读取消息,但是我注意到CPU花费了很多时间来调用我的BufferedInputStream的方法available()。这是我的代码:

代码语言:javascript
复制
    @Override
public void run()
{

    Socket socket;
    Scanner scanner;
    BufferedInputStream buffer = null;

    try
    {
        socket = new Socket(SERVER_HOST, SERVER_PORT);

        System.out.println("Connection Completed");

        InputStream inputStream = socket.getInputStream();
        buffer = new BufferedInputStream(inputStream);

        StringBuilder readCharacter;

        while (true)
        {

            readCharacter = new StringBuilder();
            try
            {

                while (buffer.available() > 0)
                {
                    readCharacter.append((char) buffer.read());
                }

            }
            catch (IOException e)
            {
                e.printStackTrace();
                buffer.close();
            }

            String array[] = separe(new String(readCharacter));
         ... //parsing the message

我还尝试使用int read=buffer.read()和check,而不是使用if (read!=-1)函数,但在这种情况下,我无法识别message...in my StringBuilder 'readCharacter‘的结尾。我有多条消息,一条在导致解析过程失败的other..and之后……

而不是使用available()检查,进入readCharacter我在time..and上只有一条消息解析工作……

你能帮助我理解为什么,以及如何避免CPU的消耗吗?

EN

回答 2

Stack Overflow用户

发布于 2011-11-21 17:17:25

此循环:

代码语言:javascript
复制
while (buffer.available() > 0)
  {
  readCharacter.append((char) buffer.read());
  }

可以替换为简单的:

代码语言:javascript
复制
readCharacter.append((char) buffer.read());

而不是一遍又一遍地调用非阻塞available() (这会消耗大量的CPU),只需调用read(),它将阻塞不消耗CPU,直到有可用的东西为止。看起来这就是你想要用更少的代码和复杂性来实现的。

票数 3
EN

Stack Overflow用户

发布于 2011-11-21 17:19:22

available()本身并不消耗CPU。你的循环是什么:

代码语言:javascript
复制
while (buffer.available() > 0) {
    readCharacter.append((char) buffer.read());
}

当字节不可用时,您实际上会多次(可能是数千次)调用available()。因为streams的read()方法被阻塞了,所以根本不需要调用available()。下面的代码执行相同的操作,但不占用CPU。

代码语言:javascript
复制
String line = null;
while ((line = buffer.read()) != null) {
    readCharacter.append(line);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8209395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档