有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何正确使用writeUTF()方法?

我试图让简单的客户端和服务器交换文件,因此,我试图使用writeUtf()方法将文件名作为String发送,但它根本不起作用

 public class Client {
    public static void main(String[] args) throws Exception {
    @SuppressWarnings("resource")
    Socket client = new Socket("localhost", 1241);
Path currentRelativePath = Paths.get("");
String currentPath = currentRelativePath.toAbsolutePath().toString();
DataOutputStream outToServer = new DataOutputStream(client.getOutputStream());
DataInputStream dataInFromServer = new DataInputStream(client.getInputStream());
Scanner keyboardInput=new Scanner(System.in);
System.out.println("Enter Operation Type(PUt, Get, Or Exit)");
String OperationType=keyboardInput.nextLine();
switch(OperationType){
case "PUT":
    outToServer.writeChar('P');
    System.out.println("File Or Directory name:");
    String FileOrDirName=keyboardInput.nextLine();
    //outToServer.writeUTF(FileOrDirName);
    //outToServer.write((short)FileOrDirName.length());
        outToServer.writeUTF(FileOrDirName);
    File fileOrDir=new File(FileOrDirName);
    if(fileOrDir.getParent()==currentPath || fileOrDir.getParent()==null){
    if(fileOrDir.isDirectory()){
        outToServer.writeInt(1);
        FileOperations.zipDir(fileOrDir);
        outToServer.write(FileOperations.readFileAsByteArray(FileOrDirName+".zip"));

        File tmp=new File(FileOrDirName+".zip");
        tmp.delete();
    }
    else {
        outToServer.writeInt(0);

        byte toSend[]=FileOperations.readFileAsByteArray(FileOrDirName);
        outToServer.writeDouble(toSend.length);
        for(int i=0; i<toSend.length; i++)
                outToServer.writeByte(toSend[i]);
    //  outToServer.write(ToSend,0,ToSend.length);
        //outToServer.write(FileOperations.readFileAsByteArray(FileOrDirName));
}
    outToServer.flush();
    outToServer.close();
    keyboardInput.close();
    client.close();
}   
    }

}
    }

这是服务器:

        import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.Socket;
import java.nio.file.Path;
import java.nio.file.Paths;

class TcpFileServerThread extends Thread{
    private Socket client;
    public TcpFileServerThread(Socket client) {
        this.client = client;
    }
    public void run() {
        try {
            DataOutputStream outToClient = new DataOutputStream(client.getOutputStream());
            DataInputStream dataInFromClient = new DataInputStream(client.getInputStream()) ;
            Path currentRelativePath = Paths.get("");
            String currentPath = currentRelativePath.toAbsolutePath().toString();
            //File f;
            //System.out.println(dataInFromClient.readInt());
            /** client request PUT **/
            switch(dataInFromClient.readChar()){
            case 'P':
            int lengthRecvd= (int)dataInFromClient.readDouble();
            byte[] toRecv=new byte[lengthRecvd];

            for(int i=0; i<lengthRecvd; i++){
                toRecv[i]=dataInFromClient.readByte();
            }

        //  dataInFromClient.read(file_or_dir_from_client);
            //FileOrDirName="uu.txt";
            String FileOrDirName=dataInFromClient.readUTF();
        //  int arrLen=dataInFromClient.readShort();
        /** for(int i=0; i<arrLen; i++){
                char o=dataInFromClient.readChar();
                System.out.println(o);
            }**/

            System.out.println(FileOrDirName);
            File f=new File(FileOrDirName);
            if(f.getParent()==null || f.getParent()==currentPath){

            FileOperations.writeFromByteArrayToFile(toRecv, FileOrDirName); 
            if(dataInFromClient.readInt()==1){
                File zipFl=new File(FileOrDirName+".zip");
            FileOperations.unzip(zipFl);
                zipFl.delete();
            }   
            }

            }



        }
        catch(IOException e){
            e.printStackTrace();
        }
    }
    }

我得到FileNotFoundException,服务器中System.out.println(FileOrDirName)的输出是一个空行,因为它是空的


共 (1) 个答案

  1. # 1 楼答案

    只有一种方法可以使用它,而这不是它

    int lengthRecvd= (int)dataInFromClient.readDouble();
    

    在这里,你正在阅读一篇尚未撰写的double。因此,您将得到输入中接下来8个字节的双倍值

            byte[] toRecv=new byte[lengthRecvd];
            for(int i=0; i<lengthRecvd; i++){
                toRecv[i]=dataInFromClient.readByte();
            }
    

    在这里,您正在读取大量的输入字节,这些字节可以是任何字节,也可以是尚未写入的字节

    移除所有这些

            String FileOrDirName=dataInFromClient.readUTF();
    

    在这里,您终于可以读取数据了,这是唯一一个实际写入的数据

    令人惊讶的是,这段代码没有抛出某种IOException

    除了字节数组之外,您只能使用DataInputStream的相应方法实际写入的DataOutputStream数据进行读取