InputStream.read()阻塞(干扰)执行

时间:2017-08-15 09:52:22

标签: java

我一直在编写基本的位级加密代码,我很确定算法是正确的。但我无法测试它。当我运行代码时,第一个循环(使用System.in.read())会阻塞代码。当我通过终端发送EOF信号时,代码不再进展 - 我在下一行检查了一些原始的print语句。

据我了解,发送EOF应该read()返回-1,退出循环。

我错过了什么?

谢谢。

public class BitLevel {

public static void main(String[] args) throws Exception {
    FileInputStream input = new FileInputStream(args[0]);
    FileOutputStream output = new FileOutputStream(args[1]);
    ArrayList<Integer> key = new ArrayList<Integer>();
    int i = 0;
    System.out.print("Enter key: ");
    System.out.flush();
    int c = System.in.read();
    while (c != -1) {
        key.add((Integer) c);
        c = System.in.read();
    }
    c = input.read();
    while (c != -1) {
        output.write(c ^ key.get(i).intValue());
        output.flush();
        i++;
        i = i % key.size();
    }
}

}

3 个答案:

答案 0 :(得分:0)

循环永远不会结束,因为“c”内部没有变化。我想你也打算在循环中调用c = input.read();

另外,BTW,你应该在完成它们后关闭它们。

答案 1 :(得分:0)

System.in.read()上的调用只读取一个字节。您可能希望使用Scanner,但要解决此问题,请查看此

 int c = System.in.read();
 while (c != -1) {
        key.add((Integer) c);
        System.in.read();
    }

您阅读c一次,并且永远不会通过阅读另一个在while循环中更改它。将其更改为

 int c = System.in.read();
 while (c != -1) {
        key.add((Integer) c);
        c = System.in.read();
    }

答案 2 :(得分:0)

返回-1,但您忘记存储返回值,以便进行测试。