【问题标题】:File transfer via Sockets [closed]通过套接字传输文件[关闭]
【发布时间】:2014-09-22 05:03:47
【问题描述】:

我已经编写了一个在 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();
  }
}

【问题讨论】:

标签: java sockets file-upload file-transfer


【解决方案1】:

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

第二个代码块“假定”文件长度不超过 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 作为随机的任意尺寸,但没有真正的理由选择比这更大的任何尺寸。这将复制任何大小(甚至千兆字节)的文件,整个文件,并且当文件变大时不会导致内存不足的问题。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      相关资源
      最近更新 更多