JAVA切分大檔案
假設一個很大的文字檔案,每行以\n結束。
下面的程式碼,可以切分指定的大檔案,並且保證每個檔案都是\n結束。
這是外部排序切分的前提條件。
下面的程式碼,可以切分指定的大檔案,並且保證每個檔案都是\n結束。
這是外部排序切分的前提條件。
-
import java.io.BufferedInputStream;
-
import java.io.BufferedOutputStream;
-
import java.io.File;
-
import java.io.FileInputStream;
-
import java.io.FileOutputStream;
-
import java.io.IOException;
-
import java.io.RandomAccessFile;
-
import java.nio.ByteBuffer;
-
import java.nio.MappedByteBuffer;
-
import java.nio.channels.FileChannel;
-
import java.nio.channels.FileChannel.MapMode;
-
import java.util.ArrayList;
-
import java.util.List;
-
-
public class Sort {
-
public static void main(String[] args) throws IOException {
-
Sort s = new Sort();
-
s.splitByChannel("F:/t.txt", 10, "F:/");
-
}
-
-
/**
-
* 使用IO流切分指定檔案
-
*/
-
public List<File> splitByStream(String file, int piece, String outputDirectiry) throws IOException {
-
List<File> result = new ArrayList<File>();
-
List<Point> list = blocking(new File(file), piece);
-
for (int i = 0; i < list.size(); i++) {
-
File outputFile = new File(outputDirectiry + i + "_byStream.txt");
-
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
-
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outputFile));
-
in.skip(list.get(i).getSkipSize());
-
int index = 0;
-
while (index < list.get(i).getLength()) {
-
out.write(in.read());
-
index++;
-
}
-
out.flush();
-
out.close();
-
in.close();
-
result.add(outputFile);
-
}
-
return result;
-
}
-
-
/**
-
* 使用記憶體對映檔案切分指定檔案
-
*/
-
public List<File> splitByMappedByteBuffer(String file, int piece, String outputDirectiry) throws IOException {
-
List<File> result = new ArrayList<File>();
-
List<Point> list = blocking(new File(file), piece);
-
for (int i = 0; i < list.size(); i++) {
-
File outputFile = new File(outputDirectiry + i + "_byMappedByteBuffer.txt");
-
FileChannel in = new RandomAccessFile(file, "r").getChannel();
-
FileChannel out = new RandomAccessFile(outputFile, "rw").getChannel();
-
MappedByteBuffer outBuffer = out.map(MapMode.READ_WRITE, 0, list.get(i).length);
-
MappedByteBuffer inBuffer = in.map(MapMode.READ_ONLY, list.get(i).getSkipSize(), list.get(i).getLength());
-
outBuffer.put(inBuffer);
-
outBuffer.force();
-
in.close();
-
out.close();
-
result.add(outputFile);
-
}
-
return result;
-
}
-
-
/**
-
* 使用通道切分指定檔案
-
*/
-
public List<File> splitByChannel(String file, int piece, String outputDirectiry) throws IOException {
-
List<File> result = new ArrayList<File>();
-
List<Point> list = blocking(new File(file), piece);
-
for (int i = 0; i < list.size(); i++) {
-
File outputFile = new File(outputDirectiry + i + "_byChannel.txt");
-
FileChannel in = new FileInputStream(file).getChannel();
-
FileChannel out = new FileOutputStream(outputFile).getChannel();
-
ByteBuffer buffer = ByteBuffer.allocate(list.get(i).getLength());
-
in.read(buffer, list.get(i).getSkipSize());
-
buffer.flip();
-
out.write(buffer);
-
in.close();
-
out.close();
-
result.add(outputFile);
-
}
-
return result;
-
}
-
-
/**
-
* 對檔案進行切分 1.先根據指定的引數分片,每個分片以\n結束 2。根據分片的情況,計算切點
-
*/
-
private List<Point> blocking(File file, int piece) throws IOException {
-
List<Point> result = new ArrayList<Point>();
-
List<Long> list = new ArrayList<Long>();
-
list.add(-1L);
-
long length = file.length();
-
long step = length / piece;
-
long index = 0;
-
for (int i = 0; i < piece; i++) {
-
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
-
if (index + step < length) {
-
index = index + step;
-
in.skip(index);
-
-
while (in.read() != 10) {
-
index = index + 1;
-
}
-
list.add(index);
-
index++;
-
}
-
in.close();
-
}
-
list.add(length - 1);
-
System.out.println(list);
-
for (int i = 0; i < list.size() - 1; i++) {
-
long skipSize = list.get(i) + 1;
-
long l = list.get(i + 1) - list.get(i);
-
result.add(new Point(skipSize, l));
-
-
}
-
System.out.println(result);
-
return result;
-
}
-
-
/**
-
* 切分檔案的切點 skipSize指的是從流跳過的size length指的是從流讀出的長度
-
*/
-
private class Point {
-
public Point(long skipSize, long length) {
-
if (length > Integer.MAX_VALUE) {
-
throw new RuntimeException("長度溢位");
-
}
-
this.skipSize = skipSize;
-
this.length = (int) length;
-
}
-
-
@Override
-
public String toString() {
-
return "Point [skipSize=" + skipSize + ", length=" + length + "]\n";
-
}
-
-
private long skipSize;
-
private int length;
-
-
public long getSkipSize() {
-
return skipSize;
-
}
-
-
public int getLength() {
-
return length;
-
}
-
-
}
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1161173/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- golang 讀取切分儲存byte流檔案Golang
- Java如何上傳大檔案Java
- Java高效讀取大檔案Java
- 使用Java處理大檔案Java
- Linux下檔案的切分與合併的簡單方法Linux
- java讀取大檔案並處理Java
- java讀取大檔案1G+Java
- java 統計大文字檔案的行數Java
- smali檔案對比java檔案Java
- MySQL水平切分MySql
- 大檔案Copy
- Java讀取大檔案的高效率實現Java
- java檔案流Java
- JAVA 操作檔案Java
- java 檔案操作Java
- 如何分發大檔案、大檔案傳輸解決方案
- 如何快速傳輸大檔案,介紹大檔案快速方法
- git大檔案管理Git
- 檢視大檔案
- 查詢大檔案
- java 讀 大檔案excel 記憶體溢位 解決JavaExcel記憶體溢位
- JAVA實現大檔案分片上傳斷點續傳Java斷點
- 將Schema檔案轉換為Java檔案Java
- 大檔案如何傳輸,大檔案的傳輸方式有哪些?
- git 查詢大檔案、刪除大檔案詳細步驟Git
- MySQL垂直切分和水平切分概念和優缺點介紹MySql
- Java 讀取檔案Java
- java class檔案解析Java
- Java 檔案 IO 操作Java
- java 生成 excel檔案JavaExcel
- Java檔案壓縮Java
- Java操作Excel檔案JavaExcel
- java操作ini檔案Java
- java檔案操作大全Java
- java 檔案壓縮Java
- java呼叫exe檔案Java
- java寫檔案(轉)Java
- 海量資料遷移之透過rowid切分大表