繁体   English   中英

IOUtils.toString需要很长时间

[英]IOUtils.toString taking to long

我有一个此类,它将打开一个HTTP服务器并在端口上侦听。 答复是一个HTTP标头和一个json对象。 该类从服务器获取输入流,将其转换为字符串,过滤http头并解析json对象。

问题是从输入流到字符串的转换大约需要3秒钟。 有没有一种方法可以更快地读取输入流?

public class GamestateListener {

private static int PORT = 3001; // Port specified in your cfg
public static ServerSocket listenServer;
private static JSONObject MYJSONOBJ;

public GamestateListener() {
    try {
        listenServer = new ServerSocket(PORT); // open new Server Socket
        System.out.println("Started Socket..."); // printing out started
                                                    // listening
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public JSONObject listenAndParseJSON() throws IOException {

    System.out
            .println("Listening for connection on port " + PORT + " ...."); // printing
                                                                            // out
                                                                            // started
                                                                            // listening

    try (Socket socket = listenServer.accept()) { // wait for connection

        System.out.println("Start get From Socket           "
                + System.currentTimeMillis());
        InputStream mis = socket.getInputStream();
        System.out.println("Stop get From Socket           "
                + System.currentTimeMillis());
        String responseString = IOUtils.toString(mis, "UTF-8");
        System.out.println("Stop to String           "
                + System.currentTimeMillis());
        MYJSONOBJ = new JSONObject(responseString.substring(responseString
                .indexOf("{")));// split the response string

        return MYJSONOBJ;// return the json obj

    } catch (Exception e) {
        MYJSONOBJ = new JSONObject("{ERROR:True}");// create error obj
        return MYJSONOBJ;// return it
    }

}

}

您没有衡量自己的想法。 这里:

System.out.println("Start get From Socket           "
        + System.currentTimeMillis());
InputStream mis = socket.getInputStream();
System.out.println("Stop get From Socket           "
        + System.currentTimeMillis());

...您似乎认为getInputStream()返回时已经读取了所有数据。 你还没有 您只有可以读取的信息流。 这意味着存在连接,仅此而已。

如果您想测量仅读取所有数据 (而不是实际处理)所需的时间,则可以执行以下操作:

System.out.println("Start get From Socket           "
        + System.currentTimeMillis());
InputStream mis = socket.getInputStream();
byte[] buffer = new byte[8192];
// Read all the data (but ignore it)
while ((mis.read(buffer)) != -1) ;
System.out.println("Stop get From Socket           "
        + System.currentTimeMillis());

当然,剩下的代码将不再需要读取任何数据,但是您将看到仅读取数据需要多长时间。 我的猜测是大约3秒钟……这可能是由于网络速度慢,或者客户端花费很长时间甚至发送所有数据所致。 (它可以连接,睡眠2.9秒, 然后发送一堆数据。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM