public class DemoThread extends Thread {

private URL url = null;
private int id = 0;
private long startPos = 0;
private long endPos = 0;
private boolean flag = false;

private static String localFile = "d:\\yyy.rar";
private static String localTmp = "d:\\yyy.tmp";

/**
 * @param url  下载的URL地址
 * @param id 线程ID
 * @param startPos 线程下载的开始位置
 * @param endPos 线程下载的结束位置
 */
public DemoThread(String url, int id, long startPos, long endPos){
try {
this.url = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
this.id = id;
this.startPos = startPos;
this.endPos = endPos;
//this.flag = flag;
}

@Override
public void run() {
System.out.println("线程 " + id + " 启动...");
InputStream input = null;
RandomAccessFile raf = null;
HttpURLConnection httpConn = null;
byte[] b = new byte[3174400];
try{
File file = new File(localTmp);
httpConn = (HttpURLConnection) url.openConnection();
httpConn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos);
httpConn.setRequestProperty("Accept","image/gif,image/x-xbitmap,application/msword,*/*");
raf = new RandomAccessFile(file, "rw");
raf.seek(startPos);
input = httpConn.getInputStream();
int byteread = 0;

while((byteread = input.read(b)) > 0){
//if(id == 6)System.exit(1);
synchronized(file){raf.write(b, 0, byteread);}
}

System.out.println("线程 "+ id + " 下载范围从 " + startPos + " =====> " + endPos + " 已完成下载");
}catch(Exception ex){
ex.printStackTrace();
}finally{
try {
if(null != raf){raf.close();}
if(null != input){input.close();}
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != httpConn){httpConn.disconnect();}

}

public static void main(String[] args) throws Exception{
String url = "http://192.168.1.109:8080/picps/upload/1010/20110323105542414.rar";
File f = new File("D:\\tools\\Tomcat 6.0\\webapps\\picps\\upload\\1010/20110323105542414.rar");
int threadCount = 10;
  long fileLength = 0, len = 0;
  boolean flag = false;
  //是否存在tmp文件
  if(isExistsFile(localTmp)){
  len = getLength(localTmp);
  fileLength = f.length() - len;
  System.out.println("已下载: "+len);
System.out.println("未下载: "+fileLength);
  flag = true;
  } else {
  fileLength = f.length();
  }
long subLen = fileLength / threadCount;
long mod = fileLength % threadCount;
System.out.println("每块下载: "+subLen);
System.out.println("总大小:"+f.length());

long pStart = len ;
long pEnd = len + subLen;
for(int i = 0; i < threadCount ; i ++){
if(!flag){
pStart = subLen * i ;
pEnd = subLen * (i + 1) -1;
if(i == threadCount - 1){ pEnd += mod; }
}else{//续传
if(i > 0){
pStart = pEnd + 1;
pEnd = pStart + subLen;
}
if(i == threadCount -1){ pEnd = f.length(); }
}
System.out.println(pStart + "  "+pEnd);
DemoThread dt = new DemoThread(url, i + 1, pStart, pEnd);
dt.start();
}
Thread.sleep(2000);
System.out.println(new File(localTmp).length()+" ========>>> "+f.length());
//下载完成,更改tmp文件后缀名
if(new File(localTmp).length() == f.length()){
fileRename(localTmp,localFile);
}
}

// 判断文件是否存在
private static boolean isExistsFile(String path){
return new File(path).exists();
}

//获取文件大小
private static long getLength(String path){
return new File(path).length();
}

//将下载完全的文件更名,去掉.tmp名
private static void fileRename(String fName,String nName) throws Exception{
File file = new File(fName);
file.renameTo(new File(nName));  
boolean b = file.delete();
System.out.println("============文件下载完成,删除临时文件============"+b);
}以上是源代码,续传时,续传完的文件大小是总文件大小,但是解压时只是文件夹,文件夹里没有文件!
请问,续传时问题错在哪?急...........