最近,我編寫了一個簡單的客戶端服務器程序,用於通過標準TCP套接字進行文件傳輸。 WiFi通道的平均吞吐量約爲2.2Mbps。我的問題是: 是否可以通過多個數據IO流傳輸大文件(比如5 GB),以便每個流可以以並行方式傳輸同一文件的多個部分(不同的線程可用於此目的)?這些文件部分可以在接收端重新組裝。 我試圖拆分一個小文件並通過數據輸出流傳輸它。第一部分工作正常,但我不知道如何以選擇性的方式讀取文件輸入流(我也嘗試使用mark()和reset()方法進行選擇性讀取,但沒有用處)通過使用多個IO流的java套接字進行文件傳輸
這是我的代碼用於測試目的,我重定向輸出到FileOutputStream中):
public static void main(String[] args) {
// TODO Auto-generated method stub
final File myFile=new File("/home/evinish/Documents/Android/testPicture.jpg");
long N=myFile.length();
try {
FileInputStream in=new FileInputStream(myFile);
FileOutputStream f0=new FileOutputStream("/home/evinish/Documents/Android/File1.jpg");
FileOutputStream f1=new FileOutputStream("/home/evinish/Documents/Android/File2.jpg");
FileOutputStream f2=new FileOutputStream("/home/evinish/Documents/Android/File3.jpg");
byte[] buffer=new byte[4096];
int i=1, noofbytes;
long acc=0;
while(acc<=(N/3)) {
noofbytes=in.read(buffer, 0, 4096);
f0.write(buffer, 0, noofbytes);
acc=i*noofbytes;
i++;
}
f0.close();
我得到了我的文件的第一部分(這可以在一個線程中被複制到一個DataOutputStream類)。任何人都可以建議,如何在一段N/3中讀取文件的剩餘部分(在N/3字節之後),以便三個線程可以在三個線程中用於併發操作?
這是在接收器端合併文件段代碼:
package com.mergefilespackage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class MergeFiles {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
IOCopier.joinFiles(new File("/home/evinish/Documents/Android/File1.jpg"), new File[] {
new File("/home/evinish/Documents/Android/File2.jpg"), new File("/home/evinish/Documents/Android/File3.jpg")});
}
}
class IOCopier {
public static void joinFiles(File destination, File[] sources)
throws IOException {
OutputStream output = null;
try {
output = createAppendableStream(destination);
for (File source : sources) {
appendFile(output, source);
}
} finally {
IOUtils.closeQuietly(output);
}
}
private static BufferedOutputStream createAppendableStream(File destination)
throws FileNotFoundException {
return new BufferedOutputStream(new FileOutputStream(destination, true));
}
private static void appendFile(OutputStream output, File source)
throws IOException {
InputStream input = null;
try {
input = new BufferedInputStream(new FileInputStream(source));
IOUtils.copy(input, output);
} finally {
IOUtils.closeQuietly(input);
}
}
}
class IOUtils {
private static final int BUFFER_SIZE = 1024 * 4;
public static long copy(InputStream input, OutputStream output)
throws IOException {
byte[] buffer = new byte[BUFFER_SIZE];
long count = 0;
int n = 0;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
public static void closeQuietly(Closeable output) {
try {
if (output != null) {
output.close();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
任何幫助,將不勝感激!提前致謝!
如果你想通過同一個WiFi通道輸出更多的數據,它可能會變慢,因爲每個套接字都會增加其他的爭用。 – hexafraction
+1 to @hexafraction。問題是限制因素是什麼。我懷疑(像@hex),你正在被無線網速限制,並且因爲其他連接將在同一個無線信道上,所以它們將不能並行工作。 – Gray
@Gray作爲答案發布。 – hexafraction