2011-05-19 34 views
1

斐伊川我用插座将文件上载到服务器,我需要加载文件的百分比?我该怎么办呢?我有maximun值即文件的长度,我怎么能得到多少文件已上载?使用套接字上传Java文件,需要上传文件的百分比?

FileInputStream fis = new FileInputStream(fil); 
       BufferedInputStream in = new BufferedInputStream(fis); 
       BufferedOutputStream out = new BufferedOutputStream(skt.getOutputStream()); 

       //Write the file to the server socket   
       int i; 

       while ((i = in.read()) != -1) { 
        publishProgress(???); 
        out.write(i);     
        System.out.println(i); 
       } 

我需要在publishProgress方法中传递文件的长度。

+0

监听者观察图形中读出了。在这种情况下,PublishProgress可能会吐出一大堆所有被订阅的监听器。那时你有你的答案。 – MJB 2011-05-19 16:12:21

回答

1

使用缓冲复制

FileInputStream fis = new FileInputStream(fil); 
BufferedInputStream in = new BufferedInputStream(fis); 
BufferedOutputStream out = new BufferedOutputStream(skt.getOutputStream()); 

//Write the file to the server socket 
int i; 
int written = 0; 
byte[] buf = new byte[512]; 

while ((i = in.read(buff)) != -1) { 

    out.write(buff,0,i); 
    written += i; 
    publishProgress((double)written/length); 
    //passing a double value from 0-1 to say how much is transmitted (length is length of file) 
    System.out.println(buff+", "+i); 
} 
+0

哎使用您in.read(BUFF)我的上传速度increased..thks一个lot..and你能PLZ解释速度的原因增加了多少? – 2011-05-20 05:15:40

+2

因为字节传输字节意味着你必须去通过它必须检查每个字节是否结束的循环n次(n是文件的大小),是否具有的OutputStream冲洗和打印值。但使用像我显示的缓冲区意味着最多512字节的块通过循环,上述开销不仅是一次prr块 – 2011-05-20 11:57:21

0

下面是修改后的代码。 写入保存写入套接字的整数个数。

FileInputStream fis = new FileInputStream(fil); 
BufferedInputStream in = new BufferedInputStream(fis); 
BufferedOutputStream out = new BufferedOutputStream(skt.getOutputStream()); 

//Write the file to the server socket   
int i; 
int written = 0; 

while ((i = in.read()) != -1) { 

    out.write(i);    
    publishProgress(++written); 
    System.out.println(i); 
} 
0

要做到这一点,你需要做的几件事情之一:

  1. 使用Flash上​​传诸如swfupload(见http://demo.swfupload.org/Documentation/),因为这些通常提供访问上传这种进步。
  2. 提供自己的背沟道:执行的形式使用Ajax提交,然后同时提交表单时您运行命中服务器上的URL与一些对应于上传类型的关键一个JavaScript计时器。在服务器上的网址查找多少文件已被上传,并返回数量和传递,通过你的uploadProgress方法。
0

javax.swing.ProgressMonitorInputStream中