java多线程io阻塞_使用阻塞IO的多线程破坏Java中的文件

目的:- 使用Java中的Blocking IO来构建多线程应用程序以下载文件。 请不要建议我使用Non-Blocking IO

,有人告诉我要使用此。

问题:-

我的代码在客户端计算机上工作正常,该客户端计算机下载服务器上托管的文件。但是,问题是我的服务器使用多个线程来播种该文件。在所有情况下,收到的文件都是确切的长度,但是文件似乎已损坏。就像,当我下载一个PDF文件时,文件页面被写到最后一半(意味着所有页面都充满了原始内容的一部分)。当我下载一首歌曲时,它会突然爆满,直到播放完这些杂音为止。

问题1:- 我应如何保持完美的流畅下载,以便文件正确播放/打开/读取?我应该在此解决由于多线程而引起的问题之类的技术?

我的代码:-

服务器多线程代码::::

import java.io.BufferedInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

public class FileServer extends UnicastRemoteObject implements FileServerInitialise{

private String file="";

public FileServer() throws RemoteException{

super();

}

public void setFile(String f){

file=f;

//System.out.println("Length in setFile = "+f);

}

@Override

public boolean login(FileClientInitialise fci) throws RemoteException {

try {

InputStream is = new BufferedInputStream(new FileInputStream(file));

long len = new File(file).length();

System.out.println("Length of File = "+len);

WorkerThread wt1=new WorkerThread(0,len/2,fci,is,file);

wt1.setName("Worker Thread 1");

WorkerThread wt2=new WorkerThread(len/2+1,2*len/2,fci,is,file);

wt2.setName("Worker Thread 2");

//WorkerThread wt3=new WorkerThread(2*len/4+1,3*len/4,fci,is,file);

//wt3.setName("Worker Thread 3");

//WorkerThread wt4=new WorkerThread(3*len/4+1,len,fci,is,file);

//wt4.setName("Worker Thread 4");

wt1.start();

wt2.start();

//wt3.start();

//wt4.start();

wt1.join();

wt2.join();

//wt3.join();

//wt4.join();

return true;

}

catch (InterruptedException iex) {

iex.getMessage();

return false;

}

客户端下载代码::::

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.RandomAccessFile;

public class FileClient implements FileClientInitialise {

public static int count = 1;

public static File f;

public static FileOutputStream fos;

public static RandomAccessFile raf;

public static long pointer;

public FileClient (String filename) throws RemoteException, IOException {

super();

FileClient.f= new File(filename);

FileClient.fos = new FileOutputStream(f, true);

//FileClient.raf= new RandomAccessFile(f,"rwd");

FileClient.pointer=0;

}

@Override

public boolean sendData(String filename, byte[] data, int len, String threadName) throws RemoteException{

try{

FileClient.fos.write(data,0,len);

FileClient.fos.flush();

//FileClient.raf.seek(FileClient.pointer);

//FileClient.raf.write(data,0, len);

//FileClient.pointer=raf.getFilePointer();

System.out.println("Done writing data...");

//fos.close();

return true;

}catch(Exception e){

e.getMessage();

return false;

}

}

}

问题2:-

另外,我应该使用它RandomAccessFile来达到相同的目的吗?会更好吗?我检查了一下,它的运行速度非常慢(慢了将近10倍)。而且,如果要使用RandomAccessFile,是否应该为每个线程创建一个单独的对象?如果在这种情况下建议如何使用它?

如果无法编写代码,请给我提供技术说明,答案中不必提及该代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值