BufferedWriter erro de leitura

galera, to lendo arquivos de remessa, pra quem já trabalho com .REM …
quando ele retorna, ele le 2750 linhas das 2790 e no meio da 2751 ele gera uma exception e da erro :shock:

BufferedWriter teria então algum problema? tem outra maneira de fazer isso?

code:

	public String recebe() throws IOException {
	
		File localUpado = local.getFile();
		String localNome = local.getFileName();
		String localPath = localUpado.getPath();

//		CRIA PASTA REPOSITORIO		
		File localSalva = new File("c:\ArquivoRetorno\");
		if(localSalva.exists() == false){
			localSalva.mkdir();
		}
		
		try{

//		LEITOR DO ARQUIVO
		FileReader reader = new FileReader(localPath);
		BufferedReader leitor = new BufferedReader(reader);


//			ESCREVER ARQUIVO
		String localSalvar = localSalva +"\"+ localNome+".RST";
		String localSalvarT = localSalvar.replace(".REM", "");
		FileWriter Escrito = new FileWriter(localSalvarT);
		BufferedWriter buffer = new BufferedWriter(Escrito);
		
		
		String linha = "";
		
		while ((linha = leitor.readLine())!=null){
			String identificacaoRegistro = linha.substring(0,1);
			String agenciaDebito 		 = linha.substring(1,6);	
			String digitoAgenciaDebito	 = linha.substring(6,7);
			String razaoContaCorrente 	 = linha.substring(7,12);
			String contaCorrente		 = linha.substring(12,19);
			String digitoContaCorrente	 = linha.substring(19,20);
			String identificacaoEmpresa  = linha.substring(20,37);
			String numeroControleParti   = linha.substring(37,62);
			String codigoDoBanco		 = linha.substring(62,65);
			String campoMulta			 = linha.substring(65,66);
			String percentualMulta		 = linha.substring(66,70);
			String identificacaoTitulo	 = linha.substring(70,81);
			String digitoAutoConferencia = linha.substring(81,82);
			String descontoBonificacao   = linha.substring(82,92);
			String condicaoEmicao		 = linha.substring(92,93);
			String identEmissaoPapelata  = linha.substring(93,94);
			String identOperacaoBanco	 = linha.substring(94,104);
			String identOperacaoRateio	 = linha.substring(104,105);
			String enderecoDebitoAutom	 = linha.substring(105,106);
			String identOcorrencia		 = linha.substring(108,110);
			String numeroDocumento		 = linha.substring(110,120);
			String dataVencimentoTitulo  = linha.substring(120,126);
			String valorTitulo			 = linha.substring(126,139);
			String bancoEncarregadoCob	 = linha.substring(139,142);
			String agenciaDepositaria	 = linha.substring(142,147);
			String especieTitulo		 = linha.substring(147,149);
			String identificacao		 = linha.substring(149,150);
			String dataEmissaoTitulo	 = linha.substring(150,156);
			String dataLimiteDesconto	 = linha.substring(173,179);
			String indetificaTipoInscri  = linha.substring(218,220);
			String numeroInscricao		 = linha.substring(220,234);
			String nomeSacado			 = linha.substring(234,274);
			String enderecoSacado		 = linha.substring(274,314);
			String cep					 = linha.substring(326,334);
			String numeroDaSequencia	 = linha.substring(394,400);
	
			
	
	String enviaProTexto =
					identificacaoRegistro+"/" + 
					agenciaDebito +"/" +
					digitoAgenciaDebito +"/" +
					razaoContaCorrente +"/"+
					contaCorrente+"/"+
					digitoContaCorrente+"/"+
					identificacaoEmpresa+"/"+
					numeroControleParti+"/"+
					codigoDoBanco+"/"+
					campoMulta+"/"+
					percentualMulta	+"/"+
					identificacaoTitulo+"/"+
					digitoAutoConferencia+"/"+
					descontoBonificacao+"/"+
					condicaoEmicao+"/"+
					identEmissaoPapelata+"/"+
					identOperacaoBanco+"/"+
					identOperacaoRateio+"/"+
					enderecoDebitoAutom+"/"+
					identOcorrencia+"/"+
					numeroDocumento+"/"+
					dataVencimentoTitulo+"/"+
					valorTitulo+"/"+
					bancoEncarregadoCob+"/"+
					agenciaDepositaria+"/"+
					especieTitulo+"/"+
					identificacao+"/"+
					dataEmissaoTitulo+"/"+
					dataLimiteDesconto+"/"+
					indetificaTipoInscri+"/"+
					numeroInscricao+"/"+
					nomeSacado+"/"+
					enderecoSacado+"/"+
					cep+"/"+
					numeroDaSequencia+"/";

		
		buffer.newLine();
		buffer.write(enviaProTexto);
	
		}	
		buffer.close();
	}
		catch (Exception e) {		
		}	
		

		
		return "ok";
	
	
	}

Acho que há alguma linha no seu arquivo de entrada que tem menos de 400 caracteres. Se ocorrer isso, então o método substring irá gerar uma exception.

Para comprovar que é isso, pegue o “catch (Exception e)” e imprima a exceção ocorrida com “e.printStackTrace()”. Não deixe algo que é muito valioso (a mensagem de erro de execução) se perder.

deu esse erro:
:?

java.lang.StringIndexOutOfBoundsException: String index out of range: 6
at java.lang.String.substring(Unknown Source)
at br.com.topsafe.logic.BloquetoLogic.recebe(BloquetoLogic.java:344)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.vraptor.component.DefaultLogicMethod.execute(DefaultLogicMethod.java:61)
at org.vraptor.interceptor.ExecuteLogicInterceptor.intercept(ExecuteLogicInterceptor.java:32)
at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
at org.vraptor.interceptor.SettingAndValidationInterceptor.intercept(SettingAndValidationInterceptor.java:131)
at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
at org.vraptor.interceptor.InjectionInterceptor.intercept(InjectionInterceptor.java:41)
at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
at org.vraptor.interceptor.ComponentLookupInterceptor.intercept(ComponentLookupInterceptor.java:58)
at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
at org.vraptor.interceptor.MultipartRequestInterceptor.intercept(MultipartRequestInterceptor.java:101)
at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
at org.vraptor.interceptor.FlashScopeInterceptor.intercept(FlashScopeInterceptor.java:22)
at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
at org.vraptor.interceptor.RegisterAttributesInteceptor.intercept(RegisterAttributesInteceptor.java:38)
at org.vraptor.core.InterceptorsLogicFlow.execute(InterceptorsLogicFlow.java:72)
at org.vraptor.core.VRaptorExecution.execute(VRaptorExecution.java:98)
at org.vraptor.core.DefaultController.execute(DefaultController.java:46)
at org.vraptor.VRaptorServlet.service(VRaptorServlet.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at br.com.defferrari.framework.filter.ExceptionFilter.doFilter(ExceptionFilter.java:82)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at br.com.defferrari.framework.filter.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:46)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)

             String identificacaoRegistro = linha.substring(0,1);  
             String agenciaDebito         = linha.substring(1,6);   

Ou seja, uma das linhas tem menos de 6 caracteres e dá esse erro “StringIndexOutOfBounds”. O correto, nesse caso, é ver se a linha tem 400 caracteres ou menos. Se tiver menos de 400 caracteres, não é uma linha válida, e você tem de tomar alguma atitude (por exemplo, desprezar essa linha, ou então adicionar uma linha ao seu relatório de erros, e continuar processando o arquivo de remessa.)

cara eu agora limpei a string cada vez que ela roda no loop…
ela imprimiu 10 linhas a mais… o.0
será que não é problema de memória algo do tipo??
fiz ele mostra o tamanho de cada linha com um syso e ele mostrou sempre 400…
:shock: muito estranho :?: