2016-09-21 1 views
1

Stream<String>을받는 함수가 있습니다. 이 스트림은 파일의 행을 나타냅니다 (Files.lines(somePath)로 불림). 내가 파일 시스템에 여러 개의 물리적 파일로 스트림을 변환해야문자열 스트림을 그룹화 된 문자열 목록으로 변환하는 효과적인 방법

 
__HEADER__ # for file 1 
data 
more data 
... 
__HEADER__ # file 2 starts here 
some more data... 
... 

: 파일 자체는 실제로 하나의 파일로 여러 파일의 연결이 같은 것입니다.

String allLinesJoined = lineStream.collect(Collectors.joining()); 
// This solution seems to get stuck on the line above^
String files[] = allLinesJoined.split("__HEADER__"); 
for (fileStr : files) 
{ 
    // This function will write each fileStr to a separate file 
    // (filename is determined by contents of fileStr) 
    writeToPhysicalFile(fileStr); 
} 

그러나 입력 파일에 대한 300 ~ MB입니다 (더 큰 얻을 수)와이 솔루션은 1 일에 집착하는 것 같다

나는의 라인을 따라 뭔가, 간단한 접근 방법을 시도했습니다 선. 더 많은 기억이 있다면 아마도 끝날거야 ...?

시작 지점이 Stream<String> 인 경우 더 좋은 방법이 있습니까? 아니면 스트리밍 API를 사용하지 않고이 코드를 한 행씩 파일을 읽을 수 있도록 다른 변경을 시작해야합니까?

(라인의 순서는이 파일의 맥락에서, 중요합니까)

TL; DR

나는 많은 작은 파일에 Stream<String>로 표현 하나 개의 큰 파일을 설정해야합니다. 각각의 작은 파일은 __HEADER__으로 시작하고 모든 줄은 다음에 __HEADER__까지 이어집니다. 현재 라이브러리는 스트림을 사용하여 파일을 제공하지만 스트림으로이 작업을 시도해 볼 가치가 있습니까? 그렇지 않으면 라이브러리를 변경하여 비 스트림 기능을 제공하면 내 인생이 더 쉬워 집니까?

+0

가 최종 목표는 무엇인지에 약간의 혼동이있을 수 있습니다 (적어도 나는 혼란 스러워요). 문제는 이해하지만 원하는 해결책은 아닙니다. –

+1

@ChrisThompson : 방금 그 사실을 깨달았습니다. 최근 편집으로 인해 더 명확 해졌습니다. – FrustratedWithFormsDesigner

+0

스트림이이 용도로 설계되지 않았습니다. 스트림이 개별적으로 청크에 어떻게 영향을 미치는지 신경 쓰지 않는 조작을 위해 설계되었습니다. –

답변

2

그것은 스트림의 전체 아이디어를 죽입니다.

시도에 대해 forEach() : 충돌하는 답변을 바탕으로

Stream<String> lineStream = Files.lines(Paths.get("your_file")); 

    lineStream.forEachOrdered((s) -> { 
     if ("HEADER".equals(s)) { 
      // create new file 
     } 
     else { 
      // append to this file 
     } 
    }); 
+0

네, 스트림의 아이디어와 잘 맞지 않지만, 이것에 기반하여 아주 잘 작동하는 것을 얻을 수있었습니다. 그리고 기본 코드를 다시 작성하는 것보다 빠르며, 또한 매우 잘 수행됩니다. :) – FrustratedWithFormsDesigner

+1

나는 어떤 방식 으로든 당신을 개인적으로 비난하지 않는다! 각각의 솔루션을 모두 알고 있다면 StackOverflow가 시작되지 않습니다. –