2008-07-23: finalmente, o programa funciona! Nesta parte final o que fizemos foi criar o método geraStr(), que como o nome fala, vai gravar o arquivo STR.
- primeiro instanciamos rafOut, rafOut = new RandomAccessFile(fileNamePath+".str", "rw");, que vai gerar um arquivo ao final chamado “nome.str.str”.
- em rafOut.writeShort(Short.reverseBytes(totalPonteiros)); estamos escrevendo em primeiro lugar o ponteiro de ponteiros, hehe, que é um short com a quantidade de ponteiros que existe no arquivo. Detalhe, que para colocar de volta no arquivo, temos que inverter os bytes para a forma original.
- depois temos um laço que percorrerá o array de RegistraPonteiro, lista[], pegando as informações, short ponteiro e byte[] conteúdo, gravando-as em sequencia no arquivo. Novamente, temos que inverter o short ponteiro para gravar de forma correta:
for ( i = 0; i < totalPonteiros; i++){
rafOut.writeShort(Short.reverseBytes(lista[i].getPonteiro()));
rafOut.write(lista[i].getConteudo());
}
O que importa mesmo é isso, o resto são besteiras que vou testando...
public void geraStr() {
try {
rafOut = new RandomAccessFile(fileNamePath+".str", "rw");
String titulo = this.getFrame().getTitle();
this.getFrame().setTitle(titulo+" salvando STR...");
rafOut.writeShort(Short.reverseBytes(totalPonteiros));//escreve a quantidade de ponteiros
for ( i = 0; i < totalPonteiros; i++){
rafOut.writeShort(Short.reverseBytes(lista[i].getPonteiro()));
rafOut.write(lista[i].getConteudo());
}
this.getFrame().setTitle(titulo+" salvando STR... OK!");
this.getFrame().setTitle(titulo);
//rafOut.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(StrEditorView.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ioe){
Logger.getLogger(StrEditorView.class.getName()).log(Level.SEVERE, null, ioe);
}
}
Ah, a classe RegistraPonteiro():
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package streditor;
/**
*
* @author Administrator
*/
public class RegistraPonteiro {
private short ponteiro; //aqui temos o ponteiro, que é o tamanho do bloco
private byte[] b = new byte[ponteiro]; //aqui vamos guardar o bloco de bytes deste ponteiro
/**
* Aqui vamos passar o valor de ponteiro
* @param sh
*/
public void setPonteiro(short sh){
this.ponteiro = sh;
}
/**
* Aqui passamos o valor do array de bytes do conteúdo
* @param b
*/
public void setConteudo (byte[] b){
this.b = b;
}
/**
* retornamos o valor em ponteiro
* @return
*/
public short getPonteiro (){
return this.ponteiro;
}
/**
* retornamos o valor do array byte
* @return
*/
public byte[] getConteudo (){
return this.b;
}
RegistraPonteiro(short p, byte[] b){
this.ponteiro = p;
this.b = b;
}
}
Ainda vou deixar o programinha mais funcional e lógico, mas já dá para trabalhar com as STRs. Resumindo, este programinha:
- Abre um arquivo STR, lê toda sua estrutura, quantidade de ponteiros, ponteiro e conteúdo, e passa para um array de RegistraPonteiro.
- Faz a leitura do array que contém as informações e joga numa área de texto para ser editada.
- A cada movimento de teclado ou clique de mouse, dispara métodos para atualizar linhas e cálculos de ponteiro/conteúdo, gravando os novos valores no array RegistaPonteiro que continha as informações.
- Gera um novo arquivo .str, gravando a quantidade de ponteiros, seguida pelos ponteiros e seus conteúdos, conforme ocorrem no array RegistraPonteiro.
- Gera também um arquivo .txt do que está na área de texto.
Testei a funcionalidade, carregando um arquivo str, percorrendo com o teclado e clicando (apenas para ativar os métodos atualizadores) o arquivo e salvando o str. Depois com o UltraEdit foi só comprarar os arquivos, gerado e original em modo byte para ver se ocorria alguma diferença. No início estava ocorrendo um erro no cálculo dos novos ponteiros, mas logo vi o que era e foi corrigido.
Depois, testei mesmo o StrEditor em ação, abri o arquivo que tinha traduzido manualmente à muito tempo, base.str, modifiquei “Automapa” para “Mapa”, salvei, gerei um novo arquivo .JAR e testei no emulador. Daí foi só correr pro abraço...
Antes e depois, de forma prática e sem traumas! Finalmente!
- primeiro instanciamos rafOut, rafOut = new RandomAccessFile(fileNamePath+".str", "rw");, que vai gerar um arquivo ao final chamado “nome.str.str”.
- em rafOut.writeShort(Short.reverseBytes(totalPonteiros)); estamos escrevendo em primeiro lugar o ponteiro de ponteiros, hehe, que é um short com a quantidade de ponteiros que existe no arquivo. Detalhe, que para colocar de volta no arquivo, temos que inverter os bytes para a forma original.
- depois temos um laço que percorrerá o array de RegistraPonteiro, lista[], pegando as informações, short ponteiro e byte[] conteúdo, gravando-as em sequencia no arquivo. Novamente, temos que inverter o short ponteiro para gravar de forma correta:
for ( i = 0; i < totalPonteiros; i++){
rafOut.writeShort(Short.reverseBytes(lista[i].getPonteiro()));
rafOut.write(lista[i].getConteudo());
}
O que importa mesmo é isso, o resto são besteiras que vou testando...
public void geraStr() {
try {
rafOut = new RandomAccessFile(fileNamePath+".str", "rw");
String titulo = this.getFrame().getTitle();
this.getFrame().setTitle(titulo+" salvando STR...");
rafOut.writeShort(Short.reverseBytes(totalPonteiros));//escreve a quantidade de ponteiros
for ( i = 0; i < totalPonteiros; i++){
rafOut.writeShort(Short.reverseBytes(lista[i].getPonteiro()));
rafOut.write(lista[i].getConteudo());
}
this.getFrame().setTitle(titulo+" salvando STR... OK!");
this.getFrame().setTitle(titulo);
//rafOut.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(StrEditorView.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ioe){
Logger.getLogger(StrEditorView.class.getName()).log(Level.SEVERE, null, ioe);
}
}
Ah, a classe RegistraPonteiro():
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package streditor;
/**
*
* @author Administrator
*/
public class RegistraPonteiro {
private short ponteiro; //aqui temos o ponteiro, que é o tamanho do bloco
private byte[] b = new byte[ponteiro]; //aqui vamos guardar o bloco de bytes deste ponteiro
/**
* Aqui vamos passar o valor de ponteiro
* @param sh
*/
public void setPonteiro(short sh){
this.ponteiro = sh;
}
/**
* Aqui passamos o valor do array de bytes do conteúdo
* @param b
*/
public void setConteudo (byte[] b){
this.b = b;
}
/**
* retornamos o valor em ponteiro
* @return
*/
public short getPonteiro (){
return this.ponteiro;
}
/**
* retornamos o valor do array byte
* @return
*/
public byte[] getConteudo (){
return this.b;
}
RegistraPonteiro(short p, byte[] b){
this.ponteiro = p;
this.b = b;
}
}
Ainda vou deixar o programinha mais funcional e lógico, mas já dá para trabalhar com as STRs. Resumindo, este programinha:
- Abre um arquivo STR, lê toda sua estrutura, quantidade de ponteiros, ponteiro e conteúdo, e passa para um array de RegistraPonteiro.
- Faz a leitura do array que contém as informações e joga numa área de texto para ser editada.
- A cada movimento de teclado ou clique de mouse, dispara métodos para atualizar linhas e cálculos de ponteiro/conteúdo, gravando os novos valores no array RegistaPonteiro que continha as informações.
- Gera um novo arquivo .str, gravando a quantidade de ponteiros, seguida pelos ponteiros e seus conteúdos, conforme ocorrem no array RegistraPonteiro.
- Gera também um arquivo .txt do que está na área de texto.
Testei a funcionalidade, carregando um arquivo str, percorrendo com o teclado e clicando (apenas para ativar os métodos atualizadores) o arquivo e salvando o str. Depois com o UltraEdit foi só comprarar os arquivos, gerado e original em modo byte para ver se ocorria alguma diferença. No início estava ocorrendo um erro no cálculo dos novos ponteiros, mas logo vi o que era e foi corrigido.
Depois, testei mesmo o StrEditor em ação, abri o arquivo que tinha traduzido manualmente à muito tempo, base.str, modifiquei “Automapa” para “Mapa”, salvei, gerei um novo arquivo .JAR e testei no emulador. Daí foi só correr pro abraço...
Antes e depois, de forma prática e sem traumas! Finalmente!
Comentários