Проблема заключается в создании двух BufferedReader
поверх одного и того же Reader
.Когда вы читаете данные из BufferedReader
, скорее всего, они прочитают больше, чем данные, которые они возвращают, в свой буфер (отсюда и имя).Другими словами, даже если вы прочитали только одну строку из BufferedReader
, InputStreamReader
может иметь намного больше данных, прочитанных с него - так что если вы прочитаете снова из этого InputStreamReader
тогда вы пропустите эти данные.Данные фактически были высосаны из InputStreamReader
в BufferedReader
, поэтому единственный способ передать их клиентскому коду - это прочитать их из этого BufferedReader
.
Другими словами, вы утверждаете, что:
Нет.fetchHeaders () читает только первую строку CSV, содержащую заголовки.
неверно.Он только использует такого количества данных, но он читает больше из InputStreamReader
.
Как сказал Илья, вы должны создать только один BufferedReader
поверхисходный InputStreamReader
и передать его в оба метода.
fetchHeaders
может затем использовать это BufferedReader
для чтения строки, а processContentRows
может делать то, что ему нравится, с BufferedReader
при этомточка - это всего лишь Reader
, насколько это необходимо знать.
Итак, чтобы немного изменить пример Ильи:
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.
}