Gente,
Preciso criar um arquivo onde cada linha (registro) tenha exatamente 4000 bytes. Existe alguma forma de implementar isto sem precisar completar cada linha com espaço ?
[quote=kozak]Gente,
Preciso criar um arquivo onde cada linha (registro) tenha exatamente 4000 bytes. Existe alguma forma de implementar isto sem precisar completar cada linha com espaço ?
[/quote]
cara quando eu fiz uma vez eu criei um método completeWithSpaces() pra adicionar espaço, não vi nada que poderia me atender na época que poderia servir pra vc hoje.
Mas no seu caso há problema em adicionar espaço no final pra completar, ou procura uma comodidade mesmo?
No caso estou trabalhando com um arquivo que sera transmitido para mainframe e por isto ele tem que ter o tamanho dos registros fixo.
A única coisa em que pensei foi exatamente a que você mencionou, ou seja um método para completar com espaços. Porém o volume do arquivo vai ser grande e temo que isto e consuma muito processamento e tempo.
no momemento minha preocupação é performance.
printf ou format (veja PrintWriter.printf, java.util.Formatter etc.) pode formatar campos de tamanho fixo com facilidade. Pode completar com espaços ou então zeros e isso é feito rapidamente.
Exemplo:
String s = String.format ("%08.2f%-20.20s%02d", 3.14, "abacaxi", 7);
// Saída:
00003.14abacaxi 07
Existe uma biblioteca chamada JFileHelpers, que ‘automatiza’ todo o processo de geração de arquivos do tipo flat files.
JFileHelpers é uma biblioteca que automatiza estas tarefas chatas de manipular e criar arquivos de texto estruturados. Ela manipula arquivos com campos de tamanho fixo ou delimitados usando as facilidades das anotações Java.
E essa biblioteca foi criada por um brasileiro!
Dá pra trabalhar com arquivo misto também, com header, detail e trailler.
Eu uso na empresa onde eu trabalho, economizei um bocado de trabalho braçal!
Segue o link: http://www.jfilehelpers.com/
[quote=kozak]No caso estou trabalhando com um arquivo que sera transmitido para mainframe e por isto ele tem que ter o tamanho dos registros fixo.
A única coisa em que pensei foi exatamente a que você mencionou, ou seja um método para completar com espaços. Porém o volume do arquivo vai ser grande e temo que isto e consuma muito processamento e tempo.
no momemento minha preocupação é performance.[/quote]
Olha só, se o campo tem que ter obrigatoriamente 4000 bytes, não importa se serão todos em branco, ou todos preenchidos, pra escrever no arquivo serão 4000 bytes e pronto, então esse tempo você vai perder do mesmo jeito.
O tempo que no caso vai ser aumentado, é o pra adicionar espaço em branco, e isso será feito muito rapidamente e praticamente imperceptível.
Então a sua performance vai estar relacionada em si por escrever 4000 bytes por linha, independente do conteúdo, então não será o fato de adicionar espaços que fará sua performance cair e sim o fator de escrita no arquivo, que no seu caso é uma regra por causa da arquitetura.
O que você pode fazer é usar esta técnica pra completar os 4000 bytes, e vê como se comporta a performance, e se necessário tentar otimizar, ou criar algum mecanismo pra melhorar na hora da escrita do arquivo, deixar em memória e gravar no arquivo em outro horário, sei lá…
vendo o que os colegas acima disseram, existe maneiras pra você deixar sua linha com tamanho fixo, mas perceba que o seu “problema de performance” é com a escrita de fato e não com o conteúdo que vai mandar pra escrever.
Valeu gente, mas acho que vou ter que completar com espaços manualmente, pois encontrei alguns problemas de infra aqui, nos quais não posso aplicar as idéias que vocês deram:
1- Minha jre é 1.4.6 por isto não posso executar o String.format
2- Também não posso utilizar bibliotecas externas. Devido as políticas da empresa.
Vou fazer no braço e posto aqui.
[]'s
Bom, é só lembrar que concatenar strings deve sempre ser feito usando-se um StringBuffer, nunca com “+=” que é realmente lento devido à quantidade absurda de objetos que “+=” cria indiretamente.
Gente fiz assim:
public static String putSpaces(String registro,int tamanho)
{
StringBuffer registro_completo = new StringBuffer(registro);
int tamanhofinal = (tamanho - registro_completo.length());
for(int i=0;i<tamanhofinal;i++)
{
registro_completo.append(" ");
}
return (registro_completo.toString());
}
abraços