2013-03-27 16 views
6

Chcę zapisać dane do pliku przy różnych przesunięciach. Przykład, w pozycji 0, w (size/2) th position, at (size/4) th position itp. Size reprezentuje rozmiar pliku, który ma zostać utworzony. Czy jest to możliwe bez tworzenia różnych części plików i dołączania do nich?Zapisywanie bajtów danych do pliku z przesunięciem w java

+1

Przejdź [tutaj] (http://docs.oracle.com/javase/tutorial/essential/io/rafs.html). –

Odpowiedz

6

Możesz pisać w dowolnym miejscu w pliku, używając RandomAccessFile - po prostu użyj seek, aby dostać się we właściwe miejsce i zacząć pisać.

Jednak nie wstawi bajtów w tych miejscach - będzie to właśnie nadpisać je (lub dodać dane na końcu jeśli piszesz poza końcem bieżącej długości pliku, oczywiście). Nie jest jasne, czy tego właśnie chcesz, czy nie.

0

Czego szukasz: Random access files. Z official sun java tutorial site -

pliki Random Access pozwalają nonsequential lub losowego dostępu do treści danej pliku. Aby uzyskać dostęp do pliku w sposób losowy, należy otworzyć plik, wyszukać konkretną lokalizację i odczytać lub zapisać w tym pliku.

Ta funkcja jest możliwa dzięki interfejsowi SeekableByteChannel. Interfejs SeekableByteChannel rozszerza kanały wejścia/wyjścia z pojęciem aktualnej pozycji. Metody umożliwiają ustawienie lub zapytanie o pozycję , a następnie można odczytać dane z tej lokalizacji lub zapisać je w tej lokalizacji. API składa się z kilku, łatwe w użyciu, metod:

pozycji - zwraca aktualny pozycja kanału
pozycji (długie) - ustawia kanału pozycja
odczytu (ByteBuffer) - Odczytuje bajtów do bufora z kanału
zapisu (ByteBuffer) - Zapisuje bajtów z bufora do kanału
skróconego (długości) - przycina plik (lub inny podmiot) połączony z kanałem

i przykład, który jest dostarczany jest -

String s = "I was here!\n"; 
byte data[] = s.getBytes(); 
ByteBuffer out = ByteBuffer.wrap(data); 

ByteBuffer copy = ByteBuffer.allocate(12); 

try (FileChannel fc = (FileChannel.open(file, READ, WRITE))) { 
    // Read the first 12 
    // bytes of the file. 
    int nread; 
    do { 
     nread = fc.read(copy); 
    } while (nread != -1 && copy.hasRemaining()); 

    // Write "I was here!" at the beginning of the file. 
    // See how they are moving back to the beginning of the 
    // file? 
    fc.position(0); 
    while (out.hasRemaining()) 
     fc.write(out); 
    out.rewind(); 

    // Move to the end of the file. Copy the first 12 bytes to 
    // the end of the file. Then write "I was here!" again. 
    long length = fc.size(); 

    // Now see here. They are going to the end of the file. 
    fc.position(length-1); 

    copy.flip(); 
    while (copy.hasRemaining()) 
     fc.write(copy); 
    while (out.hasRemaining()) 
     fc.write(out); 
} catch (IOException x) { 
    System.out.println("I/O Exception: " + x); 
} 
0

Jeśli nie jest to ogromny plik można odczytać całą rzecz i od edycji tablicy:

public String read(String fileName){ 
    BufferedReader br = new BufferedReader(new FileReader(fileName)); 
    try { 
     StringBuilder sb = new StringBuilder(); 
     String line = br.readLine(); 

     while (line != null) { 
      sb.append(line); 
      sb.append("\n"); 
      line = br.readLine(); 
     } 
     String everything = sb.toString(); 
    } finally { 
     br.close(); 
    } 
} 

public String edit(String fileContent, Byte b, int offset){ 
    Byte[] bytes = fileContent.getBytes(); 
    bytes[offset] = b; 
    return new String(bytes); 
] 

a następnie zapisać go z powrotem do pliku (lub po prostu usunąć starą i pisać tablica bajtów do nowego pliku o tej samej nazwie)

Powiązane problemy