2013-06-14 16 views
5

Używam Java do zapisu tablicy bajtów do pliku. Kiedy otwieram plik w edytorze szesnastkowym, nie zawsze widzę bajty, które spodziewałem się tam znaleźć. Oto mój przykładowy kod i zawartość pliku wyjściowego:Zapisywanie tablicy bajtów do pliku. Nie zawsze uzyskuję oczekiwany wynik

public static void main(String[] args) 
{ 
    File file = new File("c:\\temp\\file.txt"); 
    file.delete(); 
    FileOutputStream outStream = null; 
    try 
    { 
     file.createNewFile(); 
    } catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try 
    { 
     outStream = new FileOutputStream(file); 
    } catch (FileNotFoundException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try 
    { 
    outStream.write(new byte[] { 0x14, 0x00, 0x1F, 0x50 }); 

    } catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Gdy otwieram plik w edytorze hex mam 00 9e f3 04 jak zawartość zamiast bajtów, które wysłałem. Moje wyniki wydają się być niekonsekwentne. Czasami uzyskuję oczekiwany rezultat, a czasami nie.


Będzie to wyjście prawidłowe dane:

outStream.write(new byte[] { 0x14 , 0x00, 0x1F, 0x50, (byte) 0xE0, 0x4F, (byte) 0xD0, 0x20, (byte) 0xEA, 0x3A, 0x69, 0x10, (byte) 0xA2 , (byte) 0xD8, 0x08, 0x00, 0x2B });

zawartość plików są:

14 00 1f 50 e0 4f d0 20 ea 3a 69 10 a2 d8 08 00 2b 

Jeśli dodać jeszcze jeden bajt do tej tablicy to się nie powiedzie.

outStream.write(new byte[] { 0x14 , 0x00, 0x1F, 0x50, (byte) 0xE0, 0x4F, (byte) 0xD0, 0x20, (byte) 0xEA, 0x3A, 0x69, 0x10, (byte) 0xA2 , (byte) 0xD8, 0x08, 0x00, 0x2B, 0x30 });

zawartość plików są teraz:

14 e5 80 9f e4 bf a0 e2 83 90 e3 ab aa e1 81 a9 ed a2 a2 08 e3 80 ab 

Miałem też problem z tym jednym:

outStream.write(new byte[] { 0x4C, 0x00, 0x00, 0x00 }); 

zawartość plików:

4c 00 

Dwa ostatnie bajty nie zostały zapisane.


outStream.write(new byte[] { 0x4C, 0x00, 0x00, 0x00, 0x01 }); 

To przyniesie oczekiwanego rezultatu. Zawartość pliku:

4c 00 00 00 01 

Czuję, że brakuje mi czegoś podstawowego w sposobie zapisywania danych w plikach. Jak uzyskać spójne wyniki przy zapisywaniu tablic bajtowych do pliku?

+3

Chociaż nie wierzę, że to coś zmieni, spróbuj '.flush()' następnie '.close()' po '.write()' ... – fge

+1

To jest * bardzo * dziwne. I to jest dokładny kod, który wykonujesz? Nigdzie nie ma "pisarza"? Lub wartości 'String'? Ponadto: wywołanie 'createNewFile()' nie powinno być konieczne. –

Odpowiedz

1

Skompilowałem dokładnie twój kod iw pliku wyjściowym dostałem to, czego się spodziewałem. Myślę, że całkiem możliwe, że twój notatnik (lub jakikolwiek inny program, którego używasz do sprawdzenia pliku) nie pokazuje ci niektórych bajtów, które napiszesz (na przykład textedit na moim Macu odmawia wyświetlenia listy możliwych bajtów) . Jeśli jest to dokładnie używana metoda, domyślam się, że to inne rzeczy (np. Notatnik), które zawiodły, a nie kod. Jak już wspomniałeś, czasami masz wrażenie, że niektóre bajty nie są w ogóle zapisane. Być może próbując podwójnej metody public void write(byte[] b, int off, int len) można uzyskać liczbę pisanych bajtów.

+0

To był problem. Użyłem wtyczki edytora szesnastkowego do notatnika ++, aby przeczytać plik. Pobrałem edytor heksadecymalny HxD, a teraz zawartość pliku jest odczytywana zgodnie z oczekiwaniami. – esgeroth

0

Przetestowałem twój kod i nie zawodzi mi to. Czy transferujesz plik między serwerami? Ponieważ jest to plik .txt, możesz uzyskać konwersję tekstu automatycznego, czy próbowałeś bez rozszerzenia?

Pamiętaj również o zamknięciu zasobów po zakończeniu.