【问题标题】:Java InputStream blocking only if used InputStreamReader仅在使用 InputStreamReader 时才阻塞 Java InputStream
【发布时间】:2016-10-12 01:03:39
【问题描述】:

我正在尝试访问 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 再读取一行,它读取正常,但如果我尝试使用 InputStream 读取 1 个字节,它会阻塞。

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    没错。 InputStreamReader 已缓冲,因此它会提前读取,因此您直接从 InputStream 读取的下一个字节无论如何都不会是您想要的。你不能这样做。

    【讨论】:

    • 那么你建议我做什么而不是使用 InputStreamReader ?
    猜你喜欢
    • 2016-06-18
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2011-03-12
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多