无法与 BufferedInputStream 和 BufferedReader 一起使用
can't work with BufferedInputStream and BufferedReader together
我正在尝试使用来自 BufferedInputStream 的 BufferedReader 从套接字流中读取第一行,它读取第一行 (1),这是此内容中某些内容的大小 (2) 我有另一个内容的大小 ( 3)
- 正确读取...
( with BufferedReader, _bin.readLine() )
- 也读对了...
( with _in.read(byte[] b) )
- 不会看,好像内容比我在(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);
此处没有任何反应,程序已暂停...
你创建一个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);
}
can't work with BufferedInputStream and BufferedReader together
没错。如果您在套接字 [或实际上任何数据源] 上使用任何缓冲流或 reader,则您不能使用任何其他流或 reader。数据将在缓冲流或reader的缓冲区中获得'lost',即预读,并且不会对其他stream/reader。
可用
你需要重新考虑你的设计。
我正在尝试使用来自 BufferedInputStream 的 BufferedReader 从套接字流中读取第一行,它读取第一行 (1),这是此内容中某些内容的大小 (2) 我有另一个内容的大小 ( 3)
- 正确读取...
( with BufferedReader, _bin.readLine() )
- 也读对了...
( with _in.read(byte[] b) )
- 不会看,好像内容比我在(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);
此处没有任何反应,程序已暂停...
你创建一个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);
}
can't work with BufferedInputStream and BufferedReader together
没错。如果您在套接字 [或实际上任何数据源] 上使用任何缓冲流或 reader,则您不能使用任何其他流或 reader。数据将在缓冲流或reader的缓冲区中获得'lost',即预读,并且不会对其他stream/reader。
可用你需要重新考虑你的设计。