这个是jsp页面的代码  里面的注释说明了我情况 再次感谢大家Ftpdownload fd = new Ftpdownload();   
File file = fd.doDownload();//这里通过ftp客户端取得服务器端的一个文件   
                   
response.setCharacterEncoding("UTF-8");   
request.setCharacterEncoding("UTF-8");//我想解除下乱码   
                   
//我不知道以下的这个头设置是否合适,但是那2个字“中文”总是乱码 我页面pageEncoding="UTF-8"   
response.addHeader("Content-Disposition","attachment;filename=" + "中文" + file.getName());   
                   
//我把文件的大小算出来 目的想想在后面的测试   
long l = file.length();   
String s = String.valueOf(l);   
int j = Integer.parseInt(s);   
//构建输入输出流   
OutputStream outputStream = response.getOutputStream();   
InputStream inputStream = new FileInputStream(file);   
  
//byte[] buffer = new byte[j]; //我若直接用文件的大小做缓冲 那么若文件很大将java heap 溢出   
                   
                   
byte[] buffer = new byte[1024];     
//我若以某个量作为缓存,奇怪的现象发生了,他将重复从ftp服务器那里取得文件加入缓存   
//重复次数为 文件大小除以1024   
int i = -1;   
while ((i = inputStream.read(buffer)) != -1) {   
outputStream.write(buffer, 0, i);   
}   
outputStream.flush();   
outputStream.close();   
inputStream.close();   
outputStream = null;   
} catch (Exception e) {   
} finally {   
out.clear();   
out = pageContext.pushBody();   

解决方案 »

  1.   

    request.setCharacterEncoding("GBK");//解除乱码   
    页面pageEncoding也要改成GBK
      

  2.   

    //我把文件的大小算出来 目的想想在后面的测试   
    long l = file.length();   
    String s = String.valueOf(l);   
    int j = Integer.parseInt(s);  计算文件大小这么写肯定是不对的,即使这么计算也应该是file.getSize();但是这个方法好像也是不对的。file.available() 好像是计算文件大小 可以试一下
      

  3.   

    response.setContentLength(( int ) file .length()); //  设置下载内容大小 --------------------------------------------------------------------------
    BufferedOutputStream output=new  BufferedOutputStream(response.getOutputStream());
    改用缓冲流吧!!-----------------------
    输入到缓冲流里然后
    response.flushBuffer();而不是流outputStream.flush();
    ----------------------------------------------------
    原因:没有采用缓冲流,流压缩会造成数据不全吧!
    中文写成这样--new  String("中文".getBytes()," ISO8859-1");
    response.addHeader("Content-Disposition","attachment;filename=" + new  String("中文".getBytes()," ISO8859-1") + file.getName());