通过套接字传输文件

时间:2014-09-21 16:05:11

标签: java sockets file-upload file-transfer

我编写了一个在Java套接字中传输文件的代码,但我想扩展它。我想选择我想要的文件。我不理解一行代码:

byte[] mybytearray = new byte[(int) myFile.length()];

这是我的真实代码:

import import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Main {
    public static void main(String[] args) throws IOException {
        ServerSocket servsock = new ServerSocket(123456);
        File myFile = new File("s.pdf");

        while (true) {
            Socket sock = servsock.accept();
            byte[] mybytearray = new byte[(int) myFile.length()];
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
            bis.read(mybytearray, 0, mybytearray.length);
            OutputStream os = sock.getOutputStream();
            os.write(mybytearray, 0, mybytearray.length);
            os.flush();
            sock.close();
        }
    }
}

客户端模块:

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;

public class Main {
  public static void main(String[] argv) throws Exception {
    Socket sock = new Socket("127.0.0.1", 123456);
    byte[] mybytearray = new byte[1024];
    InputStream is = sock.getInputStream();
    FileOutputStream fos = new FileOutputStream("s.pdf");
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    int bytesRead = is.read(mybytearray, 0, mybytearray.length);
    bos.write(mybytearray, 0, bytesRead);
    bos.close();
    sock.close();
  }
}

2 个答案:

答案 0 :(得分:1)

这行代码试图创建一个与您正在读取的文件大小相同的字节数组,允许它在一次读取中将整个文件读入字节数组。

第二个代码块“假定”该文件长度不超过1024个字节,并且不再读取该长度。你知道文件是< = 1024字节长吗?

由于多种原因,在处理流时使用可变缓冲区大小是个坏主意。流的美妙之处在于你没有整个文件存储在内存中。相反,使用这种模式......这很容易:

    {
        Socket sock = servsock.accept();
        byte[] mybytearray = new byte[4096];
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
        OutputStream os = sock.getOutputStream();
        int amt = bis.read(mybytearray, 0, 4096);
        while (amt>0) {
            os.write(mybytearray, 0, amt);
            amt = bis.read(mybytearray, 0, 4096);
        }
        os.flush();
        sock.close();
    }

我选择4096作为随机任意大小,但没有真正的理由选择任何大于此的大小。这将复制任何大小(甚至千兆字节)的文件,整个文件,并且当文件变大时不会导致内存不足问题。

答案 1 :(得分:0)

查看The Java™ Tutorials, Trail: Learning the Java Language, Arrays

简而言之:它为byte类型的元素创建一个数组,其大小为myFile中的字节数。由于数组创建需要int大小的值java.io.File商品long length(),因此返回的long值会转换为(int)。做一个DDuckinG并查看提供的教程。