2012-08-10 8 views
2

파일에서 프로세스를 수행해야합니다. 먼저 줄 수를 계산하고 값과 비교해야합니다.동일한 입력 스트림을 streamreader에서 사용할 수 있습니까?

다음은 파일을 한 행씩 읽고 유효성 검사를 수행하는 것입니다.

첫 번째 패스 만 통과하면 두 번째 프로세스를 수행해야합니다.

FTP를 사용하여 동일한 파일을 읽었습니다.

다른 입력 스트림을 만들려고 할 때 ... ftp가 현재 파일을 읽는 중입니다. 이 같은

는 :

is1=is; 

두 스트림에서 파일 내용을 가지고있을 것 : 그래서 난 그냥 아래와 같이 사용할 수 있습니다

InputStream is = null; 
LineNumberReader lin = null; 
    LineNumberReader lin1 = null; 
is = ftp.getFile(feedFileName); 
lin = new LineNumberReader(new InputStreamReader(is)); 

:

아래
(is1 = ftp.getFile(feedFileName);) 

은 남아있다 완료가 시작되지 않으면 첫 번째 스트림 객체를 읽 자마자 두 번째 객체가 null이됩니다.

스트림을 별도로 읽으려면 새 ftp 객체를 만드는 것이 유일한 옵션입니까?

+0

의미한다. 예외가 있습니까? – home

+0

예를 들어 예외가 발생하면 : is1 = ftp.getFile (feedFileName); ftp가 이미 읽으므로. – ashwinsakthi

답변

2

LineNumberReader를 완료 한 후 InputStream is을 닫습니다. 그런 다음 FTP에서 파일을 다시 요청하면 더 이상 사용하지 않게됩니다. LineNumberReader가 완료 될 때까지는 아마 같은 InputStream로부터 읽어 낼 수가 없다. 또한, 모든 InputStream이 mark()reset() 메소드를 지원하는 것은 아닙니다.

그러나 나는 첫 번째 프로세스가 성공할 때만 두 번째 프로세스를 수행하는 것이 올바른 방법이 아닐 수도 있음을 제안합니다. 데이터를 스트리밍 할 때 임시 데이터 구조로 스트리밍 한 다음 줄을 계산 한 다음 동일한 데이터 구조에서 작동하는 것이 좋습니다.

+0

필자는 라인 수를 계산하고 동일한 파일에 언급 된 수와 동일한 지 확인해야합니다. 동일한 경우 파일 내용 라인의 유효성 검사를 CSV 형식의 사람 레코드로만 수행해야합니다. 그렇다면 나는 계산을 끝내고 첫 번째 유효성 확인으로 끝난다. 시작부터 스트림이 필요하다. 다음에해야할 일에 당혹 스럽다. 가능한 경우 파일의 내용을 데이터 구조에로드 한 다음 카운트하는 방법을 제안 해 줄 수 있습니까? 그것. – ashwinsakthi

+0

이미 LineNumberReader에 공급하는 InputStreamReader를 사용하고 있습니다.'Read '에 처음으로 모든 read 라인을 캐쉬했다면, 같은 것을 할 수 있고, 파일을 두 번 스트리밍 할 필요가 없습니다. –

+0

감사합니다. Hiery ... 나는 UR 접근법을 따라 왔고 효과가있었습니다. – ashwinsakthi

1

파일이 크지 않은 경우 데이터를 String으로 저장할 수 있습니다. liek :

StringBuilder sb = new StringBuilder(); 
byte[] buffer = new byte[1024]; 
int len; 
while((len = is.read(buffer))!=-1) 
sb.append(buffer, 0, len); 
String data = sb.toString(); 

는 다음과 같은 문자열 에서 더 일을 할 수는 :

'FTP는 현재 파일을 읽는 중입니다'무엇을
int lineNumber = data.split("\n").length; 
관련 문제