【问题标题】:file input stream odd behaviour文件输入流奇怪的行为
【发布时间】:2015-10-26 13:10:37
【问题描述】:

我有以下简单的代码,它从当前目录中的文件读取到字节数组并打印数组的内容(这是文件的内容,ASCII 可打印字符从 ASCII 32 到 ASCII 126):

import java.io.FileInputStream;
import java.io.IOException;

class Input {

  public static void main(String[] args) throws IOException {
    FileInputStream fis=null;
    try {
      fis=new FileInputStream("file.txt");
      int available=fis.available();
      byte[] read=new byte[available];
      int bytesRead;
      int offset=0;
      while(offset<read.length) {
        bytesRead=fis.read(read,offset,read.length-offset);
        if (bytesRead==-1) break;
        offset+=bytesRead;
      }
      System.out.println(read.length);
      for (byte b:read) {
        int i=b & 0xFF;
        System.out.write(i);
        System.out.write('\t');
      }
    }
    finally {
      if (fis != null)
        try {
          fis.close();
        }
        catch(IOException e) {
          e.printStackTrace();
        }
    }
  }

}

但是当它运行时,它只会在标准输出中打印 64 个字符(即使调试字符串在数组中打印了 96 个字节,因为它应该是..) 我不知道我做错了什么。

【问题讨论】:

  • file.txt 的内容是什么?文件中的某些字符可能无法打印。你真的期待什么?请注意,像这样读取文件是不合理的,您正在创建一个大小与文件大小相同的数组(可能很大)。你对b&amp;0xFF 有什么期待?
  • 文件内容在问题中
  • @Jean-BaptisteYunès 显然每个 ASCII 字符都是从 32 到 126。虽然那是 95 个字符而不是 96...
  • @Siguza 是的,我包括删除,即 127
  • @Siguza - 我也复制了,通过设置可用的各种数字。我认为这可能是一个写入缓冲区刷新问题 - 我在 for(byte b:read) 循环之后添加了一个 println,并开始获取输出。

标签: java io inputstream


【解决方案1】:

您需要flush()System.out,因为如果设置了autoFlush(默认),它只会在\n 上刷新。请参阅文档PrintStream 和选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 2015-09-10
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 2023-03-20
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多