2009-06-23 8 views
5

Je suis à la recherche d'un moyen efficace de créer un fichier dont la taille est inconnue, mais peut varier de mb de chez Go et de remplir son contenu au hasard. Je peux écrire les 200 premiers octets que de sauter à la fin et écrire les 200 derniers octets et de passer au milieu et écrire là. Est-ce que RandomAccessFile est efficace pour ce faire ou existe-t-il des alternatives mieux adaptées à ce genre de travail?Java accès au grand fichier

Répondre

10

Oui, utiliser RandomAccessFile - c'est ce qu'il est là pour ça. Vous pouvez utiliser potentiellement un FileChannel, mais j'irais pour RandomAccessFile d'abord - il est susceptible d'être plus simple.

Notez que vous ne serez pas en mesure de « insérer au milieu » du fichier après avoir écrit la partie terminale: Je ne sais pas tout système de fichiers qui soutient que. Vous aurez besoin de connaître la taille complète avant d'écrire la dernière section, fondamentalement. Une alternative serait d'écrire séquentiellement, en se souvenant du dernier morceau jusqu'à la fin.

Si vous pouvez nous donner plus d'informations sur ce que vous devez faire (et quand vous avez des informations sur la taille) nous pouvons être en mesure de vous aider plus.

EDIT: Pour créer le fichier avec une taille spécifique, vous pouvez seek() passé la fin et écrire des données:

import java.io.*; 

public class Test 
{ 
    // Just for the sake of a simple test program! 
    public static void main(String[] args) throws Exception 
    { 
     RandomAccessFile file = new RandomAccessFile("file.dat", "rw"); 

     file.seek(100); 
     file.write(0); 
     file.close(); 
    } 
} 

Après cela, a quitté, file.dat sera 101 octets. (Notez que normalement vous utiliseriez try/finally, etc.)

EDIT: Comme coobird mentionné dans les commentaires, setLength() étendra également le fichier - mais il tronquera également le fichier si vous lui donnez une longueur inférieure au courant Taille. Compte tenu de votre commentaire à propos de l'écriture de données torrent fondamentalement, je soupçonne que la recherche et l'écriture est exactement le comportement que vous voulez. Lorsque vous recevez un morceau, cherchez juste au bon endroit, écrivez-le, et le fichier s'étendra lui-même quand il le faut.

+0

Est-il possible de créer un fichier avec une taille préfixée autre que itérer et écrire tout de zéro ou son pour le remplir? –

+0

Modification pour refléter cela. –

+0

Merci, la raison pour laquelle je dois écrire des parties aléatoires dans le fichier, est que j'implémente un client torrent et les pièces arriveront pour des emplacements aléatoires dans le fichier, mais je sais à l'avance quelle sera la taille du fichier. –

1

Je suppose que RandomAccessFile est très bien pour ce problème

Questions connexes