Πολλές φορές είναι ανάγκη να «τραβήξουμε» δεδομένα, από ένα άλλο αρχείο που βρίσκεται στον υπολογιστή μας δηλαδή να πραγματοποιήσουμε Ανάγνωση και να  επεξεργαστούμε αυτά με το πρόγραμμά μας. Σε άλλη περίπτωση θέλουμε να εξάγουμε δεδομένα σε ένα υπάρχων αρχείο ή ακόμα και να δημιουργούμε ένα νέο αρχείο αποθηκεύοντας σε αυτό τα δεδομένα που μόλις έχουμε επεξεργαστεί με άλλα λόγια να πραγματοποιήσουμε μια Εγγραφή.
Σε κάθε περίπτωση θα χρειαστούμε μια Ροή. Είτε αυτή είναι Εισόδου είτε Εξόδου.
Η διαδικασία δημιουργίας μιας ροής ή αλλιώς Επικοινωνίας, είναι :
  1.  Δημιουργούμε ένα αντικείμενο ροής που σχετίζεται με τα δεδομένα.
  2.  Καλούμε μεθόδους της ροής για να εισάγουμε πληροφορίες στη ροή ή να εξάγουμε πληροφορίες από αυτή.
  3.  Κλείνουμε την ροή με την μέθοδο close() του αντικειμένου.


Στην Java τα αρχεία αναπαρίστανται από την κλάση File του πακέτου java.io, και μπορούν να διαβαστούν από σκληρούς δίσκους, cd-rom, ή άλλες συσκευές αποθήκευσης.
Για να κατασκευάσουμε ένα αρχείο στον τρέχοντα φάκελο, χρησιμοποιούμε το όνομά του ως μέθοδο κατασκευής, δηλαδή File bookname= new File (“arxeio.txt”); ή να συμπεριλάβουμε την διαδρομή στον δίσκο, το όνομα του φακέλου που θα θέλαμε να αποθηκευτεί το αρχείο μας, δηλαδή File bookname= new File (“data\\arxeio.txt”); ή
File bookname= new File (“data“+ File.pathSeparator +”arxeio.txt”);
 ανάλογα το λειτουργικό σύστημα στο ποίο εργαζόμαστε. Η τελευταία μέθοδος είναι και η πιο λειτουργική σε όλα τα συστήματα.
Αφού δημιουργήσουμε το αντικείμενό μας μπορούμε να καλέσουμε πολλές χρήσιμες μεθόδους
όπως :

  • Exist() Επιστρέφει true ή false.
  • getName() Επιστρέφει το όνομα του αρχείο ως String.
  • length() Επιστρέφει το μέγεθος του αρχείου.
  •  createNewFile() Δημιουργεί νέο αρχείο με το ίδιο όνομα, αν δεν υπάρχει αυτό.
  • delete() Διαγράφει το αρχείο, αν υπάρχει.
  • renameTo(νέο όνομα) Μετονομάζει το αρχείο παίρνοντας το νέο όνομα που καθορίζεται ως όρισμα της μεθόδου.
  • read() διαβάζει το περιεχόμενο του αρχείου.


Ανάγνωση αρχείου κειμένου και κατανομή λέξεων σε πίνακα με χρήση BufferedReader file  

satic void wordCounter(String filename, int[]wordsize)throws IOException{
int tokenCount;
StringTokenizer strtok;
String line, word;
for(int i=0; i<wordsize.length; i++){
wordsize[i]=0;
BufferedReader file=newBufferedReader(new FileReader(filename));
line=file.readLine();
while(line!=null){
strtok= new StringTokenizer(line);
tokenCount= strtok.countTokens();
for(int n =1; n<=tokenCount; n++){
word=strtok.nextToken();
wordsize= [word.length()]++;
}
line= file.readLine();
}

}

Στο παράδειγμα που ακολουθεί θα πραγματοποιήσουμε Εγγραφή σε Αρχείο το περιεχόμενο ενός Vector του KinisiKlisis.

try{
FileWriter outFile= new FileWriter(“klisi.txt”);
PrintWriter out= new PrintWriter(outFile);
Iterator itr=K_list.iterator();
while(itr.hasNext()){
out.println(“-----------------------“);
out.println((KinisiKlisis).itr.next());
out.println(“------------------------“);
}
out.close();
}
Catch(IOException e){
e.printStackTrace();
}

Γενικά θα πρέπει να έχουμε στο νου μας τα εξής :
Για να αναφερθούμε σε ένα αρχείο και να το μετονομάσουμε, διαγράψουμε κτλ πρέπει να δημιουργήσουμε ένα αντικείμενο της κλάσης File.

  •  Για να γράψουμε δικά μας αρχεία ή για να διαβάσουμε αρχεία σε/από ένα λογικό δίσκο πρέπει να χρησιμοποιήσουμε ροές δεδομένων. Διαφορετικά αντικείμενα εξυπηρετούν ροές διαφορετικών τύπων δεδομένων.
  • FileInputStream/FileOutputStream για ροές δεδομένων byte.
  • DataInputStream/DataOutputStream για ροές δεδομένων τύπων διαφορετικών από byte.
  • FileReader/FileWriter για ροές χαρακτήρων
  • InputStreamReader για ανάγνωση της ροής της τυπικής εισόδου (System.in)
  • „Σε όλες τις παραπάνω περιπτώσεις προτείνεται η χρήση ενδιάμεσης μνήμης (buffer).