2014-09-30 54 views
0

我试图制作一个下载文件的程序。在下载文件时,需要有一个基本的计数器,从头到尾进行计数。这两个功能需要在他们自己的线程中。我创建了一个方法/线程来下载文件。我很难弄清楚如何制作一个基本的计数器。没有什么奇特的,但它需要计数,只显示当前的数字。任何帮助,将不胜感激。创建线程下载文件并创建计数器java

import java.awt.Dimension; 
import java.awt.Toolkit; 
import java.io.BufferedInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipOutputStream; 
import static myutilites.methods.*; 


public class Downloader 
{ 

public static void main(String[] args) throws IOException 
{ 
    String filename = "Nexus5MahdiRom.zip"; 
    URL link = new URL(
    "http://files.mahdi-rom.com/OnePlus%20One/" 
    + "OnePlus%20One%20Builds/mahdi-2.7-bacon-20140903.zip"); 

    Thread t1 = new Thread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      try 
      { 
       downloadFile(filename,link); 
      } catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    Thread t2 = new Thread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      try { 
       counter(link, t1); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 

    t1.start(); 
    println("Downloading File..."); 
} 

public void getScreenSize() 
{ 
    Toolkit tk = Toolkit.getDefaultToolkit(); 
    Dimension d = tk.getScreenSize(); 
    println("width = " + d.width + " height = " + d.height); 
} 
public static void downloadFile(String fileName, URL link) throws IOException 
{ 
    InputStream in = new BufferedInputStream(link.openStream()); 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    byte [] buf = new byte[1024]; 
    int n = 0; 
    int count = 0; 

    while (-1 !=(n=in.read(buf))) 
    { 
     out.write(buf, 0, n); 
    } 
    println(count); 
    out.close(); 
    in.close(); 

    byte[] response = out.toByteArray(); 

    FileOutputStream fos = new FileOutputStream(fileName); 
    fos.write(response); 
    fos.close(); 

    println("Download Finished"); 
} 
public static void locate(int row, int col) 
{ 
    System.out.print("\033["+row+";"+col+"H"); 
} 
public static int counter(URL link, Thread t1) throws IOException 
{ 
    int count = 0; 
    link.openConnection(); 
    while(t1.isAlive()) 
    { 
     count++; 
     return count; 
    } 
    return count; 
} 
} 

回答

0

使用getAndIncrementincrementAndGetAtomicInteger,这是一个线程安全的计数器(与初始化为0柜台,如果两个线程同时调用incrementAndGet那么你保证计数器将返回1到一个线程, 2到另一个线程,并将有一个最终状态2)

+0

我试过这个,但是当我打印到屏幕上它只是保持显示数字。我想要新号码删除旧号码。我不希望在下载过程中显示整个计数。只需一个号码,删除该号码,然后删除下一个号码。 – user3242607 2014-09-30 02:00:21

+0

@ user3242607在定义'filename'和'link'的相同位置定义AtomicInteger,并将它作为参数传递给'counter'。因为您通过引用传递AtomicInteger,所以将'counter'更改为'void'方法 – 2014-09-30 02:06:18