我写了一个很小的“按Enter键继续”模块,但从中读取后,Java不允许我关闭BufferedInputStream。如果我关闭它,即使我先尝试再次打开它,当我再次调用该模块时,它也会显示“流关闭”错误。
import java.io.*;
final public class PressEnter {
public static void toContinue() {
try {
BufferedInputStream buff=new BufferedInputStream(System.in);
int in=buff.read();
buff.close();
}
catch (IOException e) { System.out.println("Error: "+e.getMessage()); }
}
}
我没有关闭BufferedInputStream,它可以正常工作,正如我所说的那样。留下buff.close错误。
public class TestPressEnter {
public static void main(String[] args) {
System.out.print("Press Enter To Continue...");
PressEnter.toContinue();
System.out.println("Continuing...");
System.out.print("Press Enter To Continue Again...");
PressEnter.toContinue();
System.out.println("Continuing...");
}
}
答案 0 :(得分:0)
即使重新实例化了已关闭的扫描仪,也无法重新打开它。参见Why is not possible to reopen a closed (standard) stream?
Hi this is Joeusername
是基础InputStream的包装,在本例中为b
。因此,在包装器上调用close也会关闭基础流。
您应该在方法调用之外实例化etTemplateMessage.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
final String strUserNameCode = "$username";
String text = s.toString();
if(text.contains(strUserNameCode)){
int startIndex = text.indexOf(strUserNameCode);
int endIndex = startIndex + strUserNameCode.length();
Editable profileName = new SpannableStringBuilder(FileUtil.getUTF8String(settingDTO.getProfileName()));
s.replace(startIndex, endIndex, profileName);
}
}
});
,而应在此处使用它来读取它。您可以创建一个新方法,并在读完主方法后将其关闭。
答案 1 :(得分:0)
OutputStream关闭的一般合同:
public void close() throws IOException
关闭此输出流并 释放与此流关联的所有系统资源。的 总的来说,关闭合约是关闭输出流。一种 封闭流无法执行输出操作,并且不能 重新打开。
PrintStream的
public void close()
关闭流。这是通过冲洗 流,然后关闭基础输出流。
我能给您的唯一建议是,您不应编写非对称代码,即不要将关闭您的代码创建的资源委托给其他地方。
即使您认为关闭包装程序流似乎是明智的,事实是您不应该因为关闭正在其他地方打开的流而已。