我已经在一个类的单个方法中初始化了InputStream,并将其传递给下一个方法进行处理。InputStream本质上封装了CSV文件以进行处理。
另一个方法调用传入同一个InputStream的2个不同方法,一个用于检索标头,另一个用于处理内容。该结构如下所示:
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);
}
}
}
}
问题在于在BufferedReader
同一对象上创建两个Reader
。当您从中读取数据时BufferedReader
,它可能会读取比返回的数据更多的内容到其缓冲区中(因此而得名)。换句话说,即使您仅从中读取了一行BufferedReader
,InputStreamReader
可能仍从中读取了很多数据-
因此,如果您再次读取 该行InputStreamReader
,则会丢失该数据。该数据有效地被吸 从 该InputStreamReader
到 了BufferedReader
,因此让出来给客户端代码的唯一方法是从阅读它BufferedReader
。
换句话说,您声称:
不。fetchHeaders()仅读取包含标题的CSV的第一行。
是不正确的。它仅 使用 那么多的数据,但会 从中读取 更多数据InputStreamReader
。
正如Ilya所说,您只能BufferedReader
在原始之上创建一个InputStreamReader
,并将其传递给这两种方法。
fetchHeaders
然后可以使用它BufferedReader
来读取一行,然后processContentRows
可以使用来完成所需的操作BufferedReader
-这只是Reader
它需要知道的内容。
因此,稍微修改一下Ilya的示例:
public static void main(String[] args) {
FileInputStream fis = new FileInputStream("FileName.CSV");
BufferedInputStream bis = new BufferedInputStream(fis);
InputStreamReader isr = new InputStreamReader(bis);
BufferedReader br = new BufferedReader(isr);
processCSV(br);
}
private static void processCSV(BufferedReader reader) {
fetchHeaders(reader);
processContentRows(reader);
}
private static void fetchHeaders(BufferedReader reader) {
// Use reader.readLine() here directly... do *not* create
// another BufferedReader on top.
}
private static void processContentRows(Reader reader) {
// This could be declared to take a BufferedReader if you like,
// but it doesn't matter much.
}
问题内容: 我正在尝试编写一个读取HTTP请求和响应并对其进行解析的类。由于标题是普通文本,因此似乎最容易使用 BufferedReader 和 readLine 方法读取它们。这显然不会对数据主体起作用,因为它可能是二进制的,所以我想在读取头之后切换到读取原始字节。 现在,我正在做这样的事情: 问题是 BufferedReader 正在提前读取并吞噬流中的所有二进制数据,然后才有机会使用Bins
本文向大家介绍jQuery获取多种input值的简单实现方法,包括了jQuery获取多种input值的简单实现方法的使用技巧和注意事项,需要的朋友参考一下 获取input的checked值是否为true: 第一种: if($("input[name=item][value='val']").attr('checked')==true) //判断是否已经打勾 --注:name即控件name属性,va
我有两种不同类型的Avro数据,它们有一些公共字段。我想在映射器中读取这些公共字段。我想通过在集群中生成单个作业来阅读本文。 下面是示例avro模式 模式1: {“type”:“record”,“name”:“Test”,“namespace”:“com.abc.schema.SchemaOne”,“doc”:“Avro使用MR.存储模式”,“fields”:[{“name”:“EE”,“type
问题内容: 我有一个类,其中每30秒从一个后台线程填充一个映射,然后有一个方法,该方法将由多个读取器线程调用以获取可用的实时套接字,该套接字使用相同的映射来获取此信息。 如您在以上课程中所见: 从每30秒运行一次的单个后台线程,我使用所有活动套接字填充map。 然后,从多个线程中,我调用方法给我一个可用的实时套接字,该套接字使用map获取所需的信息。 我上面的代码线程安全吗,所有阅读器线程都可以正
问题内容: 有没有一种方法可以从用户输入中读取一个字符?例如,他们在终端上按一个键,然后将其返回(类似)。我知道Windows中有一个功能,但是我想要一些跨平台的功能。 问题答案: 以下是指向网站的链接,该网站说明了如何在Windows,Linux和OSX中读取单个字符:http : //code.activestate.com/recipes/134892/
我试图从mongodb查询中获取的值。 查询的代码: