Je souhaite lire le fichier à partir de deux endroits différents simultanément. Je veux aussi utiliser un flux d'E/S tamponné pour l'efficacité. J'ai essayé de travailler sur mon propre API java, mais ça ne marche pas. Quelqu'un va t'aider? J'en ai besoin pour le tri externe de fusion. Merci pour l'aide!Comment accéder au même fichier à deux endroits différents dans Java
Répondre
Vous devez créer un RandomAccessFile
, qui est l'équivalent de Java du fichier mappé en mémoire de C.
Je found an example de ceci:
try {
File file = new File("filename");
// Create a read-only memory-mapped file
FileChannel roChannel = new RandomAccessFile(file, "r").getChannel();
ByteBuffer roBuf = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, (int)roChannel.size());
// Create a read-write memory-mapped file
FileChannel rwChannel = new RandomAccessFile(file, "rw").getChannel();
ByteBuffer wrBuf = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, (int)rwChannel.size());
// Create a private (copy-on-write) memory-mapped file.
// Any write to this channel results in a private copy of the data.
FileChannel pvChannel = new RandomAccessFile(file, "rw").getChannel();
ByteBuffer pvBuf = roChannel.map(FileChannel.MapMode.READ_WRITE, 0, (int)rwChannel.size());
} catch (IOException e) {
}
Edition, vous avez dit que vous ne pouvez pas utiliser un RandomAccessFile
, qui est la seule façon de sauter de haut en bas dans le fichier. Si vous êtes bloqué sans cela, vous devez lire le fichier séquentiellement, mais cela ne signifie pas que vous ne pouvez pas ouvrir plusieurs pointeurs sur le même fichier pour le lire.
J'ai assemblé le test/échantillon suivant et il montre clairement que vous pouvez ouvrir le fichier "deux fois" avec différents pointeurs de lecture et additionner séquentiellement deux moitiés du fichier. Encore une fois, si vous avez besoin accès aléatoire, vous devez utiliser un RandomAccessFile
, et c'est ce que je vous suggère, mais ici vous allez:
public class FileTest {
public static void main(String[] args) throws IOException, InterruptedException, ExecutionException{
File temp = File.createTempFile("asfd", "");
BufferedWriter wrt = new BufferedWriter(new FileWriter(temp));
int testLength = 10000;
int numWidth = String.valueOf(testLength).length();
int targetSum = 0;
for(int i = 0; i < testLength; i++){
// each line guaranteed to have a good number of characters for our test
wrt.write(String.format("%0"+ numWidth +"d\n", i));
targetSum += i;
}
wrt.close();
BufferedReader rdr1 = new BufferedReader(new FileReader(temp));
BufferedReader rdr2 = new BufferedReader(new FileReader(temp));
rdr2.skip((numWidth+1)*testLength/2); // skip first half of the lines
Summer sum1 = new Summer(rdr1, testLength/2);
Summer sum2 = new Summer(rdr2, testLength/2);
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<Integer> halfSum1 = executor.submit(sum1);
Future<Integer> halfSum2 = executor.submit(sum2);
System.out.println("Total sum = " + (halfSum1.get() + halfSum2.get()) + " reference " + targetSum);
rdr1.close();
rdr2.close();
temp.delete();
}
private static class Summer implements Callable<Integer>{
private BufferedReader rdr;
private int limit;
public Summer(BufferedReader rdr, int limit) throws IOException{
this.rdr = rdr;
this.limit = limit;
}
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName() + " started " + System.currentTimeMillis());
int sum = 0;
for(int i = 0; i < limit; i++){
sum += Integer.valueOf(rdr.readLine());
// uncomment to see interleaving of threads:
//System.out.println(Thread.currentThread().getName());
}
System.out.println(Thread.currentThread().getName() + " finished " + System.currentTimeMillis());
return sum;
}
}
}
Oh, ouais, je n'ai pas le droit de mapper la mémoire :(C'est pour l'attribution d'une université Mon université est un peu retardée et ne sait pas comment restreindre la mémoire si la carte mémoire est permise – nivwusquorum
Que voulez-vous dire? Mémoire"? –
Qu'est-ce qui vous empêche d'ouvrir simplement le fichier deux fois, et travailler avec comme si c'était deux fichiers indépendants?
File inputFile = new File("src/SameFileTwice.java");
BufferedReader in1 = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile)));
BufferedReader in2 = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile)));
try {
String strLine;
while ((strLine = in1.readLine()) != null && (strLine = in2.readLine()) != null) {
System.out.println(strLine);
}
} finally {
in1.close();
in2.close();
}
- 1. La même adresse montre deux endroits différents
- 2. Comment lire deux endroits différents dans un fichier à l'aide de Buffered IO en Java
- 3. Comment écrire dans un fichier à différents endroits?
- 4. Incrustation XUL utilisée à différents endroits dans la même fenêtre?
- 5. Partage même contrôle vectoriel entre différents endroits
- 6. Comment: afficher un classLibrary-projec à deux endroits différents?
- 7. formulaire html simple à poster à deux endroits différents
- 8. JAVA: Comment mes deux applications peuvent-elles accéder au même fichier?
- 9. AS3: Splice deux éléments dans des endroits différents?
- 10. Un moyen de pouvoir installer la même application ClickOnce à partir de deux endroits différents?
- 11. Une sous-vue est affichée à différents endroits sur deux vues avec le même cadre
- 12. Accéder au fichier robots.txt dans java
- 13. Écrire à deux endroits de la console en même temps
- 14. Xcode - Réglage de Zombie activé dans deux endroits différents?
- 15. Deux jquery.js différents volent dans un même fichier html
- 16. Même .vimrc, deux ordinateurs différents
- 17. comment mettre un UIElement dans un arbre visuel deux fois dans différents endroits?
- 18. Qu'arrivera-t-il à deux processus d'arrière-plan différents qui accèdent au même fichier sous Unix?
- 19. Log4net Connexion à deux fichiers différents dans la même application
- 20. AngularJS Gérer différents codes d'erreur à différents endroits
- 21. Comment accéder à un fichier de configuration dans deux fichiers MXML différents
- 22. Deux objets différents sur le même socket Java
- 23. Rails méthodes ActiveRecord dans différents endroits
- 24. db4o: même classe, différents projets java
- 25. java util logging.properties: Comment se connecter à deux fichiers différents
- 26. WP_Query écho tableaux dans différents endroits
- 27. Accéder au fichier jar?
- 28. phpbb3 comment arrêter la même connexion de l'utilisateur à partir de différents endroits
- 29. ERD pour deux endroits
- 30. Deux graphiques différents dans la même parcelle
Pourquoi voulez-vous lire un fichier à deux endroits en même temps? Où les traces de pile de code/d'exception de la vapeur io ne fonctionnent-elles pas? – Jeffrey
Fondamentalement, j'ai essayé d'utiliser RandomAccessFile, puis l'envelopper dans: nouveau DataInputStream (nouveau BufferedInputStream (nouveau FileInputStream (fichier.getFD()))); Où fichier est un fichier d'accès aléatoire. Chaque fois que j'ai commencé à accéder au bloc de fichier à un endroit différent, j'ai cherché sur RandomAccessFile puis j'ai créé un nouveau wrapper. – nivwusquorum