我想同時從兩個不同的位置讀取文件。我也想使用緩衝的I/O流來提高效率。我試圖解決我自己給定的Java API,但它不工作。任何人都會幫忙?我需要它進行外部合併排序。感謝幫助!如何在Java中的兩個不同位置訪問同一文件
0
A
回答
1
您需要創建一個RandomAccessFile
,它基本上是C的內存映射文件的Java等價物。
這個我found an example:
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) {
}
編輯,你說你不能使用RandomAccessFile
,這是跳過上下通過文件的唯一途徑。如果沒有它就卡住了,那麼你必須按順序讀取文件,但這並不意味着你不能打開多個指向同一文件的指針進行讀取。
我把下面的測試/示例放在一起,它清楚地表明您可以用不同的讀指針打開文件「兩次」,並按順序將文件的兩半相加。同樣,如果你需要隨機存取,你必須使用一個RandomAccessFile
,而這正是我建議,但在這裏你去:
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;
}
}
}
+0
噢,是的,我不允許記憶地圖:(這是爲大學的作業而設計的,我的uni有點遲鈍,如果允許內存映射,他們不知道如何限制內存。 – nivwusquorum
+0
你是什麼意思「restrict記憶」? –
0
什麼是從簡單的打開文件兩次,並與工作阻止你它好像是兩個獨立的文件?
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. 如何在Java中同時訪問同一對象的兩種不同方法?
- 2. Mysql - 訪問同一服務器中不同位置的兩個數據庫
- 3. 兩個不同的jquery.js文件位於同一個html文件
- 4. 兩個不同的C程序正在訪問一個文件
- 5. 如何標記兩個地圖中的兩個不同位置是同一頁?
- 6. 同一地址位置如何給出兩個不同的值?
- 7. 如何在Java中的不同位置創建一個文件的副本?
- 8. JAVA:我的兩個應用程序如何訪問同一個文件?
- 9. 如何在同一個PHP腳本中訪問兩個不同的PHP會話?
- 10. 兩個java文件,在同一目錄中,一個訪問其他類/ s?
- 11. Java:訪問與.jar位於同一目錄中的文件
- 12. C++,如何做兩個指向同一位置值不同
- 13. 如何在同一查詢中訪問兩個不同的鏈接服務器
- 14. 在與二進制文件不同的位置訪問App.config
- 15. 如何訪問螞蟻的屬性文件如果是在不同的位置
- 16. 如何設置可在不同位置訪問的Intranet?
- 17. 如何在同一資源上同步兩個進程訪問?
- 18. 給同一類中的2個不同圖像提供兩個不同位置
- 19. 如何讀取屬性從不同的位置,文件中JAVA
- 20. 如何在同一行中兩次讀取同一個文件
- 21. 在兩個不同的java文件中有相同的類名問題
- 22. 在不同的文件中訪問類
- 23. 如何在同一個XML文件中合併兩個不同的子節點
- 24. 如何讓兩個不同的PDF文件出現在同一個iframe中?
- 25. 比較兩個元素在同一位置上的兩個不同列表
- 26. 如何訪問位於不同的DLL
- 27. 如何包含同一頭文件的兩個不同版本?
- 28. 在不同的文件夾中訪問一個類
- 29. 兩個圖像在同一位置
- 30. 兩個div在同一位置
爲什麼要在兩個地方同時讀取文件? io蒸汽的代碼/異常堆棧痕跡在哪裏不起作用? – Jeffrey
基本上我嘗試使用RandomAccessFile,然後將其包裝到: new DataInputStream(new BufferedInputStream(new FileInputStream(file.getFD()))); 其中文件是隨機訪問文件。每次我在不同的地方開始訪問文件塊時,我都在RandomAccessFile上使用了seek,然後創建了新的包裝器。 – nivwusquorum