Java 客户机-服务器文件传输

Java 客户机-服务器文件传输,java,java-io,Java,Java Io,您好,我在将文件从客户端传输到服务器端时遇到问题。从我最初的研究中,我发现DataInputStream可以用于我的传输。但不幸的是,使用DataInput/Output流传输的文件会损坏。文件大小保持不变,但当我打开文件时,我看不到内容,文本中显示十六进制内容。 从一些互联网链接中,我发现这可能是由于开放的套接字或流造成的,但效果还不够好。有人能帮我解决这个问题吗。每次传输后,我的文件都会损坏 下面是我的代码: Client Side Code if (isConnected) {

您好,我在将文件从客户端传输到服务器端时遇到问题。从我最初的研究中,我发现DataInputStream可以用于我的传输。但不幸的是,使用DataInput/Output流传输的文件会损坏。文件大小保持不变,但当我打开文件时,我看不到内容,文本中显示十六进制内容。 从一些互联网链接中,我发现这可能是由于开放的套接字或流造成的,但效果还不够好。有人能帮我解决这个问题吗。每次传输后,我的文件都会损坏

下面是我的代码:

Client Side Code
if (isConnected) {
        File transferFile = new File(dir);
        if (!transferFile.exists() || !transferFile.canRead()) {
            System.out.println("error");
            System.err.println();
        }
        OutputStream os = clientSocket.getOutputStream();           
        byte[] bytearray = new byte[(int) transferFile.length()];
        DataOutputStream dos = new DataOutputStream(os);
        dos.writeUTF(transferFile.getName());
        dos.writeLong(bytearray.length);
        dos.write(bytearray, 0, bytearray.length);
        dos.flush();
        dos.close();
        os.close();

Server Side Code
    /* Test Code */
        InputStream is = socket.getInputStream();
        DataInputStream in = new DataInputStream(is);
        String fileName =in.readUTF();
        OutputStream output = new FileOutputStream(fileName);
        long size = in.readLong();
        byte[] buffer = new byte[1024];
        int bytesRead;
        while (size > 0 && (bytesRead = in.read(buffer, 0, (int)Math.min(buffer.length, size))) != -1)
        {
            output.write(buffer, 0, bytesRead);
            size -= bytesRead;
        }
        is.close();
        output.close();
        in.close();
        socket.close();

Content of Input File: 
This is a test file.

Contents of Output File:(Received by Server)
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 

你从来没有真正写过文件。您只需要在bytearray变量中写入与文件大小相同的零值字节数组。服务器接收充满零值字节的字节数组,并将其保存到文件中。因此,服务器保存的文件与原始文件大小相同,但充满了零空,这在大多数文本编辑器中都会显示为垃圾。您需要首先将文件内容写入bytearray。

在上载前后添加一个小文件,以便我们看到错误。请确保让我立即执行。如果我遗漏了一些非常明显的内容,请原谅我,但是bytearray在哪里提供了有意义的数据?似乎您正在编写一个满是零值字节的数组。。返回:此抽象路径名表示的文件的长度(以字节为单位),如果文件不存在,则返回0L。某些操作系统可能会为表示系统相关实体(如设备或管道)的路径名返回0L。你的方法是错误的!如果文件太大,比如说它是2GB+您可以得到OutOfMemoryError,因为数组中的最大元素数是Integer.MAX_值-8,如果我没有弄错的话。如果同时读取100个文件,会发生什么情况?我的建议是使用字节[127000]甚至8000000。谢谢。。。我让它工作了