【问题标题】:BufferedOuputStream make Blank fileBufferedOutputStream 制作空白文件
【发布时间】:2017-06-28 18:56:10
【问题描述】:

我有以下代码用于将文件从客户端上传到服务器 tcp,但是当我尝试手动打开时,文件为空,为什么重量好.. 我在stackOverflow上看了很多帖子,但没有任何改变 谢谢 (对不起我的英语不好)
服务器:

公共类 ThreadServer 扩展 Thread{

private Socket soc;
private FileOutputStream fos;
private BufferedOutputStream bos;
private InputStream in;

public ThreadServer (Socket soc) {
    this.soc = soc;
}

public void run(){
    try {
        fos = new FileOutputStream("C:/Users/erwan/workspace/Word/server/text.txt");
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    }
    bos = new BufferedOutputStream(fos);
    byte[] buffer = new byte[1024];
    try {
        in = soc.getInputStream();
        int count = 0;
        while((count= in.read(buffer, 0 , buffer.length)) != -1) {
             System.out.println(count+" octets received...");                 
             bos.write(buffer);
        } 
        bos.flush();
        bos.close();
        in.close();
        soc.close();
        System.out.println("File sent succesfully!");
    }catch(IOException e){
        e.printStackTrace();
        System.out.println("Une erreur est survenu");
    }
}

}

客户:

public class Client {
private static Socket as;
private static FileInputStream fis;
private static BufferedInputStream bis;
private static OutputStream out;
public static void main( String[] args ){
    as = null;
    try{
        as = new Socket(InetAddress.getLocalHost(),4020);

        File f = new File (args[0]);
        byte [] buffer  = new byte [(int) f.length()];
        fis = new FileInputStream(f);
        setBis(new BufferedInputStream(fis));
        out = as.getOutputStream();
        System.out.println("uploading...");
        out.write(buffer,0,buffer.length);
        out.flush();
        out.close();
        System.out.println("the file is uploaded.");
        as.close();
    }catch(IOException e){
        e.printStackTrace();
    }   

}

【问题讨论】:

    标签: java file tcp server bufferedoutputstream


    【解决方案1】:

    客户端中的缓冲区似乎没有填充数据。它被初始化为具有文件长度的字节数组,但没有对输入流进行读取方法调用。为了测试 fis.read(buffer) 可能会很快将一些数据放入缓冲区。请记住,不能保证读取会填满缓冲区的整个长度。因此,特别是如果您的文件包含零,则可能是没有将实际数据读取到(客户端)缓冲区中。

    除了服务器代码还假定读取方法完全填充缓冲区,因此写入方法调用应指定长度(计数)。所以把 bos.write(buffer) 改成 bos.write(bos, 0, count)。这可能会在文件末尾变得明显(如果文件长度超过 1024 字节),因为文件末尾将成为前一个块中某些数据的重复。

    【讨论】:

    • 我真的不明白为什么 fis.read(buffer,0,buffer.lenght) 解决了这个问题,但真的很感谢你的回答:) 如果你能再次解释一下我的 dos 是如何工作的?谢谢
    • 是的。真的没那么复杂。你做了一个新的字节[(int) f.length()]。这样做是分配一个内存区域来存储 f.length() 字节。它不会将任何数据放入这些字节的内存中。在大多数情况下,jvm 会将数组初始化为零字节(二进制零,因此在编辑器中经常显示为奇怪的字符)。要将输入文件中的数据实际放入新创建的数组中,您需要执行 fis.read。
    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2014-12-02
    • 1970-01-01
    • 2011-11-27
    • 2012-03-14
    • 2015-03-22
    相关资源
    最近更新 更多