Java缓冲输入流不读取

时间:2016-12-06 21:39:06

标签: java

我在尝试找出缓冲输入流时遇到问题。我们不得不用Java创建一个文本编辑器程序。我在课堂上有一些例子作为指导,但仍然无法弄清楚。根据我的理解,我已经通过读取启动了循环,然后它应该将整个文件读入编辑器。我已经将read作为char进行了类型化,然后使用.toString将其设置为字符串。现在它编译,但冻结程序,所以我必须有一个无限循环,但我不确定为什么。

        //File open
    openItem.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        JFileChooser jfc = new JFileChooser();
        jfc.setCurrentDirectory(new File("."));
        int result = jfc.showOpenDialog(null);
        if (result == JFileChooser.APPROVE_OPTION)
            {
            File selectedFile = jfc.getSelectedFile();
            BufferedInputStream bis = null;
            try
            {
                bis = new BufferedInputStream( new FileInputStream(selectedFile) );
                char inChar = (char)bis.read();
                while(inChar != -1)
                {
                //inChar = (char)bis.read();
                String charToString = Character.toString(inChar);
                textArea.setText(charToString);
                }
            }
            catch (Exception e2)
            {
                e2.printStackTrace();
            }
            }
        }
    });

1 个答案:

答案 0 :(得分:2)

这里有一些问题。

问题1 BufferedInputStream#read()读取字节,而不是字符。它将产生"工作"对于ASCII流,但对于其他多字节编码(例如UTF-8)将失败。

问题2 char值在Java中未签名,因此表达式inChar != -1将始终为true。我认为这是导致您的申请冻结的原因。

问题3 :使用后您没有关闭文件。

由于将文件内容作为String读取的一般操作在代码的其他地方可能是有用的,因此将此功能作为单独的方法实现可能是值得的。

如果您想维护当前结构,则以下代码应该有效,但仍有问题1

public static String readFileAsString(File inputFile) throws IOException {
  try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFile))) {
    StringBuilder sb = new StringBuilder();
    for (int in = bis.read(); in != -1; in = bis.read()) {
      sb.append((char)in);
    }
    return sb.toString();
  }
}

使用Java读取整个文件作为String有更简单的方法。 Java8的一种可能性是这样的:

public static String readFileAsString(File inputFile) throws IOException {
  return new String(Files.readAllBytes(inputFile.toPath()));
}

使用默认字符集将字节转换为字符。