大饼先生 2006-8-26 11:17
一个奇怪的问题~~
import java.io.*;
import java.net.*;
public class FileServer{
private String fileName;
private Socket s = null;
private RandomAccessFile raf;
private long fileSize;
public FileServer(String fileName){
this.fileName = fileName;
}
public void server(){
try {
ServerSocket ss = new ServerSocket(1111);
File f = new File(fileName);
fileSize = f.length();
raf = new RandomAccessFile(f,"r");
int count=5; //默认用5个线程传送。
while(count-- >= 0){
s = ss.accept();
new Thread(new Runnable(){
public void run(){
try{
BufferedOutputStream cout = new BufferedOutputStream(s.getOutputStream());
BufferedReader cin = new BufferedReader(new InputStreamReader(s.getInputStream()));
InputStream tmp;
byte[] buf = new byte[1024];
int i;
switch(Integer.parseInt(cin.readLine())){
case 0: tmp = FileBreak(raf,0,fileSize/5);
while((i=tmp.read(buf))!=-1){
cout.write(buf,0,i);
}
cout.flush();
break;
case 1: tmp = FileBreak(raf,fileSize/5,fileSize*2/5);
while((i=tmp.read(buf))!=-1){
cout.write(buf,0,i);
}
cout.flush();
break;
case 2: tmp = FileBreak(raf,fileSize*2/5,fileSize*3/5);
while((i=tmp.read(buf))!=-1){
cout.write(buf,0,i);
}
cout.flush();
break;
case 4: tmp = FileBreak(raf,fileSize*3/5,fileSize*4/5);
while((i=tmp.read(buf))!=-1){
cout.write(buf,0,i);
}
cout.flush();
break;
case 5: tmp = FileBreak(raf,fileSize*4/5,fileSize*5);
while((i=tmp.read(buf))!=-1){
cout.write(buf,0,i);
}
cout.flush();
break;
}
}catch(Exception e ){}
}
}).start();
}
// out.close();
raf.close();
ss.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public InputStream FileBreak(RandomAccessFile raf,long begin, long end){
PipedInputStream in = null;
PipedOutputStream out = null;
try {
raf.skipBytes((int)begin);
raf.setLength(end);
out = new PipedOutputStream();
in = new PipedInputStream();
out.connect(in);
int i;
System.out.println("second mark");
while((i=raf.read())!=-1){
System.out.println(i);
out.write(i);
}
System.out.println("third mark");
//out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(Exception e){e.printStackTrace();}
return in;
}
public static void main(String[] args){
try{
FileServer fs = new FileServer("D:\\test.swf");
//long fileSize = new File("D:\\test.swf").length();
System.out.println("first mark");
//fs.test(new RandomAccessFile("d:\\test.swf","rw"));
File f = new File("D:\\test.swf");
if(f.exists()){
RandomAccessFile raf = new RandomAccessFile(f,"rw");
InputStream in = fs.FileBreak(raf,0,raf.length());
FileOutputStream out = new FileOutputStream("D:\\tmp.swf");
int i;
System.out.println("forth mark");
while((i=in.read())!=-1){
out.write(i);
}
System.out.println("fifth mark");
out.close();
in.close();
}
}
catch(Exception e){e.printStackTrace();}
}
}
在上面源码中的 FileBreak方法中,我的目的是在一个随机文件中读取指定开始位置和结束位置的字节放到输入流里~~ 但是写的测试输出的只会输出到second mark就不动了,也就是说在FileBreak方法中的那段while里阻塞了。。也没有任何异常报告。。。。搞了半天都没搞定~~郁闷~~~