2010-04-27 16 views
0

J'ai besoin de transférer beaucoup de petits fichiers sur un ordinateur distant dans mon programme Java. Je me demandais si quelqu'un pourrait suggérer la meilleure façon de le faire ... J'ai besoin de transférer beaucoup de petits fichiers et il doit être très rapide. Dois-je utiliser une implémentation de protocole existante? peut-être ftp?Transférer des fichiers en utilisant java

Une chose importante est que la plupart des fichiers seraient les mêmes tout le temps, ou la différence serait mineure alors je pensais utiliser git à cette fin. Est-ce que quelqu'un a de l'expérience avec sth comme ça?

+2

Cela ressemble à un travail pour 'rsync'. –

+0

Ceci devrait être renommé, les balises git et java supprimées et envoyées à la faute du serveur. Est-ce parce qu'il y a eu des activités qu'on ne peut pas voter pour déménager? – Stephen

Répondre

3

De votre description, rsync est un modèle absolument parfait pour vos besoins, bien supérieur aux alternatives qui ont été offertes.

+0

Je commence à le penser aussi. J'ai trouvé quelques implémentations de Windows (http://www.itefix.no/i2/node/10650) - mais je vais devoir vérifier comment il fonctionne avant de le mettre en service. – markovuksanovic

+0

Peut-on configurer rsync, après avoir fait la copie initiale, pour supprimer un fichier distant, s'il a été supprimé localement? J'ai essayé de l'utiliser un peu et il semble laisser ces fichiers dans le dossier distant. – markovuksanovic

+0

Oh, --delete fait le travail :) – markovuksanovic

1

Que pensez-vous de la compression de ces fichiers, puis de l'utilisation de ftp? Avez-vous la possibilité de décompresser sur le côté du récepteur? Git est un système de contrôle de version, il n'est pas nécessaire d'ajouter des fichiers git au-dessus de vos fichiers, si vous ne voulez pas extraire les fichiers plus tard. Je préfère utiliser ftp.

Voici une belle article sur les bibliothèques Java ftp (ou vous pouvez utiliser un appel système à un client ftp de la console, mais je n'aime pas cette idée)

+0

FTP est une option, mais comme je m'attends à transférer un très grand nombre de petits fichiers, je m'attends à ce que ce soit lent. Et la vitesse à laquelle ces fichiers sont transférés est absolument cruciale. – markovuksanovic

+0

Eh bien oui, c'est pourquoi j'ai recommandé de compresser les fichiers en premier. Ce n'est pas difficile d'implémenter la compression zip dans Java. Et vous allez transférer un gros fichier (archive zip) plutôt que beaucoup de petits fichiers, il y a beaucoup moins de frais généraux. Le client Ftp devra faire une connexion, une déconnexion et une commande RETR, et c'est tout. Vous ne souffrirez pas de la vitesse de cette façon. P.S. Si ces fichiers sont en texte brut, le taux de compression sera énorme aussi, donc vous obtiendrez plusieurs avantages – Eedoh

+0

Et qu'en est-il du fait que la plupart de ces fichiers seront les mêmes (très probablement plus de 90%) et les transférer, à mon humble avis, est juste une exagération. – markovuksanovic

0

Qui reçoit les fichiers que vous envoyez? une autre application? Vous pouvez utiliser un logiciel de messagerie tel que active MQ

ou Respectez les API Java pour FTP.

URL url = new URL("ftp://user:[email protected]/filename;type=i"); 
URLConnection urlc = url.openConnection(); 
InputStream is = urlc.getInputStream(); // To download 
OutputStream os = urlc.getOutputStream(); // To upload 

Vous vous demandez pourquoi vous voulez impliquer git. Est-ce qu'il fournit une API pour trouver delta etc? Je ne pense pas. git est un système de contrôle de version autant que je sache.

+0

Les fichiers doivent être copiés sur une autre machine afin qu'ils puissent être traités par une autre application. Comme je l'ai déjà mentionné, je m'attends à avoir un grand nombre de petits fichiers. La plupart de ces fichiers seront les mêmes ou avec un petit diff. Il y aura très peu de fichiers qui doivent être complètement transférés. Sth comme système de contrôle de version semble être une option raisonnable. – markovuksanovic

+0

NON vous seriez abuser du système de contrôle de version pour quelque chose de trivial. Et s'il y a un grand nombre de fichiers? pourquoi ne pouvez-vous pas utiliser JMS ou FTP pur? après tout, les fichiers sont petits !? –

+0

Et si j'avais 5000 fichiers dont seulement quelques centaines ont besoin d'être transférés (soit parce qu'ils sont modifiés ou nouveaux). Comment JMS fonctionnerait-il dans cette situation? – markovuksanovic

0

Le moyen le plus efficace pour transférer beaucoup de petits fichiers est comme une archive; par exemple. ZIP ou TAR. Si votre réseau est relativement lent, compresser l'archive avant la transmission fera une grande différence entre les fichiers. Mais si le réseau est vraiment rapide, la compression peut en fait rendre le temps total pour transférer les fichiers plus longtemps. L'autre facteur qui fait une grande différence est la vitesse à laquelle le système de fichiers peut lire et (surtout) créer des fichiers.

Le protocole Git peut être très rapide, mais il permet d'y parvenir en envoyant uniquement les fichiers qui ont été modifiés et (si possible) en envoyant des différences au lieu de fichiers complets. Cette approche ne peut pas être utilisée pour le transfert de fichiers régulier. Rdist et rsync sont d'anciens outils UNIX/Linux qui adoptent la même approche (différentielle) pour le transfert de fichiers que Git et d'autres systèmes de contrôle de version. Ils ne vous aideront pas pour les mêmes raisons que Git ne le fera pas ... en général.

+0

Eh bien, je m'attends à ce que la plupart des fichiers soient les mêmes et très peu d'entre eux avec quelques différences. Je m'attends à ce que même moins de fichiers soient nouveaux. – markovuksanovic

1

Le Apache VFS projet est une bibliothèque java que vous pouvez utiliser à partir de votre programme pour copier des fichiers entre les systèmes de fichiers. (Par exemple, copiez les fichiers locaux vers FTP/SCP/HTTP.)

copie peut être configuré de telle sorte que seuls les fichiers dans la source qui sont plus récents que la destination sont copiés, ce qui réduit la quantité de données envoyées.

Liens

  1. Apache VFS
  2. le file systems pris en charge.
Questions connexes