Lendo e escrevendo arquivos

6 respostas
oitathi

Eu tô com um duvida… eu tenho um código que escreve em um arquivo… aqui está o método onde escrevo:

public void writing () throws FileNotFoundException, IOException{
            
            DataOutputStream dos = new DataOutputStream(new FileOutputStream("C:\Users\Desktop\demo16.map"));
            dos.writeShort(vers); // escrevi 307
            dos.writeChars(name); // escrevi porto de galinhas
            dos.writeShort(ano); // escrevi 1989
            dos.writeByte(mes); // escrevi 08 ... e assim sucessivamente
            dos.writeByte(dia);
            dos.writeShort(15); //
            dos.writeShort(15);  // 
            dos.writeShort(defs);
            dos.writeInt(topLat);
            dos.writeInt(botLat);
            for(int i=0; i<MAXDEFS;i++){
               if(i<defLons.length){
                dos.writeInt(defLons[i]);
               }
               else{
                 dos.writeInt((0));
               }
            }//end for
            for(int i=0;i<MAXDEFS;i++){
               if(i<topDefX.length){
                dos.writeShort(topDefX[i]);
            }
               else{
                 dos.writeShort(0);
               }
            }//end for

            for(int i=0; i<MAXDEFS;i++){
               if(i<topDefY.length){
                 dos.writeShort(topDefY[i]);
               }
               else{
                  dos.writeShort(0);
               }
            }//end for

            for(int i=0; i<MAXDEFS;i++){
                if(i<botDefX.length){
                    dos.writeShort(botDefX[i]);
                }
                else{
                   dos.writeShort(0);
                }
            }//end for
            for(int i=0; i<MAXDEFS;i++){
                if(i<botDefY.length){
                    dos.writeShort(botDefY[i]);
                }
                else{
                    dos.writeShort(0);
                }
            }//end for

            dos.writeInt(mapWidth <<  16);
            dos.writeInt(mapHeight << 16);


            for(int i=0; i<256;i++){
                if(i<127){
                    dos.writeByte(r[i]);
                    dos.writeByte(g[i]);
                    dos.writeByte(b[i]);
                }
                else{
                    dos.writeByte(0);
                }
            }//end for

            dos.write(vetorU);

            dos.close();
   }

Mas agora eu tenho um outro programa q deve ler esses dados, soh q ele está lendo coisas que não tem nada a ver como o eu escrevi…
Aqui está parte do médoto dele:

public void test(File f) throws FileNotFoundException, IOException{
            RandomAccessFile fis = new RandomAccessFile(f,"r");
            vers=readThisShort(fis);
            System.out.println("Version "+ vers);// imprimiu 13057
            
            name=readThisString(fis,15);
            System.out.println("Name "+ name); // imprimiu: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

            ano=readThisShort(fis);
            mes=readThisByte(fis);
            dia=readThisByte(fis);
            System.out.println("Date "+ dia+"."+mes+"."+ano); // imprimiu: Date 82.0.8192
            
            kind=readThisShort(fis);
            System.out.println("Kind "+ kind);//  imprimiu: Kind 17664
            
            group=readThisWord(fis);
            System.out.println("Group "+ group);
            
            dfs=readThisShort(fis);
            System.out.println("DFS "+ dfs);
            
            topLat=readThisInt(fis);
            System.out.println("TopLat "+ topLat);
            
            botLat=readThisInt(fis);
            System.out.println("BotLat"+ botLat);

            defLons=readThisArrayInt(fis);
            System.out.println("defLons:");
            for(int i=0; i<defLons.length;i++){
                System.out.println(defLons[i]);
            }
            
            topdefx=readThisArrayShort(fis);
            System.out.println("topdefx:");
            for(int i=0; i<topdefx.length;i++){
                System.out.println(topdefx[i]);
            }

            topdefy=readThisArrayShort(fis);
            System.out.println("topdefy:");
            for(int i=0; i<topdefy.length;i++){
                System.out.println(topdefy[i]);
            }

            botdefx=readThisArrayShort(fis);
            System.out.println("botdefx:");
            for(int i=0; i<botdefx.length;i++){
                System.out.println(botdefx[i]);
            }

            botdefy=readThisArrayShort(fis);
            System.out.println("botdefy:");
            for(int i=0; i<botdefy.length;i++){
                System.out.println(botdefy[i]);
            }

            mapWidth=readThisWord(fis);
            System.out.println("Width "+ mapWidth);

            mapHeight=readThisWord(fis);
            System.out.println("Height "+ mapHeight);
}

Ou seja está lendo tudo errado… alguém sabe o q pode estar acontecendo?

6 Respostas

ViniGodoy

Como funcionam seus métodos de leitura?

Em todo caso, se você escreveu com um DataOutputStream, não seria uma boa fazer a leitura com um DataInputStream?

tiago.vt

ja tento usar FileReader e FileWriter ?

oitathi
aqui estão os métodos onde eu leio:
public  int[] readThisArrayInt(RandomAccessFile fis) throws IOException{
        int []v = new int[MAXDEFS];
        for(int i=0;i<MAXDEFS;i++){
            v[i]=readThisInt(fis);
        }
        return v;
     }
     public  short[] readThisArrayShort(RandomAccessFile fis) throws IOException{
        short []v = new short[MAXDEFS];
        for(int i=0;i<MAXDEFS;i++){
            v[i]=readThisShort(fis);
        }
        return v;
     }
     public  byte readThisByte (RandomAccessFile fis) throws IOException {
        return (byte) fis.read();
     }
     public  int readThisWord (RandomAccessFile fis) throws IOException {
           return (fis.read() + (fis.read() << 8));
     }
     public  short readThisShort (RandomAccessFile fis) throws IOException {
           return (short) (fis.read() + (fis.read() << 8));
     }
     public  String readThisString (RandomAccessFile fis, int mLen) throws IOException {
           int sLen=fis.read();
           if (sLen>=mLen)
               {mLen=0;}
           else
               {mLen=mLen-sLen;}
           String s="";
           while (sLen>0) {
              s=s+(char)fis.read();
              sLen--;
           }
           if (mLen>0) {fis.skipBytes(mLen);}
           return s;
     }
     public  int readThisInt (RandomAccessFile fis) throws IOException {
           return fis.read()+(fis.read()<<8)+(fis.read()<<16)+(fis.read()<<24);
    }
ViniGodoy

Você não está invertendo a ordem dos bytes na leitura? Seus métodos aparentemente leem em BigEndian, quando o java grava em Little Endian.
De qualquer forma, vai ficar muitíssimo mais simples se você trocar para um DataInputStream.

ViniGodoy

Readers e writers são para arquivos de texto. No caso, ela tem um arquivo binário.

oitathi

E como eu mudaria para um DataInputStream, vc poderia me dar um exemplo em uma parte do meu código?
Obrigada

Criado 29 de março de 2011
Ultima resposta 29 de mar. de 2011
Respostas 6
Participantes 3