Java - 从文本文件中简单阅读的常用做法是什么?

时间:2011-09-08 01:07:20

标签: java

经过长时间的中断后,我正在搞乱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)
    {
    }
}

这看起来很荒谬。

通常的模式是什么?

5 个答案:

答案 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);

来自IOUtils.toString()IOUtils.closeQuietly()Commons IO

答案 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文件,以便与现有类一起使用。