Avatar billede koch Nybegynder
17. april 2007 - 16:14 Der er 7 kommentarer og
1 løsning

skriv doubles til fil , bliver til volapyk i filen!

Jeg forsøger, at skrive doubles til en fil, men får volapyk i filen! Jeg har forsøgt at fejlfinde med at få udskrevet position og limit på bytebufferen. (jeg er først ved at lære java, så det undrer mig ikke hvis det er en 'dum' fejl (hvis ikke alle er det!))

Jeg har indsat koden nedenfor


package writetofile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.nio.ByteBuffer;
import java.nio.DoubleBuffer;//this is necessary to use other buffes that ByteBuffer
import java.nio.channels.FileChannel;

public class writeToFile {
    public static void main(String[] args){
        double[] rawData = {1.23, 5.7634, 2.873, 8.093, 2.12, 2.144};//this is our data we want to save to the file
       
        int sizeByteBuffer = rawData.length*8;//for memory buffer allocation. because each element in rawData occupies 8 byte
        ByteBuffer rawDataByteBuf = ByteBuffer.allocate(sizeByteBuffer);//buffer of rawData.length capacity
        DoubleBuffer rawDataDoubleBuf = rawDataByteBuf.asDoubleBuffer();//creates a view buffer
       
        //load data to buffer
        System.out.println("Before data is written to file:\n" +
                          "Double buffer capacity: " +rawDataDoubleBuf.capacity()+
                          "\n Byte buffer capacity: " +rawDataByteBuf.capacity()+
                          "\n Double buffer position: " + rawDataDoubleBuf.position() +
                          "\n Byte buffer position: " + rawDataByteBuf.position() +
                          "\n Double buffer Limit: " + rawDataDoubleBuf.limit()+
                          "\n Byte buffer limit: " + rawDataByteBuf.limit());
       
        rawDataDoubleBuf.put(rawData);
       
        System.out.println("\n\nAfter data is written to buffer:\n" +
                        "Double Buffer capacity: " +rawDataDoubleBuf.capacity()+
                        "\n Bytebuffer capacity: " +rawDataByteBuf.capacity()+
                        "\n Double buffer position: "+ rawDataDoubleBuf.position() +
                        "\n Byte Buffer position " + rawDataByteBuf.position() +
                        "\n Double buffer limit: " + rawDataDoubleBuf.limit()+
                        "\n Byte buffer limit " +rawDataByteBuf.limit());
       
        rawDataByteBuf.position(8*rawDataDoubleBuf.position());//The ByteBuffer is still in its original state. This update the bytebuffer to correspond to the data loaded into the view buffer. This updated position is used to set the limit by the flip method
        System.out.println("\n\n After update of position: " + rawDataByteBuf.position());
        rawDataByteBuf.flip();//limit for the byte buffer needs to be set to the current position, and the position needs to be set back to 0. flip sets the limit to the current position and position to 0

        System.out.println("\n\nAfter flip:\n " +
                "Byte Buffer limit: " +rawDataByteBuf.limit()+
                "\n Byte Buffer position: " + rawDataByteBuf.position()+
                "\n Double buffer limit: " +rawDataDoubleBuf.limit()+
                "\n Double buffer position: " +rawDataDoubleBuf.position());
       

        String dirname = new String("C:/stien");
        String filename = new String("MyJavaTestFile.txt");
       
        File dir = new File(dirname);//file object
       
        //file stream is created
        File aFile = new File(dir, filename);//file object for the file path
        FileOutputStream outputFile = null;//place to store the stream reference
       
        try{
            outputFile = new FileOutputStream(aFile, true);
            System.out.println("\nFile stream created succesfully.("+ aFile+")");
        }
        catch(FileNotFoundException e){
            e.printStackTrace(System.err);
        }
       
        //create the file output stream channel and the buffer
        FileChannel outChannel = outputFile.getChannel();
       
      //write file
        try{
            outChannel.write(rawDataByteBuf);
            outputFile.close();
            System.out.println("\n Buffer contents written to file."+dirname);
        }
        catch(IOException e){
            e.printStackTrace(System.err);
        }
        System.exit(0);//correct termination
    }
}


På forhånd tak for hjælpen.

/Jacob
Avatar billede jakoba Nybegynder
17. april 2007 - 18:50 #1
Er der noget ivejen for at i bruger Javas indbyggede serializable interface ?
http://java.sun.com/j2se/1.3/docs/api/java/io/Serializable.html
Avatar billede koch Nybegynder
17. april 2007 - 20:53 #2
Muligvis ikke. Jeg vil lige kigge nærmere på det. Jeg skal hente data fra noget hardware, så jeg går ud fra at jeg skal skrive disse data til et array før jeg kan skrive dem til en fil, så jeg kan angive størrelsen på min ByteBuffer... Det er selvfølgelig ikke sikkert jeg skal bruge dette i serializable interfacet... Jeg kigger nærmere på det og vender lige tilbage.
Avatar billede arne_v Ekspert
18. april 2007 - 03:18 #3
Hvordan checker du at det er volapyk i filen ? Det er ikke helt nemt at genkende
binære double's !
Avatar billede arne_v Ekspert
18. april 2007 - 03:19 #4
Serialiserede objekter indeholder en masse meta information.

Hvis man bare vil gemme nogle doubles, så ville jeg wrappe FileOutputStream i
en DataOutputStream og bruge writeDouble.
Avatar billede koch Nybegynder
23. april 2007 - 14:03 #5
Ja, jeg kodte, jeg åbnede bare filen i notepad :| Det er fint nok det jeg får skrevet ud... Jeg fandt dog ud af en lettere måde at gøre det på, da jeg blot skal have en csv-fil. Jeg vil dog kigge på d3en metode du foreslår Arne.
Avatar billede arne_v Ekspert
21. juli 2007 - 16:32 #6
Tid at få afsluttet her ?
Avatar billede koch Nybegynder
26. august 2007 - 19:14 #7
Ja smid et svar Arne. Beklager det sene svar!
Avatar billede arne_v Ekspert
26. august 2007 - 20:27 #8
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester