[Java - File] Lecture et écriture simultanée

Fermé
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 - 2 juil. 2007 à 17:13
 Mad - 21 févr. 2009 à 22:49
Bonjour,

Pour certaines raisons dans l'un de mes programmes j'aurais besoin - si cela est possible - d'écrire et lire plus ou moins simultanément dans un fichier (des objets). Enfin, par simultanément je veux dire par là qu'il y aurait un flux de lecture et un flux d'écriture ouvert en même temps sur le fichier.

J'aurais aimé savoir avant de me lancer dedans, si :
1 - Est-ce possible d'avoir ces deux flux ouverts en même temp ?
2 - Comment adapter ces lectures / écritures sur des ObjectStream (ObjectOutputStream / ObjectInputStream) ?

Pour le point 2 quelques explications : Je voudrais écrire des objets dans un fichier (référencés par une clé (String)) en même temps pouvoir loader les objets enregistrés dans ce fichier en fonction de la clé de recherche.
J'ai regardé un peu la doc, je suis tombé sur les classes 'java.io.ObjectInputStream.GetField' et 'java.io.ObjectOutputStream.PutField'. Est ce que utilisées avec les méthodes 'readFields' et 'writeFields' des classes ObjectOutputStream et ObjectInputStream, je pourrais règler mon problème ?

Merci pour vos réponses.
A voir également:

1 réponse

perso j'utilise java.io donc ...
voici mon bout de code ( un peu brutal certes mais pour des fichiers légers ou moyens ça passe bien )

import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.lang.*;
/*
* FileCloner.java
*
* Created on 9 mars 2005, 18:17
*/

/**
*
* @author Malko
*/
public class FileCloner {
private int deeper;
private int deep;
private String strSrc;
private String strDest;

/** Creates a new instance of FileCloner de profondeur absolue */
public FileCloner() {
deeper = 0;
deep = 1;

}
public FileCloner(int dp){
deeper = dp;
deep = 1;

}
/**
*Fonction de copie du fichier
*@ src path du fichier source
*@ dest path du fichier dest
**/
public boolean clone(String src , String dest){
strSrc = src;
strDest = dest;
boolean back = false;
boolean back2 = false;

File[] listRepSrc;
File repDest = new File(strDest);

if(new File(strSrc).isDirectory()){
listRepSrc = new File(strSrc).listFiles();
if(!repDest.exists()){
back = repDest.mkdirs();
}
if(deep < deeper || deeper == 0){
int ct = 0;
while(ct <listRepSrc.length) {
File f_dest = new File( repDest.getAbsolutePath() + "\\" + listRepSrc[ct].getName() );
if(deeper !=0 ) {
new FileCloner(deeper-1).clone(listRepSrc[ct].getAbsolutePath() , f_dest.getAbsolutePath());
}else {
new FileCloner().clone(listRepSrc[ct].getAbsolutePath() , f_dest.getAbsolutePath()) ;
}
ct += 1;

}
}
}else if( new File(strSrc).isFile()){ // si le fichier n'est pas un repertoire
FileInputStream fis = null;
FileOutputStream fos= null;
try {
File Source= new File(strSrc);
File Destination;
if(new File(strDest).isDirectory()){
Destination = new File(strDest + "\\" + Source.getName());
}else {
Destination = new File(strDest);
}
fis = new FileInputStream(Source);
fos = new FileOutputStream(Destination);
byte[] tampon=new byte[1024];
int lu = 0;
do {lu=fis.read(tampon);
if (lu!=-1) fos.write(tampon,0,lu);}
while (lu!=-1);
} catch (IOException e){
System.err.println(e.getMessage()) ;

}finally {
if (fis!=null){
try {
fis.close();
back=true;
}catch (IOException e){
}
}
if (fos!=null){
try {
back2=true;
fos.close();
}catch (IOException e){
}
}
}
}
if(back & back2){
back=true;
}else back = false;

return back;
}

}

Cette classe permet egalement de copier les repertoires et leur contenu selon la profondeur de la copie que tu souhaite choisir ...

tu y retrouvera la copie du fichier...
Le code est optimisable (pas tout frais ^^ ) mais tu as l'essentiel :)

Maddictivement.
1