Sciaganie plikow

0

witam mam taki problem , mianowicie chce wywalac przerwanie sciagania plikow .

String url = "http://sourceforge.net/projects/filezilla/files/FileZilla_Client/3.5.3/FileZilla_3.5.3_win32-setup.exe/download";
	try
	{
		
		URL urlw = new URL(url);
		URLConnection connect = urlw.openConnection();
		size = connect.getContentLength();
        String type = connect.getContentType();
              
        String[] names = url.split("/");
        String filename = names[names.length-1]+".exe";
        
         in = urlw.openStream();
         out = new FileOutputStream(filename, true);
        
        int x;
        byte data[] = new byte[1024];
        
        while((x = in.read(data,0,1024)) >= 0)
        {      
        	
        	asize += x;
       		
           out.write(data, 0, x);
           
           current.setValue((int) (asize/2.1)) ;
           current.repaint();
           
        }
        out.close();
        

	}
	catch (Exception e) 
	{
		
	}
	
	cancle.addActionListener(new ActionListener() {
		
		@Override
		public void actionPerformed(ActionEvent arg0)
		{
			try {
				out.close();
				in.close();
			} catch (IOException e) 
			{
				
				
			}
			
			
		} 

i nie dziala to moglby mi ktos doradzic jak zrobic przerwanie sciagania? i z progressbarem nie wiem jak zrobic uniwersalna funkcje zeby bylo 100% jak sie skonczy sciaganie bo tutaj dalem asize/2.1 i konczy sie ladnie ale dla tego pliku nie wiem czy dla innych tak samo bedzie jak inna wielkosc beda mialy

0

Raczej proste. Daj sobie prywatną zmienną logiczną i setter do niej. Tą zmienną wstaw jako dodatkowy warunek konieczny w pętli zapisu do pliku (w twoim while). Wystarczy, że zmienisz tą zmienną i już się pobierać nie będzie.
Co do progres bara - jeżeli nie wypluło Ci żadnego wyjątku ani innego błędu i pobieranie nie było przerwane (przez Ciebie w sposób o którym mowa wyżej) i dobiegło końca to znaczy ze powinno być 100%
Aha i ważna uwaga. Spowalniasz program i obciążasz niepotrzebnie system robiąc repainty w pętli. (nie nie dużo, ale optymalizujmy takie błędy w zarodku)
Lepiej już postawić timer, który będzie robił co powiedzmy sekundę repainta. Tutaj przy przepustowości 1MB ile repaintów zrobisz ?? Przy przy łączu 128kb byś ich zrobił ponad 100, a co przy 1Mb - a co przy właśnie 1MB? :> Dodatkowo Ci prędkość pobierania spadnie bo między odczytem ze streamu robisz repainta gui - tracisz czas.

private volatile boolean contiune=true;

while(((x = in.read(data,0,1024)) >= 0) && continue)
{
//pobierasz
}
if(continue)
    progressBar.setValue(progressBar.getMaximum()); // i jest 100%

public void InterruptDownload()
{
continue=false;
}
0

dzieki za cenne info ;-)

0

zrobilem tak jak mi doradziles ale wpadlem na jeszcze jeden pomysl poprzez zatrzymanie watku ? czy jest to dobra metoda czy ma jakies wady ? Podkreslam ze obie te etody dzialaja bez zarzutow;)

0

Nie wiem w jaki sposób zatrzymujesz wątek więc trudno mi się wypowiadać na ten temat. Doradzane jest jednak wywoływanie Stop() na watku właśnie ze względu "wiszących" danych. Zaleca się za to oflagowywanie za pomocą interrupt i zakończenie czynności które są wykonywane - dokładnie takie coś wykonujesz "po mojemu". Więcej na ten temat przeczytasz w dokumentacji oracla.

1 użytkowników online, w tym zalogowanych: 0, gości: 1