① 在java中,用多線程來搬運一個音頻文件,求代碼和詳解!
代碼沒有,不過提供思路:
先將音頻文件完全的讀入。。
然後使用1M就開啟一個線程的方法,並添加一個tag 例如:threadi:+音頻第iM的數據,並開啟一個socket將這個文件傳輸過去。結束的最後一段數據後面加上 :end標識
伺服器開啟10個等待連接的線程。接收到:end標識之後,將所有的文件根據之前的threadi來組織起來並創建音頻文件。如果有線程沒有接收有丟失,就伺服器返回信息i. 客戶端根據i重新傳送
② 2、 使用多線程技術編寫文件復製程序。(使用java編程)
package junit.test;
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 CopyFiles implements Runnable {
/**
* 要復值到的地址
*/
private String toaddr;
/**
* 復制源
*/
private String source;
/**
*
* @param toaddr 要復值到的地址
* @param source 復制源
*/
public CopyFiles(String toaddr, String source) {
super();
this.toaddr = toaddr;
this.source = source;
} private void File( ) throws Exception { File f1 = new File(this.toaddr);
if(!f1.exists()){
f1.mkdir();
}
File source1 = new File(this.source);
if(source1.isDirectory()){
File t = new File(f1, source1.getName());
t.mkdir();
File[] files = source1.listFiles();
if (files != null) {
this.getfiles(files, t);
}
}else{
File[] files = source1.listFiles();
if (files != null) {
this.getfiles(files, f1);
}
}
} private void getfiles(File[] fs, File f) {
for (File file : fs) {
if (file.isDirectory()) {
File[] fi = file.listFiles();
File t = new File(f, file.getName());
t.mkdir();
if (fi != null) {
getfiles(fi, t);
}
} else {
InputStream in = null;
OutputStream out1 = null;
System.err.println(new File(f, file.getName()).getName());
try {
in = new FileInputStream(file);
System.err.println(f.getPath());
out1 = new FileOutputStream(new File(f, file.getName()));
byte[] b = new byte[1024];
int i = 0;
while ((i = in.read(b)) > 0) {
out1.write(b, 0, i);
out1.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out1.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
} } }
}
} public void run() {
try {
File();
} catch (Exception e) {
e.printStackTrace();
}
} public String getToaddr() {
return toaddr;
} public void setToaddr(String toaddr) {
this.toaddr = toaddr;
} public String getSource() {
return source;
} public void setSource(String source) {
this.source = source;
}
}
這是我寫的不知道是不是你想要的下面是測試類package junit.test;public class Test {
public static void main(String[] args) {
CopyFiles files = new CopyFiles("D:","C:\\新建文件夾");
Thread t = new Thread(files);
t.start();
}
}
③ 如何解決:多線程和單線程拷貝文件那個效率高
看場景;
效率的瓶頸不在代碼的時候,比如用的最多的io操作,
下載器,下載伺服器每個介面就給你500k的速度,那多線程相當於500*n,本地網路最大2m每秒,可以開3~5個線程自然快;
復制器,windows操作系統復制文件很慢,因為負責復制的api防止系統卡死每個線程就給你那點速度,如果用java寫個多線程io流復制,速度快8倍左右;
這樣的場合有個特點,速度或者說效率的關鍵不是java的處理能力,而是介面限製成了瓶頸;
舉個反例,如果對一個集合進行遍歷,列印value,使用多線程明顯比單線程效率低;因為時間過多的消耗在了創建線程,銷毀線程上,執行的有用代碼和單線程沒區別,效率不如單線程;
④ java大數據 多線程寫文件
1、採用public static的變數存儲這一數值,每個線程都往這一共有靜態變數里寫入已復制大小。 2、採用Callable方式實現多線程,將結果作為返回值返回到主線程。這一方法只能在所有子線程都完成之後才能通過future獲取。
⑤ java 有比用多線程更快的復制技術嗎
...瓶頸在硬體讀寫速度.....不在你單線程還是多線程....windows復制更接近直接控制硬體自然效率更高
看你的代碼...復制的讀寫依然是在同一個線程內做的...你只是把這個過程獨立於主線程處理了....這不會提高什麼速度吧......正常多線程復制應該是兩個線程 一個只負責從原文件往緩沖區讀 一個只負責從緩沖區往目標文件寫....
如果想得到更快的復制速度....恐怕只能直接操作硬碟扇區?
⑥ java 多線程復制文件
很簡單,你的maxBufferSize沒有賦值。
⑦ JAVA多線程復制文件,請大神幫我看看,哪裡邏輯錯了,調式了好久,都不成功。。
Copy c = new Copy();
放到循環里邊去
for(inti=0;i<5;++i){
Copyc=newCopy();
c.set(i*size,(i+1)*size);//線程啟動前,設置好文件的讀取寫入位置。
newThread(c).start();
}
⑧ java 根據一個文件內容同時操作多個文件
可以用多線程來操作,java8的非同步多線程CompletionStage介面,就可以實現,或者不使用多線程使用單線程版反應器模式Reactor(反應器)定製幾個處理器介面,根據第一個文件的內容來分發到不同的處理器來處理你具體的需求,具體代碼有空可以寫給你