经过长时间的中断后,我正在搞乱Java,而且我遇到了复杂的常见问题。
我有一个简单的问题,但是对于InputStreams,InputReaders,以及finally和close()的处理,我没有看到明显的答案。
我在一个简单的命令行应用程序的main()函数中。我已经解析了我的命令行,我有一个输入文件名。它包含文本文件的路径或“ - ”,这意味着程序应该从System.in中读取。
我想要的是一个包含文件内容(或System.in的其余内容)的String。我最终得到的结果太复杂了,所以我正在寻找简单的方法。
问题1:给定一个InputStream(可能是System.in或者它可能是一个FileInputStream()我自己打开了,将所有内容读入String的最简单方法是什么?各种readAll()方法我'已经看到返回的字节数组,有一个地方,但它不是我想要的。
问题2:确保我打开的所有读者都会被关闭的常用习惯是什么?
如果我是用C ++编写的,我会将close()放在我的类的析构函数中,并且当我的对象超出范围时,我确信会调用close()。
如果我用C#编写,我会使用“使用”块,并且我也有相同的保证。
我确信这可以用Java完成,但到目前为止我的尝试似乎很麻烦。
如果我尝试:
try
{
InputStream inStream = new InputStream(...);
}
finally
{
inStream.close();
}
我抱怨“inStream无法解决”。
但如果我尝试
InputStream inStream = null;
try
{
inStream = new InputStream(...);
}
finally
{
if (inStream != null)
inStream.close();
}
我得到“未处理的异常类型IOException。
所以现在我在:
InputStream inStream = null;
try
{
inStream = new InputStream(...);
}
finally
{
try
{
if (inStream != null)
inStream.close();
}
catch (IOException ex)
{
}
}
这看起来很荒谬。
通常的模式是什么?
答案 0 :(得分:4)
您可能想尝试使用Apache Commons IO为您包装一些内容。一个例子:
import org.apache.commons.io.FileUtils;
File f = new File("mystuff.txt");
String contents = FileUtils.readFileToString(f);
或者,如果你从一个流开始:
import org.apache.commons.io.IOUtils;
InputStream is = new InputStream(...);
String contents = IOUtils.toString(is);
还有更多: - )。
答案 1 :(得分:1)
我用
InputStream in = ...;
String content = IOUtils.toString(in);
IOUtils.closeQuietly(in);
答案 2 :(得分:0)
我通常会做以下事情:(注意:我没有展示inStream如何获取内容。)
InputStream inStream = null;
BufferedReader in = null;
try {
StringBuilder builder = new StringBuilder();
in = new BufferedReader(new InputStreamReader(inStream));
String str;
while ((str = in.readLine()) != null) {
builder.append(str).append("\n");
}
}
catch(Exception e) {
}
finally {
if(in != null) {
try {
in.close();
} catch (IOException e) {}
}
if(inStream != null) {
try {
inStream.close();
} catch (IOException e) {}
}
}
至于你对异常处理的抱怨,这是有道理的。如果出现问题,您可能想知道也可能不想知道。它为您提供了如何处理它的选项。
答案 3 :(得分:0)
升级到Java 7,然后您就可以从automatic resource management(try-with-resources声明)中受益:
try (InputStream inStream = new InputStream(...)) {
// ...
}
这是借鉴C#'s using
statement。
答案 4 :(得分:0)
如果你有能力使用Groovy,那就容易多了:
def file = new File('/my/path/test.txt')
def contents = file.getText()
Groovy将允许您在需要复杂性的情况下使用所需的任何Java方法,并将其编译为Java文件,以便与现有类一起使用。