我用java写了个文件传输软件,可是传输一些小的文件能够正常传输,但是当文件比较大的时候就出现下列问题! Exception in thread "Thread-5" java.lang.outofMemoryError: java heap space at transSocket.transclientSocket.run<transclientSocket.java;70>我在网上搜索了类似的问题,按照他们的说法在windows环境变量里加入JAVA_OPTS=-Xms64m -Xmx512m
可是还是不行!
我的问题是:小文件可以传输(10兆左右的),在大就出现上面问题,恳求高手指点,不胜感激!

解决方案 »

  1.   

    主要代码为下! public void run(){
    try{System.out.println("address= "+address);
       OutputStream out=socket.getOutputStream();
       BufferedOutputStream buff=new BufferedOutputStream(out);
      
       String st=this.getPath();System.out.println("st= "+st);
       File file=new File(st);
       String fileName=null;
       if(file.isFile()&&file.exists()){
          fileName=file.getName();System.out.println("fileName= "+fileName);
            byte b[]=fileName.getBytes();
            buff.write(b);
            byte a[]="\n".getBytes();
           buff.write(a);
        }       
      
       else JOptionPane.showMessageDialog(null,"此文件是个目录或者不是个合法文件\n请重新确定你要传送的文件"
                                                   ,"文件错误",JOptionPane.WARNING_MESSAGE );

      ProgressMonitorInputStream pr=new ProgressMonitorInputStream(null,"reading the file",new FileInputStream(file));
          ProgressMonitor prog=pr.getProgressMonitor();
         // prog.setMillisToPopup(100);
          prog.setMillisToDecideToPopup(10);
          BufferedInputStream input=new BufferedInputStream(pr);   
      int length=0;
      while((length=input.available())!=0){    
       byte[] c=new byte[length];
       int j=input.read(c,0,c.length);
       if(j!=-1){
       buff.write(c);
       }
      
      }
     
       input.close();
       buff.close();
       socket.close();
      
    }
    catch(IOException e3){
    e3.printStackTrace();
    }

    }
      

  2.   

    怎么个分法?
    还有一个问题,就是我添加的那个ProgressMonito查看传输进度的,怎么就不弹出进度窗口
      

  3.   

    我分开传输了,可是又出现下面问题,真是郁闷!
    java.net.socketException:software caused connection abort:socket write error
    这又是怎么回事!
      

  4.   

    我分开传输了,可是又出现下面问题,真是郁闷!
    java.net.socketException:software caused connection abort:socket write error
    这又是怎么回事!
      

  5.   

    哈哈
    你的代码不全啊
    你后面改的话应该只传了那你分割后的第一个部分就把SOCKET关掉了!!
      

  6.   

    我分开传输了,可是又出现下面问题,真是郁闷! 
    java.net.socketException:software caused connection abort:socket write error 
    这又是怎么回事!
      

  7.   

    我把代码这样分割,怎么还出现以上问题,请高手指教!  while(input.available()>1024){
      
       byte[] c=new byte[1024];
       int j=input.read(c,0,c.length);
       if(j!=-1) {System.out.println(++d);
       buff.write(c);
       buff.flush();
       }
      }
      
      
      int length=input.available();
      byte[] c=new byte[length];
      int j=input.read(c,0,c.length);
      if(j!=-1){System.out.println("ccccccccccccccccccccccccccccc");
       buff.write(c);buff.flush();
      }
      

  8.   

    package util;import java.io.BufferedInputStream;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.net.Socket;public class FileSender implements Runnable{
    /**
     * 文件发送类
     * 主要用于将文件发送到特定的IP目的地
     * 目前只支持单个文件发送
     */
        private String serverIP; //服务器IP
        private int port; //服务器端口    
        private Socket socket = null; //套接字
        private DataOutputStream out = null;//数据输出流,用于将数据写入文件    
        private DataInputStream in = null; //数据输入流,从服务器获取数据输入流
        private File file; //存放文件   
        private int bufferSize=1; //文件接收缓冲区大小,单位KB,默认为1KB
        private int completed; //文件传输进度,0<completed<=100
        private boolean stop=false; //停止接收文件标记    
        
        public FileSender() {} //默认构造函数
       
        public FileSender(Socket socket,String ip, int port){
         setSocket(socket); //设置套接字
            setServerIP(ip); //设置服务器IP
            setPort(port); //设置服务端口
        }
        public FileSender(Socket socket,String ip,int port,File file){
         setSocket(socket); //设置套接字
         setServerIP(ip); //设置服务器IP
            setPort(port); //设置服务端口
            setFile(file);   //设置要发送的文件        
        }       
       
        public void run(){
         /**
          * 发送函数,覆盖run()方法
          */
    try{
    setIn(new DataInputStream( //设置数据输入流
                 new BufferedInputStream(getSocket().getInputStream())));    
             getIn().readByte();                
             DataInputStream fis = new DataInputStream( //设置文件输入流
             new BufferedInputStream(new FileInputStream(getFile().getPath())));
             setOut(new DataOutputStream(getSocket().getOutputStream()));                                
            
             //发送输文件信息
             getOut().writeUTF((getFile().getName())); //发送文件名
             getOut().flush();
             getOut().writeLong((long) getFile().length()); //发送文件长度
             getOut().flush();            
            byte[] buf = new byte[getBufferSize()]; //创建缓冲区             
                
    //开始传送文件
    long haveSent=0; //已发送数据量,以byte为单位
    long fileLength=getFile().length();
             while (!isStop()) {
             int read = 0;
         if (fis != null) {
         read = fis.read(buf); //将部分文件数据读入缓冲区
                 }
               if (read == -1) {break;} //读到文件结尾       
               getOut().write(buf, 0, read); //将读取的数据写入网络输出流
             haveSent+=read; //计算已传送数据量,单位Byte
             completed=(int)((100*haveSent)/fileLength); //获取文件传输进度,0<completed<=100
             }//end while            
             getOut().flush();               
             fis.close(); //关闭文件输入流                
             getSocket().close();       //关闭socket            
    }catch(Exception e){
    e.printStackTrace();
    }
    }//end run 

        public boolean shutDownConnection() {
         /**
          * 关闭连接方法
          */
            try {
                if (getOut() != null)
                 getOut().close(); //关闭输出流
                if (getIn() != null)
                 getIn().close(); //关闭输入流
                if (getSocket() != null)
                 getSocket().close(); //关闭Socket            
                return true; //连接关闭成功
            } catch (Exception e) {
             //System.out.println("连接关闭失败!");
             e.printStackTrace();
             return false;
            }
        } public String getServerIP() { //获取服务器IP
    return serverIP;
    }
    public void setServerIP(String ip) { //设置服务器IP
    this.serverIP = ip;
    }
    public int getPort() { //获得服务器端口
    return port;
    }
    public void setPort(int port) { //设置服务端口
    this.port = port;
    }
    public Socket getSocket() { //获得Socket
    return socket;
    }
    public void setSocket(Socket socket) { //设置socket
    this.socket = socket;
    }
    public DataOutputStream getOut() { //获取数据输出流
    return out;
    }
    public void setOut(DataOutputStream out) { //设置数据输出流
    this.out = out;
    }
    public DataInputStream getIn() { //获取数据输入流
    return in;
    }
    public void setIn(DataInputStream in) { //设置数据输入流
    this.in = in;
    }
    public String getFileName() { //获取文件名
    return getFile().getName();
    }
    public int getBufferSize() { //获取缓冲区大小
    return bufferSize;
    }
    public void setBufferSize(int bufferSize) { //设置缓冲区大小
    this.bufferSize = bufferSize;
    }
    public int getCompleted() { //获取文件传输进度
    return completed;
    }
    public boolean isStop() { //获取文件传输状态,是否已停止
    return stop;
    }
    public void setStop(boolean stop) { //停止文件传输
    this.stop = stop;
    }
    public File getFile() { //获取发送的文件
    return file;
    }
    public void setFile(File file) { //设置待发送的文件
    this.file = file;
    }
    }
    这是我以前写的Java文件传输工具里面的文件发送类,LZ可以参考下,我就不解释了。完整的文件传输工具源代码我已经上传到我的CSDN资源里面,包括发送端和接收端,有界面,好久没更新了,源代码已经封装到jar文件里面了。