从Java.io.Reader获取有意义的文本

Tom*_*Tom 6 java java-io

我正在编写一个程序,我正在使用其他公司的库从他们的网站下载一些报告.我想在将这些报告写入文件之前解析这些报告,因为如果它们符合某些条件,我想忽略它们.

问题是,他们的方法叫做download(),返回一个java.io.Reader.唯一可用的方法是

int read(char[] cbuf);
Run Code Online (Sandbox Code Playgroud)

打印出这个返回的数组会给我带来无意义的字符.我想能够识别我正在使用的字符集或将其转换为字节数组,但我无法弄清楚如何做到这一点.我试过了

//retrievedFile is my Reader object
char[] cbuf = new char[2048];
int numChars = retrievedFile.read(cbuf);
//I've tried other character sets, too
new String(cbuf).getBytes("UTF-8");
Run Code Online (Sandbox Code Playgroud)

而且我害怕向一个更有用的读者倾斜,因为我无法确定它是否会起作用.有什么建议?

编辑

当我说它打印出"毫无意义的人物"时,我并不是说它看起来像Jon Skeet给出的例子.这很难描述,因为我现在不在我的机器上,但我认为这是一个编码问题.字符似乎具有与报告外观类似的缩进和结构.我星期二回来后会立即尝试这些建议(我只是一名实习生,所以我没有费心设置远程帐户或任何东西).

eva*_*ong 17

试试这个:

BufferedReader in = new BufferedReader(retrievedFile);
String line = null;
StringBuilder rslt = new StringBuilder();
while ((line = in.readLine()) != null) {
    rslt.append(line);
}
System.out.println(rslt.toString());
Run Code Online (Sandbox Code Playgroud)

不要将Reader强制转换为任何类,因为您不知道它的真实类型.而是使用BufferedReader并将Reader传递给它.并且BufferedReader将java.io.Reader的任何子类作为参数,因此保存以使用它.


Jon*_*eet 5

打印出来char[]本身可能会给您类似的东西:

[C@1c8825a5
Run Code Online (Sandbox Code Playgroud)

这只是调用的正常输出toString一对char在Java数组。听起来您想将其转换为String,可以使用String(char[])构造函数来完成。这是一些示例代码:

public class Test {
    public static void main(String[] args) {
        char[] chars = "hello".toCharArray();
        System.out.println((Object) chars);

        String text = new String(chars);
        System.out.println(text);
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一方面,java.io.Reader 具有read方法返回一个char[]-它具有在一个时间,其要么返回单个字符,或(更有效)的方法接受一个char[]填补用数据,和数据读出返回量。这实际上就是您的示例代码显示的内容。您只需要使用char数组和读取的字符数来创建new String。例如:

char[] buffer = new char[4096];
int charsRead = reader.read(buffer);
String text = new String(buffer, 0, charsRead);
Run Code Online (Sandbox Code Playgroud)

但是,请注意,它可能不会一次返回所有数据。您可以使用逐行阅读BufferedReader,也可以循环获取所有信息。番石榴在其CharStreams类中包含有用的代码。例如:

String allText = CharStreams.toString(reader);
Run Code Online (Sandbox Code Playgroud)

要么

List<String> lines = CharStreams.readLines(reader);
Run Code Online (Sandbox Code Playgroud)