0

我在调试代码时遇到了一些问题,我设法调试了除一个之外的所有错误: Method ignores results of InputStream.read(),调试器(SpotBugs)说问题出在了,reader.read(buffer, 0, n)并建议我检查返回值,否则调用者将无法正确处理读取的字节数少于调用者请求的字节数。

    char[] buffer = new char[n];

    try{
        reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
        reader.read(buffer,0,n);
        reader.close(); 
    }
    catch(RuntimeException e) {
        throw e;
    }
    catch(Exception e) {
        System.out.println("Something went wrong");
    }
    for(int i=0;i<buffer.length;i++) {
        int swap = i % 2;
        if (Integer.toString(swap).equals(Integer.toString(1))) { 
            buffer[i] = ' ';
        }           
    }
    System.out.print(buffer);

我该如何修复这个错误?

4

2 回答 2

0

read()当与缓冲区一起使用时,返回实际读取的字节数(或 -1 表示流结束)。缓冲区可能没有被单次读取完全填满(尽管缓冲区很小,因为数据是按块传输的),所以你需要确保(即使用while循环)你已经读取了你想要的字节数至。

于 2019-02-20T19:56:28.757 回答
0

R. Castro 给了你很好的解释,但是缺少的(用明显的话)是你没有检查从文件中读取了多少字节。该数字可以与缓冲区的大小不同。这就是 spotbug 试图告诉你的。您的文件可以比缓冲区大小更长或更短。您没有处理文件长于缓冲区大小的情况。并且您需要将循环更改为读取的字节数比 buffer.length

于 2019-02-20T21:01:58.290 回答