java - 不能与 BufferedInputStream 和 BufferedReader 一起使用

标签 java sockets bufferedreader bufferedinputstream

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

  1. 正确读取...(使用 BufferedReader, _bin.readLine() )
  2. 读取也正确...( with _in.read(byte[] b) )
  3. 不会读,似乎 (2) 中的内容比我读的内容多

我认为问题是我正在尝试使用 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 是 size2,该数据的长度是 size1
然后我尝试读取最后一个数据,它的大小是size2
像这样的东西:

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

这里没有任何反应,程序已暂停...

最佳答案

can't work with BufferedInputStream and BufferedReader together

这是正确的。如果您在套接字上使用任何缓冲流或读取器[或实际上任何数据源],则您不能使用任何其他流或读取器。数据将在缓冲流或读取器的缓冲区中“丢失”,也就是说预读,并且无法供其他流/读取器使用。

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

关于java - 不能与 BufferedInputStream 和 BufferedReader 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28585177/

相关文章:

java - 如何在 Java 中使用 SHA-512 对密码进行哈希处理?

java - print 阻塞 BufferedReader 输入?

sockets - 蓝牙 Secureaccept() 失败、Nexus 7、Android 4.2.2

java - 声明数组以在 while 循环之外使用它

java - BufferedReader 在 java 中如何工作

java - 以编程方式单击 swt 中的组合框按钮

java - 使用 Spring Boot 的 Facebook Messenger 机器人?

java - 为什么方法中的 if-else if-else(在循环内)给出 "return statement missing"而所有 if-else 分支都有返回语句?

从类型 int 分配给类型 char[2] 时出现“不兼容类型”的编译错误

java - 为什么我的 Java 线程不同时运行?