Łączenie plików binarnych.

0

Witam.
Mam takie zadanko do zrealizowania:
W plikach binarnych o nazwach PARZYSTE i NIEPARZYSTE zapisano bardzo długie (nie mieszące się w pamięci operacyjnej) uporządkowane ciągi liczb całkowitych int (odpowiednio: parzystych i nie parzystych). Liczba określająca długość ciągu jest zapisana jako pierwszy element w każdym zbiorze jako long. Napisz program scalający te pliki w jeden uporządkowany pliki LICZBY o takiej samej strukturze jak scalane pliki.

Zrobiłem sobie przykładową metodę do odczytu plików:

public  static void odczyt(String nazwaPliku){
		long iloscLiczb = 0;
		int a=0;
		try{
			FileInputStream plikBin = new FileInputStream (nazwaPliku);
			BufferedInputStream buforBin = new BufferedInputStream (plikBin);
			DataInputStream danaBin= new DataInputStream (buforBin);
			try{ 
				iloscLiczb=danaBin.readLong();
				System.out.print(iloscLiczb);
				for(int i=0;i<iloscLiczb;i++){
					a = danaBin.readInt();
					System.out.print(" "+a);
				}
				
			}
			catch(EOFException eof){
				buforBin.close();
			}
			System.out.println();
		}
		catch(IOException e){
			System.out.println("Blad odczytu z pliku");
		}
	}

Pliki fajnie się odczytują. No ale problem polega na tym jak je teraz scalić w jedność i uporządkować ?

0

Zakładam, że uporządkowanie jest rosnące. Odczytaj wpierw po jednej liczbie z każdego pliku, mniejszą zapisz. Odczytaj kolejną liczbę z pliku będącego źródłem zapisanej liczby, mniejszą zapisz,...

0

no właśnie starałem się tak to zrobić ale coś mi nie wychodzi :( Taką mam metodę:

poprawka coś wychodzi :D

ok mam coś takiego:

public static void odczytIZapis(String nazwaPliku1,String nazwaPliku2,String nazwaPlikuDoZapisu){
		long iloscLiczb1 = 0;
		long iloscLiczb2 = 0;
		int a1=0;
		int a2=0;
		try{
			FileInputStream plikBin1 = new FileInputStream (nazwaPliku1);
			BufferedInputStream buforBin1 = new BufferedInputStream (plikBin1);
			DataInputStream danaBin1= new DataInputStream (buforBin1);
			FileInputStream plikBin2 = new FileInputStream (nazwaPliku2);
			BufferedInputStream buforBin2 = new BufferedInputStream (plikBin2);
			DataInputStream danaBin2= new DataInputStream (buforBin2);
			FileOutputStream plikBin = new FileOutputStream(nazwaPlikuDoZapisu);
			BufferedOutputStream buforBin = new BufferedOutputStream (plikBin);
			DataOutputStream wynikBin= new DataOutputStream (buforBin);
			try {
				iloscLiczb1=danaBin1.readLong();
				iloscLiczb2=danaBin2.readLong();
				System.out.print(iloscLiczb1);
				
				wynikBin.writeLong(iloscLiczb1+iloscLiczb2);
				for(int i=0;i<iloscLiczb1+iloscLiczb2;i++){
					a1 = danaBin1.readInt();
					System.out.print(" "+a1);
					
					a2 = danaBin2.readInt();
					System.out.print(" "+a2);
					if(a1<a2){
						wynikBin.writeInt(a1);
						i++;
						wynikBin.writeInt(a2);
					}
					else{
						wynikBin.writeInt(a2);
						i++;
						wynikBin.writeInt(a1);
					}
				}
			}
			catch(EOFException eof){
				buforBin1.close();
			}
			System.out.println();
			}
			catch(IOException e){
				System.out.println("Blad odczytu z pliku");
			}
	}

Teraz tak zawartości plików wyświetlają mi się w kolejności, ale nie zapisują się :( Chyba, że metoda odczytująca źle działa hmm ale pojedynczo pliki odczytuje.

0

Algorytm scalania jest błędny. Jeśli PARZYSTE zawiera 2 4 8, a NIEPARZYSTE 1 13, to zapiszesz 3 4 13 8.
Nie zamykasz plików.

0

weź też pod uwagę, że pliki mogą mieć różną liczbę intów, wtedy poleci ci EOFException w momencie gdy z drugiego pliku nie zostaną odczytane wszystkie liczby

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