Gostaria de colocar uma questão para a galera da lista. Estou num projeto que manipula conteúdo de arquivos TXT e os grava num banco de dados. Até aí, sem problemas e nem novidades. A questão é que estes conteúdos são disponibilisados em linhas, minha aplicação lê cada uma destas linhas e as sub-divide em subStrings, e cada subString é uma informação que deve ser gravada em banco. Exemplo de uma linha deste arquivo:
5002951224000104131858602 20020625MT01UN 194946163000000000130000000000013000000000000221000000000000000000000000001700N Trecho de código de processamento desta linha: (...) tipo = (linha.substring(0, 2)); cpfCnpj = linha.substring(2, 16).trim(); cfop = Integer.parseInt(linha.substring(53, 56).trim()); inscEstd = (linha.substring(16, 30).trim()); (...) Estas variáveis são gravadas no banco. Como disse, até aí sem problema. Mas existem arquivos cujo tamanho variam entre 40 e 100MB com cerca de 80mil a 840mil linhas, e cada uma destas linhas deve ser lida e processada. Como eu uso File para poder ler estes arquivos o consumo de memória é alto, pois estes arquivos são carregados na memória até o fim de seu processamento e os lotes de arquivos são da ordem de 2000 a 5000 arquivos. O que não é problema, a princípio, para os servers que temos aqui. O problema, na minha opinião e gostaria de poder ler a de vcs, é que se ouver uma mudança no padrão do tamanho da linha ou algum dado fora de lugar o processamento desta linha fica comprometido. Ou no caso concreto onde a variável cfop (do exemplo acima) não terá mais tamanho 3, passando a ter tamanho 4, isso faz com que eu tenha que mudar todas as outras "coordenadas" de varáveis, para poder pegar a informação correta. A minha idéia era a de acabar com esse lance de ter que ler linha a linha e sub-dividi-lás em subStrings. Poderia ter um arquivo XML parecido com este trecho: <tipo>50</tipo> <cpfCnpj>02951224000104</cpjCnpj> <cfop>616</cfop> <inscEstd>131858602</inscEstd> e assim por diante. Desta forma poderia acessar diretamente a informação que desejo. Claro que devemos fazer uma DTD para estes arquivos, pois cada <tipo> de linha tem a sua particularidade, mas isso também não seria problema. Bem, se transformar as linhas do arquivo TXT em tags de arquivos XML não é o problema, porque a questão ? Bem, se um arquivo texto, que só tem caracteres ANSI pode chegar a ter 100MB como ficará um arquivo XML com um monte de tags ? Muito maior que um arquivo TXT ! Mas eu acho que a vantagem seria a seguinte (gostaria que alguém me confirmasse): 1) Apesar do arquivo ser maior em MB as informações estarão dispostas de forma ordenada e se um campo mudar de tamanho não seria necessário mudar o processamento as outras variáveis. 2) Mesmo sendo maior em MB isso não acarretaria grandes transtornos de uso de memória tendo em vista que não usaria File para ler o arquivos, e depois cada linha do arquivo. Usando a API XML de JAVA (um parser) o mesmo carregaria na memória apenas a estrutura DOM do documento e isso é mais leve do que o arquivo como um todo. Posso usar esta estrutura para manipular as informações do arquivo. 3) Ganharia em velocidade de processamento, pois poderia acessar diretamente as informações desejadas e não ter que ficar "picando" linha a linha para separar a informação desejada, lembrando que tem arquivo com mais de 800mil linhas ! A galera que trabalha com arquitetura/projeto poderia opinar sobre esta possibilidade ? Tem alguém na lista que já implementou JAVA com XML pra valer ? Alguém sabe de padrões para JAVA com XML ? Abraço Carlos *********************************************** Carlos Santiago [EMAIL PROTECTED] Programador JAVA Equipe de Implementação - SAGETI Secretaria de Estado de Fazenda - MT *********************************************** ------------------------------ LISTA SOUJAVA ---------------------------- http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] -------------------------------------------------------------------------