使用套接字编程发送文件(大)

ibi*_*nja 3 java sockets

我想知道我是否能得到一些解决问题的指导......

你看,我正试图接受Socket编程; 我设法创建了一个客户端和服务器; 服务器写入客户端没问题; 我甚至设法使用发送文件

byte [] mybytearray  = new byte [(int)myFile.length()];
  FileInputStream fis = new FileInputStream(myFile);
Run Code Online (Sandbox Code Playgroud)

在服务器端.在客户端

byte [] mybytearray  = new byte [filesize];
InputStream is = sock.getInputStream();
FileOutputStream fileos = new FileOutputStream("Filename.dat");
BufferedOutputStream bufferos = new BufferedOutputStream(fileos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;


do {
   bytesRead =
      is.read(mybytearray, current, (mybytearray.length-current));
   if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);

bufferos.write(mybytearray, 0 , current);
bufferos.flush();
long end = System.currentTimeMillis();
System.out.println(end-start);
bufferos.close();
Run Code Online (Sandbox Code Playgroud)

我的问题是我无法发送大文件; 我继续得到"线程中的异常"主"java.lang.OutOfMemoryError:Java堆空间"

有关如何管理从服务器向客户端发送大文件的任何想法或指示?我的意思是600 MB左右的大小....任何想法?非常感谢...谢谢

Mic*_*ear 5

好吧,你的堆当前不得不尝试保持'mybytearray',这是你想要接收的文件的大小(大概).您需要将bos.write()操作移动到循环内,并使'mybytearray'成为固定大小.这是一个将一个流复制到另一个流的示例,它并不真正关心正在流式传输的数据的大小:

    public static void stream(InputStream in, OutputStream out)
        throws IOException {
    byte[] buf = new byte[1024];
    int bytesRead = 0;

    try {

        while (-1 != (bytesRead = in.read(buf, 0, buf.length))) {
            out.write(buf, 0, bytesRead);
        }

    } catch (IOException e) {
        log.error("Error with streaming op: " + e.getMessage());
        throw (e);
    } finally {
                    try{
           in.close();
           out.flush();
           out.close();
                    } catch (Exception e){}//Ignore
    }
}
Run Code Online (Sandbox Code Playgroud)