Java InputStream仅在使用InputStreamReader时阻塞

时间:2016-10-12 01:03:39

标签: java sockets

我正在尝试访问InputStreamReader的底层InputStream,但它只阻塞即使有数据,当我使用InputStream而不读取InputStreamReader时,当我将InputStreamReader添加到InputStream时,我不能再使用底层的InputStream或它会阻止。

InputStream in = socket.getInputStream();
OutputStream theOutput = socket.getOutputStream();
BufferedReader br = new BufferedReader(
    new InputStreamReader(in, StandardCharsets.US_ASCII));

String line = br.readLine();
System.out.println(line);
if(line.equals(Operation_Map_Upload)){
  String MapName = br.readLine();
  System.out.println(MapName);

  String MapMaker = br.readLine();
  System.out.println(MapMaker);
  String MapData = br.readLine();
  System.out.println(MapData);

  int ThumbnailSize = Integer.parseInt(br.readLine());
  System.out.println(ThumbnailSize);
  byte[] Thumbnail = new byte[ThumbnailSize];
  in.read(Thumbnail, 0, ThumbnailSize); // <---block here
  int MapID = SaveMap(MapName, MapMaker, MapData, Thumbnail);

  theOutput.write(("Success;" + MapID).getBytes(StandardCharsets.US_ASCII));
  theOutput.flush();    
}

如果我使用InputStreamReader读取另一行,它会读取ok,但如果我尝试使用InputStream读取1个字节,它将阻塞。

1 个答案:

答案 0 :(得分:0)

这是正确的。 InputStreamReader被缓冲,因此它可以向前读取,因此您直接从InputStream读取的下一个字节将不是您想要的那个。你不能这样做。