Java-将文件从客户端复制/粘贴到服务器获取错误-打开文件时UTF-8编码问题

Java-将文件从客户端复制/粘贴到服务器获取错误-打开文件时UTF-8编码问题,java,encoding,utf-8,Java,Encoding,Utf 8,我最近尝试用Java创建一个复制/粘贴应用程序,除了文件的目录外,我没有做太多更改。我创建了一个常规文本文件,里面写着“test”。当我运行应用程序时,它会复制文件,但在success_test.txt中给我一个关于utf-8编码的错误,我不确定如何解决这个问题,也不确定是什么导致了这个问题。我在Intellij Ultimate 2019.2的Ubuntu 18.04上运行这个 这里的服务器和客户端与 服务器: 公共类服务器扩展线程{ public static final int PORT

我最近尝试用Java创建一个复制/粘贴应用程序,除了文件的目录外,我没有做太多更改。我创建了一个常规文本文件,里面写着“test”。当我运行应用程序时,它会复制文件,但在success_test.txt中给我一个关于utf-8编码的错误,我不确定如何解决这个问题,也不确定是什么导致了这个问题。我在Intellij Ultimate 2019.2的Ubuntu 18.04上运行这个

这里的服务器和客户端与

服务器:

公共类服务器扩展线程{

public static final int PORT = 3332;
public static final int BUFFER_SIZE = 626;

@Override
public void run() {
    try {
        ServerSocket serverSocket = new ServerSocket(PORT);
        while (true) {
            Socket s = serverSocket.accept();
            saveFile(s);
        }
    } catch (Exception e) {
    }
}

private void saveFile(Socket socket) throws Exception {
    InputStream inputStream = socket.getInputStream();
    FileOutputStream fileOutputStream = new FileOutputStream("/home/user/Documents/success_test.txt");;

    byte[] byteArray = new byte[1024];
    System.out.println("Reading file from server...");
    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
    int bytesRead;
    while ((bytesRead = inputStream.read(byteArray)) != -1) {
        bufferedOutputStream.write(byteArray);
    }

    bufferedOutputStream.close();
    System.out.println("Writing file complete...");

}

public static void main(String[] args) {
    new Server().start();
}
}

当我试图打开success_test.txt时,我看到的就是这个


您正在将数据读入1024字节长的数组,然后将其写入文件。这意味着您的输出文件被填充为1024字节,其中\00是空字符

您有ByteRead变量,因此您应该使用它只写入这么多字节:

bufferedOutputStream.write(byteArray, 0, bytesRead);

正如其他人提到的,您有一个逻辑错误:您忽略了循环中的
bytesRead
。但是,您可以通过使用而不是编写自己的保存代码来消除该错误以及大多数其他错误的可能性:

try (InputStream inputStream = socket.getInputStream()) {
    Files.copy(inputStream, 
        Paths.get("/home/user/Documents/success_test.txt"));
}

似乎您忘记在
bufferedOutputStream.write(byteArray)中使用
bytesRead
。在每次迭代中,您的代码都会写入整个1024字节,而不是以
bytesRead
的实际计数。使用后关闭流也是一种很好的做法,以避免资源泄漏。我的意思是
inputStream
谢谢,我不知道使用套接字时文件会工作