-1

J'ai besoin de déplacer les 100 derniers octets d'un fichier au début du fichier avec Java (sur android). Après avoir fait quelques recherches, j'ai une solution de travail, mais c'est beaucoup trop lent pour certains des fichiers plus volumineux avec lesquels je travaille (jusqu'à 2Go). J'ai essayé d'utiliser la méthode read() sur l'objet RandomAccessFile à l'origine et c'était beaucoup trop lent, donc après quelques recherches, j'ai trouvé une méthode alternative pour utiliser un BufferedInputStream mais cela ne semble pas augmenter les performances du tout.Déplacer 100 octets de la fin du fichier au début du fichier avec Java (RandomAccessFile est trop lent)

Je pense qu'il doit y avoir une façon plus simple, plus facile et plus rapide de faire cela.

Voici le code de travail je qui est trop lent:

 File file = new File(Environment.getExternalStorageDirectory()+"/sam.dll"); 
    RandomAccessFile f; 
    OutputStream f1; 
    try { 
     f = new RandomAccessFile(file, "r"); 
     long size = file.length(); 
     f.seek(size - 100); 
     FileInputStream fis = new FileInputStream(f.getFD()); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     try { 

      f1 = new FileOutputStream(new File((Environment.getExternalStorageDirectory()+"/sam.dl4"))); 
      for(int i = 0; i < 100; i++) { 
       f1.write(bis.read()); 
      } 
      f.seek(0); 
      bis = new BufferedInputStream(fis); 
      for(int j =0; j < size - 100;j++) { 
       f1.write(f.read()); 
      } 
      f.close(); 
      f1.close(); 
      bis.close(); 
      fis.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 


    } catch (FileNotFoundException e) { 
     Log.e("blah",e.toString()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

proposer d'autres façons que je peux accélérer ce? Est-ce que je vais tout à fait dans le mauvais sens? Je l'ai mis en place avec C# avec un objet FileStream et il décale les octets en secondes (même pour les fichiers de 2 Go) mais avec la méthode ci-dessus, ça prend littéralement des heures.

TIA

+0

Cela n'a même pas de sens. 100 bits n'est pas un nombre entier d'octets. – chrylis

+0

Lorsque vous comparez à C# où exécutez-vous votre comparaison - sur une machine Windows avec différentes caractéristiques CPU/IO ou sur Android via Xamarian/mono? –

+0

Ne pas lire et écrire bytewise. Allouer des tampons et lire et écrire en morceaux de quelques ko. – blafasel

Répondre

1

Comme indiqué par octet opérations d'E/S des performances de vidange.

La façon approriate serait:

  • allouer un tampon de taille appropriée
  • ont votre InputStream remplir la mémoire tampon dans un ou très peu d'opérations
  • E/S
  • manipuler le tampon
  • ont votre OutputStream vider le tampon sur le disque dans une ou très peu d'opérations d'E/S

En Java (n'utilisant que les classes que vous avez déjà utilisées):

byte[] buf = new byte[4096]; 
// lengthRead is the count of bytes read 
int lengthRead = inputStream.read(buf); 
doBufferMagic(buf, lengthRead); 
outputStream.write(buf, 0, lengthRead);