2015-06-09 3 views
-2

При чтении из InputStream, как мне преобразовать InputStream в объект java/scala? Пример использования, получение CSV-файла в виде потока и синтаксический анализ CSV по очереди, «на лету».Преобразование InputStream в объект Java/Scala

Например: у меня есть

case class Row(v1: String, v2: String, v3: String) 

и однорядные образце CSV-файла является (Энди Морган, мужчина). Теперь предположим, что я получаю этот CSV InputStream, и этот CSV имеет миллионы строк и не может храниться в памяти. Возможно ли применить InputStream к вышеупомянутому классу case, использовать его для моей цели, отбросить экземпляр этого класса case и повторить этот процесс для всего потока.

Смутное пример будет на линиях:

try(val inputstream = new FileInputStream("file.txt")) { 
    var data = inputstream.read(); 
    while(data != ???){ 
    ////// somehow convert/buffer the data and convert to Row class mentioned above 
    data = inputstream.read(); 
    } 
} 

Я хочу понять внутренности, так что я был бы очень благодарен решение в родной Java/Скале без 3-библиотеки сторонних производителей.

+0

Могу ли я узнать, почему это запрещено? Является ли вопрос недостаточно ясным и/или дублирующим и/или домашним заданием? – gashu

+0

Я не являюсь нисходящим, но я предполагаю, что в вашем вопросе есть некоторые непонятные моменты: 1. InputStream уже является объектом java \ scala, что может быть точкой его преобразования 2. Анализ означает создание объектов данных из структурированных текст. Итак, как структурирован текст и какие объекты данных необходимы вам в результате 3. Почему для этой задачи может потребоваться предварительная запись файлов? Как вы могли видеть, мой комментарий длиннее вашего вопроса. Будьте более наглядными, поставьте нам свой код – Odomontois

+0

~ Odomontis Я немного обновил вопрос. Все еще кажется неполным/запутанным? Спасибо за ввод. – gashu

ответ

0

На самом деле есть входной поток Java, называемый ObjectInputStream, который вы можете использовать для этой конкретной цели литья в качестве класса.

try{ 
    val fileInputStream = new FileInputStream("file.txt") 
    val objectInputStream = new ObjectInputStream(fileInputStream) 
    var data = objectInputStream.readObject.asInstanceOf[Row] 
    while(data != ???){ 
     /*Do stuff here*/ 
     data = objectInputStream.readObject.asInstanceOf[Row] 
    } 
}catch{ 
    /*Catch cases*/ 
} 

Конечно, это предполагает, что ваш InputStream струится эти объектов, в противном случае вам придется идти об этом по-разному. Если файл имеет большой размер для размещения в памяти для начала, вы можете рассмотреть возможность потоковой передачи этих объектов , а не делать это на принимающей стороне.

Я, однако найти этот class, который кажется довольно универсален, что имеет конструкторы, как так (среди многих других):

CSVFileReader(File f) /*or*/ CSVFileReader(String filename, CSVFormat format) 

Существует метод, чтобы читать построчно (readLine() который возвращает CSVLine) что может помочь вам преобразовать объект .

Надеюсь, это поможет!

Смежные вопросы