Page 1 of 1

BufferedReader

Posted: Sat May 19, 2007 1:53 am
by PASCAL
Έχω την εξής απορία:

Αν έχουμε ένα αρχείο Data.txt 2.000 γραμμών, με όλες τις γραμμές του γεμάτες με κάποιο String και έστω ότι θέλουμε ένα πρόγραμμα σε Java που να κάνει τα εξής βήματα:

1. να διαβάζει όλες τις γραμμές του Data.txt μία μία και να τις γράφει επίσης μία μία σε ένα νέο txt, έστω Data2.txt,

2. να επιστρέφει στην αρχή της πρώτης γραμμής και να επαναλαμβάνει το (1) με άλλο txt, Data3.txt,

3. να επιστρέφει στην αρχή της πρώτης γραμμής και να διαβάζει μέχρι και τη γραμμή 100 και να γράφει τις γραμμές σε άλλο txt, έστω Data4.txt,

4. να διαβάζει από τη γραμμή 101 μέχρι και τη γραμμή 200 και να γράφει τις γραμμές σε άλλο txt, έστω Data5.txt,

5. να διαβάζει από τη γραμμή 201 μέχρι τη γραμμή 2000 και να γράφει τις γραμμές σε άλλο txt, έστω Data6.txt,

τότε το ακόλουθο πρόγραμμα γιατί βγάζει java.io.IOException: Mark invalid
;

Code: Select all

import java.io.*;

public class Program {
	
	
	public static void main(String args[]){
		String str = "";
	try{
			BufferedReader data1 = new BufferedReader(new InputStreamReader(new FileInputStream("Data.txt")));
         BufferedWriter data2 =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Data2.txt")));
			BufferedWriter data3 =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Data3.txt")));
			BufferedWriter data4 =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Data4.txt")));
			BufferedWriter data5 =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Data5.txt")));
			BufferedWriter data6 =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Data6.txt")));
			
			data1.mark(1000);
		    for(int i = 0; i < 2000; i++){
		    	 str = ""; 
			 str = (data1.readLine()).trim();
	                 data2.write(str);
		         if (i != 2000) data2.newLine();		          
		    }
		    data2.close();
		    data1.reset();
		    
		    for(int i = 0; i < 2000; i++){
		    	 str = ""; 
			 str = (data1.readLine()).trim();
                         data3.write(str);
	                 if (i != 2000) data3.newLine();		          
		    }
		    data3.close();
		    data1.reset();
		    
		    for(int i = 0; i < 100; i++){
		    	 str = ""; 
			 str = (data1.readLine()).trim();
	                 data4.write(str);
		         if (i != 100) data4.newLine();		          
		    }
		    data4.close();
		    
         	    for(int i = 0; i < 100; i++){
		    	 str = ""; 
			 str = (data1.readLine()).trim();
	                 data5.write(str);
		         if (i != 100) data5.newLine();		          
		    }
		    data5.close();
		
		    for(int i = 0; i < 1800; i++)
		    {   str = ""; 
			 str = (data1.readLine()).trim();
	                 data6.write(str);
		         if (i != 1800) data6.newLine();		          
		    }
		    data6.close();
		    data1.close();
		 }
		catch(IOException ioe){ System.out.println(ioe.toString()); }
	}
}

Posted: Sat May 19, 2007 10:35 am
by tsilochr
Αυτή η data1.mark(1000); δεν μου αρέσει. Του λες να μαρκάρει εκεί το κείμενο (παρότι είσαι ακόμα στην αρχή), του δίνεις παράμετρο 1000 και μετά διαβάζεις 2000 γραμμές. Αν δεις το API για την mark() λέει


Java API wrote:Parameters:
readAheadLimit - Limit on the number of characters that may be read while still preserving the mark. After reading this many characters, attempting to reset the stream may fail. A limit value larger than the size of the input buffer will cause a new buffer to be allocated whose size is no smaller than limit. Therefore large values should be used with care.

Posted: Sat May 19, 2007 12:09 pm
by HdkiLLeR
Χρησιμοποίησε και καμιά method ρε φίλε. Αυτό που θέλεις να κάνεις γίνεται με 10/20 γραμμές όχι με 100 :)

Posted: Sat May 19, 2007 2:08 pm
by PASCAL
Γενικά δεν έχω καταλάβει αν σε ένα txt αρχείο πριν από το πρώτο χαρακτήρα "στη θέση (1,1)" αν υπάρχουν χαρακτήρες που δεν βλέπουμε και πρέπει να βάλουμε μεγάλο int readAHead στο mark();