FileInputStream返回null

时间:2014-12-17 05:20:16

标签: java fileinputstream

我有两个方法,都使用FileInputStream对象。 第一个返回预期值。这种方法很好。 但是第二种方法什么都不返回。传递给第二个方法的值不为null。 我需要获取传递给方法的文件的十六进制格式。 为什么会这样?请解释一下。 这是我的代码

public String binaryFile1(File file1){
        try{
        stringBuilder1=new StringBuilder();
        is1=new FileInputStream(file1);
        while(b!=-1){
            counter++;
            b=is1.read();
            String s = Integer.toHexString(b).toUpperCase();
        if (s.length() == 1) {
            stringBuilder1.append('0');
        }
            if(counter%5==0){
               stringBuilder1.append(s).append("\n");
               counter=0;
            }else
                stringBuilder1.append(s).append(' ');

        }
        is1.close();
        }catch(Exception e){
            e.printStackTrace();
        }

        return stringBuilder1.toString();
}


public String binaryFile2(File file2){
        try{
        stringBuilder2=new StringBuilder();
        is2=new FileInputStream(file2);
        while(b!=-1){
            counter++;
            b=is2.read(); //Here b does not get any content assigned.
            String s = Integer.toHexString(b).toUpperCase();
        if (s.length() == 1) {
            stringBuilder2.append('0');
        }
            if(counter%5==0){
               stringBuilder2.append(s).append("\n");
               counter=0;
            }else
                stringBuilder2.append(s).append(' ');
        }
        is2.close();
        }catch(Exception e){
            e.printStackTrace();
        }

        return stringBuilder2.toString(); //Here stringBuilder2 is null
}

1 个答案:

答案 0 :(得分:3)

由于b已共享且您未在binaryFile1之后重置,因此在binaryFile2开始时它仍为-1。我建议你用,

int b;
while ((b = is2.read()) != -1) {
  // ...
}

修改

完成后关闭资源非常重要。我还建议你尝试尽可能地限制变量范围。使用try-with-resources,您可以编写binaryFile2之类的

public String binaryFile2(File file) {
    StringBuilder sb = new StringBuilder();
    int counter = 0;
    try (InputStream is = new FileInputStream(file)) {
        int b;
        while ((b = is.read()) != -1) {
            counter++;
            String s = Integer.toHexString(b).toUpperCase();
            if (s.length() == 1) {
                sb.append('0');
            }
            sb.append(s);
            if (counter % 5 == 0) {
                sb.append(System.lineSeparator());
                counter = 0;
            } else {
                sb.append(' ');
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return sb.toString();
}