2016-06-23 3 views
3

У меня есть требование для чтения удаленных больших файлов csv по строкам (в основном по потоку). После каждого чтения я хочу сохранить запись в db. В настоящее время я достигаю его с помощью кода ниже, но я не уверен, что он загружает полный файл и сохраняет его в jvm-памяти. Я предполагаю, что это не так. Могу ли я написать этот код в лучшую сторону с помощью некоторых Java 8 потока особенностичтение удаленного файла csv без загрузки

URL url = new URL(baseurl); 
HttpURLConnection urlConnection = url.openConnection(); 
if(connection.getResponseCode() == 200) 
{ 
    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
    String current; 
    while((current = in.readLine()) != null) 
    { 
     persist(current); 
    } 
} 

ответ

2

Во-первых, вы должны использовать try-with-resources statement автоматически закрывать потоки, когда чтение выполняется.
Следующий BufferedReader имеет метод BufferedReader::lines, который возвращает Stream<String>.
Тогда ваш код должен выглядеть следующим образом:

URL url = new URL(baseurl); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
if (connection.getResponseCode() == 200) { 
    try (InputStreamReader streamReader = new InputStreamReader(connection.getInputStream()); 
     BufferedReader br = new BufferedReader(streamReader); 
     Stream<String> lines = br.lines()) { 
    lines.forEach(s -> persist(s)); //should be a method reference 
    } 
} 

Теперь это до вас, чтобы решить, если код лучше, и ваше предположение верно, что вы не держите весь файл в JVM.

+0

Спасибо за ответ. Попробую. –

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