IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Couper un bout de fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 35
    Points
    35
    Par défaut Couper un bout de fichier
    Bonjour,

    Je suis en train d'essayer de faire quelque chose qui semble impossible à partir de fonctionnalités de l'API.

    Je possède un fichier qui contient un ensemble de bloc. A un moment, je suis amené à supprimer un bloc du fichier, cad que mon fichier à la fin doit avoir ce qu'il y a avant, et ce qu'il y après.

    Après avoir parcouru une bonne parti de l'api qui concerne I/O, le seul moyen que j'ai trouvé c'est de tronquer mon fichier au debut du bloc pour ensuite réécriture tout ce qu'il y avait après, ce qui potentiellement représente un gros morceau.

    transferTo() et transferFrom() de FileChannel à l'air de dire qu'il optimise un peu en fonction du comportement de l'OS pour que celui ci modifie ses pages d'indexation a la place de copier bit à bit.

    Du coup voilà ma question : Y-a-til un moyen simple de virer un bout précis d'un fichier sans devoir avoir un stream ouvert sur la fin et de tout réécrire la fin dans le seul but de concaténer ?
    Une fonction qui rajoute un morceau à un autre en discardant tout ce qu'il y a au millieu en somme ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Je doute déjà de l'existence de ce genre de fonction au niveau de l'os, alors pour ce qui est de mapper une hypothétique méthode en java.... T'as pas la choix, c'est de la réécriture.

    Si vraiment çà pose des problèmes de perfs (genre le fichier fait 15G, faut 30 secondes pour chaque opéraiton), essaie de regrouper tes coupures. ou alors essaie de changer ton format de fichier pour qu'il accepte des trous (voir déplace un bloc de la fin vers le trou):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AABBCCDDEEFFGG
    deviendrais pour virer CC
    AABBGGDDEEFF

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Oui sauf que non, parce que les blocs sont en plus de taille variable

    Bref, tout ce que je vois comme solution c'est de réécriture, ou d'ajouter un systeme avec des trous et un systeme de defrag par la suite.

    Les fichiers ne feront probablement pas 15Go comme tu le dis, mais dans tous les cas, il est fort probable que je doive "couper" un bout de tres nombreuses fois en un laps de temps très court. Du coup, meme si le fichier n'est pas forcement très gros, si je dois faire ca tout le temps, je perd énormement en perf par rapport à un système où je pourrais linker directement le bout d'apres à la suite du bout d'avant.

    Si je demande votre aide, c'est bien pour vérifier que personne a de solution interessante, car personellement j'en vois pas ...

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Ben tu peux aussi tapper le fichier en mémoire et travailler depuis ta copie mémoire si il est pas trop gros ....

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    D'un point de vue système, il n'est effectivement pas possible de supprimer un bloc en milieu de fichier. Il faut réécrire, pas le choix !
    Il fait quelle taille en moyenne, ce fichier ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    D'un point de vue système, il n'est effectivement pas possible de supprimer un bloc en milieu de fichier. Il faut réécrire, pas le choix !
    Il fait quelle taille en moyenne, ce fichier ?
    C'est paramétrable mais on va dire que globalement, il fera quelques Mo, probablement entre 20 et 50 Mo au max.

    Mais bon, cela fait lire et réécrire potentiellement tout le fichier si on supprime un bloc qui se trouvait au début. J'ai peur que cela soit pas négligeable quand il va devoir faire cela a tour de bras...

    Les monter en mémoire, je préférerai pas non plus, si je gagne en temps, je perd en mémoire pour le reste de l'application qui est déjà somme toute assez lourde en mémoire

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Alors il faut revoir ta conception
    Tu peux expliquer un peu ce que fait ton programme ? Et aussi tes algo de traitements ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Alors il faut revoir ta conception
    Tu peux expliquer un peu ce que fait ton programme ? Et aussi tes algo de traitements ?
    Ce que fait l'application on s'en moque.
    Mais elle a besoin d'enregistrer des données dans un fichier utiles à son fonctionnement.

    Chaque fois qu'elle modifie une donnée ou presque, cela doit se répercuter dans le fichier de sauvegarde. Je dois donc mettre a jour en quelque sorte le fichier pour qu'il reste synchronisé avec les données. Hors, si la donnée est désormais plus petite, j'aurais voulu effacer le trou. De même si on supprime une donnée.

    Bref j'ai rien dit de plus, mais j'ai tout dit en même temps pour expliquer le problème.

    La solution est apparemment unique même si ça ne me convient qu'a moitié : : réécrire toute la fin de fichier pour la concaténer au début... malgré que je peux optimiser par ci par là (cache toussa, ok pas de problème mais j'espérais une solution plus simple, je pensais peut etre avoir loupé quelque chose dans l'api qui aurait permis de prendre un bout, un autre bout et de les coller dans passer par de la réécriture bit à bit bourrine ou presque.)

    Bref, si personne à une idée fulgurante qui remplacerait une écriture de la fin après le début, je peux considérer cela comme globalement résolu ... :/

    Merci de votre participation quand même

    [Nb HS : etant nouveau par ici (oui faut un debut à tout), il se passe quoi si je "deleste" le message ?]

Discussions similaires

  1. Couper chemin d'un fichier
    Par neGo33 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 12/05/2011, 18h48
  2. [FMOD] Générer un "stop" en bout de fichier
    Par ttone dans le forum FMOD
    Réponses: 3
    Dernier message: 06/01/2011, 11h17
  3. [Toutes versions] couper un url de fichier
    Par patricktoulon dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/12/2009, 21h15
  4. Récupérer un bout de fichier texte dans une variable
    Par killerman31 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 15/01/2009, 12h03
  5. Comment couper en 2 un fichier ISO
    Par john30 dans le forum Ubuntu
    Réponses: 5
    Dernier message: 26/08/2008, 19h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo