CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Java] Ecrire au milieu d'un fichier

hexabeast
hexabeast
Niveau 9
20 août 2014 à 13:12:10

Bonjour,
Je cherche comment modifier uniquement une ligne d'un fichier en contenant un millier.
En cherchant sur google je ne trouve que des solutions qui impliquent la création d'un fichier temporaire, dans lequel tout le contenu du premier fichier est copié avec des modifications.
Or, mon fichier est d'une taille relativement grosse (il sert à stocker 20 millions de int), donc je cherche seulement à écrire à un endroit précis, sans toucher au reste, pour éviter un gros copier/coller qui prendrait du temps.
C'est possible?

Gleuh
Gleuh
Niveau 10
20 août 2014 à 13:30:25

Il sert à quoi ton fichier de 20 millions de int ?
Sinon je sais pas du tout, désolé, mais j'ai une petite idée de ce que tu pourrais faire.
Au lancement du programme tu charge le fichier, et tu manipule celui-ci uniquement en mémoire, ( accès au milieu et tout plus facile donc) , et à la fermeture du programme Bah tu enregistre tout simplement t'es int dans le fichier :) non ?

Gleuh
Gleuh
Niveau 10
20 août 2014 à 13:34:24

Pour ton terraria non ?

hexabeast
hexabeast
Niveau 9
20 août 2014 à 14:03:00

Ouais c'est pour le Terraria, mais justement j'aimerais sauvegarder la map automatiquement toutes les minutes par exemple, en ne modifiant dans le fichier que les "chunks" modifiés en jeu.

Ce que je fais actuellement c'est enregistrer tout à la fermeture mais ça prend bien 5 secondes minimum pour la compression + la save, et j'aimerais réduire ce temps le plus possible.

Gleuh
Gleuh
Niveau 10
20 août 2014 à 14:07:09

C'est pour Android non ? Je sais si c'est propre ce que je dis, mais ce que tu pourrais faire c'est que quand l'utilisateur quitte le jeu, l'application est quitte mais le code tourne toujours, donc pendant que l'utilisateur à quitte l'app et est déjà aller sur une autre app ton jeu sauvegarde encore la mal tu vois, regarde peut être sur les méthodes on Stop ou onDestroy je sais pas si ça fait ça :)
Ou alors carrément tu fait un service en arrière plan qui save la map à la fermeture de l'app :)
Ou alors tu fais ce que j'ai dis dans mon premier post mais avec genre une sauvegarde automatique toutes les 20/30 secondes dans un thread différent ?

hexabeast
hexabeast
Niveau 9
20 août 2014 à 14:15:09

C'est prévu pour android uniquement si j'arrive à optimiser le jeu assez. Etant donné la taille de la map, une save sur android prend plus de 3 minutes, ce qui est beaucoup trop.
Sinon c'est pour PC.

Et ma question c'est "Comment ecrire au milieu d'un fichier?", tout simplement car c'est de loin la solution la plus performante et la plus pratique. Tout ce que t'expliques c'est des trucs que j'ai déjà mis en place.

Mais merci de vouloir aider quand même :)

hexabeast
hexabeast
Niveau 9
20 août 2014 à 14:38:28

J'ai vu ça sur google, mais du coup j'ai un autre problème avec ce truc: comme c'est dit ici http://stackoverflow.com/questions/15461555/inserting-text-in-middle-using-randomaccessfile-removes-some-text-after-that , ça n'a pas l'air de prendre en compte les sauts de lignes, donc en gros si on écris un String str de 14 caractères sur une ligne qui en comprend déjà 8, ça va remplacer ces 8 caractères par les 8 premiers de str, mais au lieu d'écrire les 6 autres sur la même ligne aussi ça va se mettre à écraser la ligne suivante...

Comment je peux palier à ce problème du coup?

Et dans le cas contraire, si un String str fait 8 caractères et que la ligne que l'on souhaite remplacer en fait 14, comment effacer les 6 caractères qui restent?

Gleuh
Gleuh
Niveau 10
20 août 2014 à 15:44:14

Ouch, je pensais que c'était 5 seconde sur android, mais si c'est 3 minutes c'est vrai que c'est beaucoup, très beaucoup ...

Tu fait quoi pour avoir tout ce temps en chargement ?

[-Shana-]
[-Shana-]
Niveau 10
20 août 2014 à 16:10:17

Gleuh :d) Je pense qu'il ne connait pas le base64 :noel:

hexabeast
hexabeast
Niveau 9
20 août 2014 à 16:26:16

J'utilise du base64, mais la compression/decompression des 20 millions de bytes met un certain temps.

En tout cas j'avais la flemme d'attendre une réponse donc j'ai simplement séparé la map en 130 fichiers différents :hap:

Le load est légèrement plus long mais ça fonctionne.

Gleuh
Gleuh
Niveau 10
20 août 2014 à 16:54:20

Ca fonctionne mais c'est moche :hap: Faut vraiment optimiser, je sais pas comment ta map marche mais même une map minecraft gigantesque atteint difficilement les 5mo...

hexabeast
hexabeast
Niveau 9
20 août 2014 à 17:42:49

Oui désolé si j'ai pas été très clair :-(

Mon fichier contient des int compressés sous forme de String (donc même si le nombre d'int est toujours le même le String change de taille).

Sinon Gleuh j'ai eu pendant un temps un petit serveur Minecraft pas moddé ni rien et la map faisait plus de 700Mo.

Mais bon même si ça fait pas super la technique des 130 fichiers dans un dossier fonctionne bien, la sauvegarde est quasi instantanée, y'a une save auto toutes les 30 secondes IG qui dure même pas une demi seconde et qui baisse pas le framerate, donc plus aucun problème, sujet résolu en quelque sorte :)

hexabeast
hexabeast
Niveau 9
20 août 2014 à 19:51:53

En fait j'utilise des bytes pour le stockage (encore un fail de ma part -_-), et ces bytes sont compressés avec le DeflaterOutputStream de java, puis écrits sous forme de String (j'ai repris pour ça le code de l'éditeur Tiled mais remplacé les int par des bytes).

C'est approprié non? :question:

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment