【发布时间】:2011-10-19 20:29:54
【问题描述】:
我已经在一个类的单个方法中初始化了一个 InputStream,并将它传递给下一个方法进行处理。 InputStream 本质上封装了 CSV 文件进行处理。
另一个方法调用 2 个不同的方法,传入相同的 InputStream 一个用于检索标头,另一个用于处理内容。结构如下所示:
main() {
FileInputStream fis = new FileInputStream("FileName.CSV");
BufferedInputStream bis = new BufferedInputStream(fis);
InputStreamReader isr = new InputStreamReader(bis);
processCSV(isr);
}
processCSV(Reader isr) {
fetchHeaders(isr);
processContentRows(isr);
}
fetchHeaders(Reader isr) {
//Use BufferedReader to retrieve first line of CSV
//Even tried mark() and reset() here
}
processContentRows(Reader isr) {
//Cannot read the values, fetches null from InputStream :(
}
我在这里做错了吗?有什么方法可以在不同的方法调用中重用 InputStream。
我正在建立可以模仿以下问题的完整程序:
import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class MarkResetTest
{
public static void main(String a[])
{
FileInputStream fis = null;
BufferedInputStream bis = null;
InputStreamReader isr = null;
BufferedReader br = null;
BufferedReader br2 = null;
try {
fis = new FileInputStream("C:/Test/Customers.csv");
bis = new BufferedInputStream(fis);
isr = new InputStreamReader(bis, "Unicode");
System.out.println("BR readLine()");
br = new BufferedReader(isr);
//System.out.println(br.markSupported());
br.mark(1000);
System.out.println(br.readLine());
br.reset();
//System.out.println(br.readLine());
System.out.println("BR2 readLine()");
br2 = new BufferedReader(isr);
System.out.println(br2.readLine());
}
catch(Exception e) {
System.out.println("Exception::" + e);
}
finally {
try {
br.close();
isr.close();
bis.close();
fis.close();
}
catch(Exception e) {
System.out.println("Exception while closing streams :: " + e);
}
}
}
}
【问题讨论】:
-
请展示一些在 fetchHeaders 和 processContentRows 中的代码。例如,fetchHeaders 是否真的一直读取到数据的末尾,而不是在 headers 的末尾停止?
-
不。 fetchHeaders() 仅读取包含标题的 CSV 的第一行。该语句是 br.readLine() 并且它不在循环中。
-
那么,你能想出一个简短但完整的程序来演示这个问题吗?
-
嗨乔恩,我已经用示例程序编辑了我的帖子。现在可以结账了吗?
标签: java inputstream java-io