Lendo e escrevendo arquivos

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?

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?

ja tento usar FileReader e FileWriter ?

aqui estão os métodos onde eu leio:

[code]
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);
}

[/code]

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.

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

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