J'ai besoin d'effectuer une grep simple et d'autres manipulations sur de gros fichiers en Java. Je ne suis pas familier avec les utilitaires Java NIO, mais je suppose que c'est ce que j'ai besoin d'utiliser. Quelles ressources ou conseils utiles avez-vous pour lire/écrire des fichiers volumineux? En outre, je travaille sur une application SWT et j'ai besoin d'afficher des parties de ces données dans une zone de texte sur une interface graphique.Quelques conseils pour le traitement de fichiers volumineux en Java
Répondre
java.io.RandomAccessFile
utilise long pour le décalage de fichier-pointeur devrait donc être en mesure de faire face. Cependant, vous devriez lire un morceau à la fois sinon les frais généraux seront élevés. FileInputStream
fonctionne de manière similaire.
Java NIO ne devrait pas être trop difficile. Vous n'avez pas besoin de jouer avec Selector
s ou similaire. En fait, avant JDK7 vous ne pouvez pas sélectionner avec des fichiers. Cependant, évitez les fichiers de mappage. Il n'y a pas de démontage, donc si vous essayez de le faire, vous manquerez d'espace d'adressage sur les systèmes 32 bits, ou rencontrerez d'autres problèmes (NIO essaie d'appeler GC, mais c'est un peu un hack).
Je suis d'accord avec l'évitement de la cartographie des fichiers. J'ai rencontré des problèmes d'utilisation de la mémoire en raison de la non-libération des ressources des fichiers mappés lors de la fermeture de FileChannel. – Mark
Peut-être un peu hors sujet: Jetez un oeil sur VFS par apache. A l'origine, il s'agissait d'une bibliothèque pour cacher le système ftp-http-file-quel que soit le système derrière une façade de système de fichiers du point de vue de votre application. Je le mentionne ici parce que j'ai une expérience positive avec l'accès à de gros fichiers (via ftp) pour la recherche, la lecture, la copie, etc. (grand dans ce contexte signifie> 15 Mo) avec cette bibliothèque.
Si tout ce que vous faites est de lire le fichier entier un morceau à la fois, sans traitement spécial, alors nio et java.io.RandomAccessFile
sont probablement trop. Il suffit de lire et de traiter le contenu du fichier un bloc à la fois. Assurez-vous que vous utilisez un BufferedInputStream
ou BufferedReader
.
Si vous devez lire tout le fichier pour faire ce que vous faites, et que vous ne lisez qu'un seul fichier à la fois, vous profiterez peu de nio.
De quel type de fichiers parlons-nous ici? Je devine des fichiers texte, mais c'est un peu flou. Quel genre de manipulation cherchez-vous à faire? S'il vous plaît, soyez plus détaillé. –