BufferedReader

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
PASCAL
Wow! Terabyte level
Wow! Terabyte level
Posts: 3587
Joined: Wed Nov 23, 2005 10:58 pm
Academic status: Alumnus/a
Gender:

BufferedReader

Post by PASCAL » Sat May 19, 2007 1:53 am

Έχω την εξής απορία:

Αν έχουμε ένα αρχείο 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()); }
	}
}
User avatar
tsilochr
Wow! Terabyte level
Wow! Terabyte level
Posts: 3246
Joined: Tue Mar 16, 2004 2:47 pm
Academic status: PhD
Gender:
Location: mm.aueb.gr
Contact:

Post by tsilochr » Sat May 19, 2007 10:35 am

Αυτή η 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.
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Sat May 19, 2007 12:09 pm

Χρησιμοποίησε και καμιά method ρε φίλε. Αυτό που θέλεις να κάνεις γίνεται με 10/20 γραμμές όχι με 100 :)
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
User avatar
PASCAL
Wow! Terabyte level
Wow! Terabyte level
Posts: 3587
Joined: Wed Nov 23, 2005 10:58 pm
Academic status: Alumnus/a
Gender:

Post by PASCAL » Sat May 19, 2007 2:08 pm

Γενικά δεν έχω καταλάβει αν σε ένα txt αρχείο πριν από το πρώτο χαρακτήρα "στη θέση (1,1)" αν υπάρχουν χαρακτήρες που δεν βλέπουμε και πρέπει να βάλουμε μεγάλο int readAHead στο mark();
Post Reply

Return to “Προγραμματισμός”