2016-06-23 7 views
3

원격 큰 csv 파일을 한 줄씩 (기본적으로 스트리밍) 읽어야한다는 요구 사항이 있습니다. 각각의 읽기 후에 나는 db에 레코드를 저장하고 싶습니다. 현재 아래의 코드를 통해이를 달성하고 있지만 완전한 파일을 다운로드하고 jvm 메모리에 보관하는지 잘 모르겠습니다. 나는 그렇지 않다고 생각한다. 좀 자바 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

답변 주셔서 감사합니다. –

관련 문제