2012-10-01 18 views
7

Olası Çoğalt silmeden bir dosyaya bayt:
Best Way to Write Bytes in the Middle of a File in JavaYaz mevcut bayt

ben bayt yazmak için gereken bir dosya var.

Dosyada hangi konumda 'a ihtiyacım olduğunu biliyorum belirli baytlar ekleyin. Bir şeyleri açıklığa kavuşturmak için, mevcut baytları silmeden dosyanın ortasındaki baytları yazmam gerekiyor. Tüm işlem daha sonra dosyanın uzunluğunu arttırmalıdır.

Bunu yapmanın en iyi yolu nedir?

+0

http://stackoverflow.com/questions/181408/best-way-to-write-bytes-in-the-middle-of-a-file-in-java – gtgaxiola

+0

Zaten denedim, maalesef uygulamam baytlar, ancak varolan baytları siler, gerçekte ekleme için ne işe yarar? –

+0

@gtgaxiola: Bu, mevcut baytların üzerine yazacağı için işe yaramaz çünkü –

cevap

4

Bunu yapmanın tek yolu, şu anda yolda olan baytları hareket ettirmektir. Bunu ne sıklıkta yapmanız gerektiğine ve dosyanın ne kadar büyük olduğuna bağlı olarak, yeni bir dosya oluşturmak, varolan dosyayı kopyalamak ve yeni baytları yol boyunca eklemek genellikle daha iyi bir fikirdir.

kullanabileceğiniz size seyrek dosyayı güncellemeniz gerekir, yoksa (belki 100 kb kadar) küçük ise RandomAccessFile a:

  1. bayt sayısını ekleyerek setLength() yöntemi kullanılarak, dosyayı uzatın sen 'length() yöntemiyle döndürülen her şeye eklenecektir.
  2. Yeterli belleğiniz varsa, tüm baytları ekleme noktasından dosyanın önceki sonuna kadar tutacak bir byte[] oluşturun.
  3. Çağrı seek() o adresinden tampon yazmak için
  4. Çağrı write() eklemek için ekleme noktası + bayt numaradan konumlandırmak için geçici diziyi
  5. Çağrı seek() doldurmak için ekleme noktasına
  6. Çağrı readFully() de konumlandırmak için nokta
  7. Çağrı seek() yeni bayt sayısı
yazmak için ekleme noktasına
  • Çağrı `yazılır() konumlandırmak için

    2 numaralı adımda yeterince büyük bir dizi oluşturamazsanız, daha küçük bir arabelleğe sahip bir döngüde 3-6 numaralı adımları gerçekleştirmeniz gerekir. Verimlilik için en az 64k'lık bir tampon kullanırdım.

  • +0

    + 1 çok iyi kaplıdır. –