【问题标题】:can't work with BufferedInputStream and BufferedReader together不能同时使用 BufferedInputStream 和 BufferedReader
【发布时间】:2015-02-18 13:45:13
【问题描述】:

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

  1. 读取正确...( with 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 和此数据的长度是 size1
然后我试图读取最后一个数据,它的大小是 size2
像这样:

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

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

【问题讨论】:

  • @George您能通过输入文件示例解释您的情况吗?就像你有一个输入文件,因为它对于 Java 套接字、文件或其他源是相同的,你想要什么样的输出?如果你这样解释,我们会更清楚。
  • 请使用此信息编辑您的问题,从 cmets 很难读取。
  • 我已经编辑了问题

标签: java sockets bufferedreader bufferedinputstream


【解决方案1】:

不能同时使用 BufferedInputStream 和 BufferedReader

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

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

【讨论】:

  • @EJB当我使用BufferedInputStream时,Java中的Socket和文件有什么区别?
  • @erhun 从调用者的角度来看,没有。为什么要问?
  • @EJPSimple 我不知道:) 据我所知没有任何区别,我不想和你争论也许你误会了我,我想学习。
  • @erhun 如果您有问题,您应该将其作为问题发布。在 cmets 中将问题发布到其他问题的其他答案不是本网站的目的。这不是论坛。
【解决方案2】:

您创建一个BufferedReader _binBufferedInputStream _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);
    }

【讨论】:

  • @George它逐行读取文件,使用BufferedInputStream,读取直到读取的字节不等于newLine(asci code 10)。
  • 啊递归?有readByte,我觉得应该有readLine
  • 这个答案的第一句话是没有意义的。这段代码有很多问题,需要单独的答案才能全部列出。首先,您没有检查任何read() 调用返回的结果。 -1
  • @EJP请说明什么是无意义的并给出它的来源也请告诉我代码有什么问题,因为我已经使用了这个功能,这对我了解缺失点非常有用它。
  • Meanignless 是没有意义的。它没有零件。我已经告诉过你至少一件事代码有问题。我再给你一个:读入缓冲区的-1 字节值并不表示EOF。第三个问题:不要使用递归作为迭代机制。
猜你喜欢
  • 2012-05-13
  • 1970-01-01
  • 2023-03-07
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 2018-07-13
相关资源
最近更新 更多