我在尝试找出缓冲输入流时遇到问题。我们不得不用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();
}
}
}
});
答案 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()));
}
使用默认字符集将字节转换为字符。