查看使用java中的套接字传输的文件时的奇怪内容

时间:2012-11-18 12:25:06

标签: java sockets gedit

我正在尝试使用java中的套接字传输文件

这是代码

客户代码

try{
    // get streams
    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    DataInputStream  din = new DataInputStream (socket.getInputStream());
    dos.writeUTF(fileName);
    dos.flush();

    boolean isOk = din.readBoolean();
    if(!isOk){
        throw new StocFileNotFound("Fisierul: " + fileName +" was not found on:" + address.toString());
    } else {
        baos = new ByteArrayOutputStream();
        byte biti [] = new byte[1024];

        while(din.read(biti,0,1024) != -1){
            baos.write(biti,0,biti.length);
        }
    }

}
catch(IOException e){}
finally {
    try{ socket.close(); } catch (IOException  e){}
}

然后我返回baos.toByteArray()并使用OutputStream的write方法将其写入文件。

服务器代码

try{
    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    DataInputStream  din = new DataInputStream (socket.getInputStream());

    // check if it is really a file or if it is an existing file
    File file = new File(din.readUTF());

    // write false
    if ( !file.exists() || !file.isFile() ){
        dos.writeBoolean(false);
        dos.flush();
    }

    // write true and write the file
    else {
        byte biti[] = new byte[1024];
        dos.writeBoolean(true);

        FileInputStream fis = new FileInputStream(file);

        while(fis.read(biti,0,1024) != -1){
            dos.write(biti,0,biti.length);
        }

        dos.flush();

        try{ fis.close(); } catch (IOException e){}

    }

} catch (IOException e){}
finally {
    try{socket.close();}catch(IOException e){}
}

问题

当我转移.txt文件并在gedit中查看时,它会显示文字后跟多个\00\00\00,但是当我使用notepad(in wine)打开它时,它只会显示文本。加上观看图像和.doc也有效。它是gedit还是我的程序呢?

编辑 我正在发送类似“嗨,希望它有效!”的内容。

2 个答案:

答案 0 :(得分:2)

这是问题(或至少是 问题):

while(fis.read(biti,0,1024) != -1)
{
    dos.write(biti,0,biti.length);
}

总是写出整个缓冲区,但实际上读了很多字节。你应该:

int bytesRead;
while ((bytesRead = fis.read(biti, 0, 1024)) != -1)
{
    dos.write(biti, 0, bytesRead);
}

(你在两个代码中遇到了同样的问题。)

您可能希望查看具有各种实用工具方法的Guava,以减轻您一遍又一遍地编写此类代码的繁琐(以及可能的错误)。

答案 1 :(得分:0)

read方法将返回从流中读取的实际字节数。你应该使用它作为write方法的参数,否则你将为它写垃圾。