Program do synchronizacja katalogów z obsługą wątków

0

Witam, postanowiłem napisać sobie prosty program do synchronizacji katalogów w Javie z obsługa wątków. Program ma sprawdzać katalog B na podstawie zgodności z katalogiem A (wzorcowym) i skopiować nieistniejące pliki. Naskrobałem coś takiego:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


public class Katalogi implements Runnable
{
	static Katalogi watki[] = new Katalogi[10];
	static File katalogA = new File("A");
	static String plikiA[] = katalogA.list();
	static BufferedInputStream input;
	static BufferedOutputStream output;
	
	
	static public boolean CzyPlikIstnieje(String plik)
	{
	    File f = new File("B\\"+plik);

	    if(f.exists())
	    {
	        return true;
	    }
	    else
	    {
	        return false;
	    }
	}
	
	public static void main(String[] args) throws IOException 
	{

		
		for(int i =0 ; i < plikiA.length; i++)
		{
			if(CzyPlikIstnieje(plikiA[i])) 
			{
				System.out.println("Plik "+plikiA[i]+" już istnieje w katalogu B");
			}
			else
			{
				input = new BufferedInputStream(new FileInputStream("A\\"+plikiA[i]));
				output = new BufferedOutputStream(new FileOutputStream("B\\"+plikiA[i]));
				
				 
				Katalogi r = new Katalogi();
				watki[i] = r;
				Thread t = new Thread(watki[i]); 
				t.start();
				
			}
		}

	}

	@Override
	public void run() 
	{
		byte[] buff = new byte[5*1024];
		int c = 0;
		try {
			while((c=input.read(buff))>0)
			{
				output.write(buff,0,c);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

}

Niestety jednak przy kopiowaniu więcej niż jednego pliku skopiowane pliki nie są kompletne. podejrzewam że jest to wina obiektów buforujących. Jednak nie mam pomysłu jak utworzyć oddzielny bufor dla każdej iteracji pętli.

Pozdrawiam

0

Wynikowe pliki nie są kompletne, bo nadpisujesz sobie pola input i output w kolejnych obrotach pętli.
Nie musisz kopiować plików "ręcznie". Patrz np. tu: http://docs.oracle.com/javase/tutorial/essential/io/copy.html

0

No właśnie tak podejrzewałem. Chyba obecnie zostanę przy tym co jest tylko nie wiem jak rozwiązać problem nadpisywania pól input i output. Próbowałem pododawać nr iteracji do nazwy zmiennej ale nie wyszło.

0

Te pola nie mogą być static.

0

No tak, tylko wtedy te pola nie są widoczne w wątku oraz pętli for.

1
            else
            { 
                Katalogi r = new Katalogi();
                r.input = new BufferedInputStream(new FileInputStream("A\\"+plikiA[i]));
                r.output = new BufferedOutputStream(new FileOutputStream("B\\"+plikiA[i]));                
                watki[i] = r;
                Thread t = new Thread(watki[i]); 
                t.start();
            }

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