不能一起使用BufferedInputStream和BufferedReader

时间:2015-02-18 13:45:14

标签: java sockets bufferedreader bufferedinputstream

我尝试使用BufferedInputStream中的BufferedReader从套接字流中读取第一行,它读取第一行(1),这是此内容中某些内容(2)的大小我有另一个内容的大小( 3)

  1. 正确阅读... ( with BufferedReader, _bin.readLine() )
  2. 也正确阅读... ( with _in.read(byte[] b) )
  3. 无法阅读,似乎比我在(2)中阅读的内容更多内容
  4. 我认为问题是我尝试使用BufferedReader然后BufferedInputStream.阅读..有人可以帮助我吗?

    public HashMap<String, byte[]> readHead() throws IOException {
        JSONObject json;
        try {
            HashMap<String, byte[]> map = new HashMap<>();
            System.out.println("reading header");
            int headersize = Integer.parseInt(_bin.readLine());
            byte[] parsable = new byte[headersize];
            _in.read(parsable);
            json = new JSONObject(new String(parsable));
            map.put("id", lTob(json.getLong(SagConstants.KEY_ID)));
            map.put("length", iTob(json.getInt(SagConstants.KEY_SIZE)));
            map.put("type", new byte[]{(byte)json.getInt(SagConstants.KEY_TYPE)});
            return map;
        } catch(SocketException | JSONException e) {
            _exception = e.getMessage();
            _error_code = SagConstants.ERROR_OCCOURED_EXCEPTION;
            return null;
        }
    }
    

    抱歉英语不好,解释不好,我试着解释我的问题,希望你理解

    文件格式是这样的:

    size1
    {json, length is given size1, there is size2 given}
    {second json, length is size2}
    

    _in是BufferedInputStream();
    _bin是BufferedReader(_in);

    使用_bin,我读取第一行(size1)并转换为整数
    使用_in,我读取下一个数据,其中size2和此数据的长度为size1
    然后我试图读取最后的数据,其大小为size2
    像这样的东西:

    byte[] b = new byte[secondSize];
    _in.read(b);
    

    这里什么都没发生,程序暂停......

2 个答案:

答案 0 :(得分:1)

  

不能与BufferedInputStream和BufferedReader一起使用

那是对的。如果您在套接字[或任何数据源]上使用任何缓冲的流或读取器,则无论如何都不能使用任何其他流或读取器。数据将在缓冲流或读取器的缓冲区中丢失,即预读,并且不会对其他流/读取器可用。

您需要重新考虑您的设计。

答案 1 :(得分:0)

您创建了一个BufferedReader _bin BufferedInputStream _in 并阅读了将它们都归档,但它们的光标位置不同,所以第二次读取从头开始,因为你使用2个对象来读取它。你也应该用_in读取size1。

        int headersize = Integer.parseInt(readLine(_in));
        byte[] parsable = new byte[headersize];
        _in.read(parsable);

使用以下readLine以BufferedInputStream读取所有数据。

    private final static byte NL = 10;// new line
    private final static byte EOF = -1;// end of file
    private final static byte EOL = 0;// end of line

private static String readLine(BufferedInputStream reader,
            String accumulator) throws IOException {
        byte[] container = new byte[1];
        reader.read(container);
        byte byteRead = container[0];
        if (byteRead == NL || byteRead == EOL || byteRead == EOF) {
            return accumulator;
        }
        String input = "";
        input = new String(container, 0, 1);
        accumulator = accumulator + input;
        return readLine(reader, accumulator);
    }