Estou com um problemão aqui!
Estou desenvolvendo um aplicativo para pocket que precisa carregar arquivos textos na memória.
O problema é que o programa está demorando aproximadamente 10 minutos pra carregar um arquivo de 1,5Mb.
Preciso de uma solução urgente pra isso.
Segue meu código abaixo:
public void carregaArquivoMemoria(String caminhoArquivo) {
String linha = "";
Vector vetor = new Vector();
String subString = "";
int fimArquivo = 0;
buffer = new byte[4096];
try {
is = getClass().getResourceAsStream(caminhoArquivo);
while (true) {
fimArquivo = is.read(buffer);
if (fimArquivo == -1) {
break;
} else {
for (int x = 0; x < buffer.length; x++) {
if ((((char) buffer[x] + "").equals("\r")) && (((char) buffer[x] + "").equals("\r"))) {
subString = linha.substring(36, 116);
linha = "";
vetor.addElement(subString);
} else {
linha = linha + (char) buffer[x];
}
}
}
}
} catch (IOException ex) {
ex.printStackTrace();
} catch (OutOfMemoryError oute) {
oute.printStackTrace();
} catch (Exception exc) {
exc.printStackTrace();
}
}
Olá, faz tempo que não mexo com CLDC então desculpe se eu falar alguma classe que não tem lá.
Parece que vc está querendo ler linha por linha e pegar um trecho de cada linha, certo?
Se existe BufferedReader no CLDC, use ele e o método readLine() dele.
Para concatenação de Strings use StringBuilder ou StringBuffer (se tiver eles, hehe)
Vc tem outra opção para usar no lugar desse Vector? Vector é bem lento, apesar de ser quase a única Collection no CLDC.
Vc pode usar um array normal se souber o tamanho do arquivo ou então utilizar o Javolution: www.javolution.org
Principalmente com StringBuilder e substituindo o Vector vc deve conseguir uma boa diferença.
Nao tem StringBuilder, use StringBuffer em ME.
Primeira coisa. Qual a CPU do seu pocket? Qual a VM?
Qual o tamanho da heap do seu pocket?
Vc disse que quer ler um arquivo de 1,5mb rapido?
Nem qndo eu trabalhei com arquivos de 100k era rapido… inda + que vc ali deu subString = linha.substring e logo embaixo concatenou string com string.
Usa StringBuffer eh + rapido
Nao se usa while(true) qndo se quer fazer uma operacao demorada em celular, pq vc para a thread principal da aplicacao
Se usa
new Thread(
public void run()
{
// fazer tarefas
}).start();
Eu preciso desenvolver uma solução pra isso, pois tem um programa que foi desenvolvido há 10 anos e abre vários arquivos texto os carrega na memória e não leva nem um minuto…
Tem que existir alguma maneira…
Já andei vendo este site por esses dias, mas as classes e métodos que esse cara usa não estão presentes no J2ME…
Tipo performance depende de varios fatores. Por isso te perguntei o modelo…
Tem varios truques que eu fiz aqui e carrego arquivos de 1mb facil. Mas tb qndo coloco num Motorola V3 demora um dia…
Entao nao tem milagre em JME.
[quote=Sagatiba]Vc esta usando a VM J9 ou a JBed?^
Alem disso o arquivo ta na flash ou ta no cartao SD?
Se no SD, qual a velo de gravacao e leitura dele?[/quote]
Estou usando a VM J9. E o arquivo está na flash.
[quote=thingol]Ou seja, provavelmente foi usado Microsoft Embedded Visual C++ 2 ou coisa parecida. 10 anos atrás não havia programação em Java para PocketPC.
[/quote]