Programmeren in Java/In- & uitvoer

Uit Wikibooks

Programmeren in Java In ontwikkeling. Revisiedatum: onbekend

Inleiding Redelijk ontwikkeld. Revisiedatum: 22 augustus 2008

Installatie In ontwikkeling. Revisiedatum: 26 decemeber 2020

Hulpmiddelen Nog vrijwel niets. Revisiedatum: 26 decemeber 2020
  1. Booleaanse logica Nog vrijwel niets. Revisiedatum: 30 december 2020
  2. Conditionele blokken Goed ontwikkeld. Revisiedatum: 24 april 2021
  3. Lussen Goed ontwikkeld. Revisiedatum: 24 Februari 2021
  4. Methoden Nog vrijwel niets. Revisiedatum: 30 december 2020
  5. Arrays Goed ontwikkeld. Revisiedatum: 30 december 2020
  6. Strings In ontwikkeling. Revisiedatum: 24 november 2007
  7. Exceptions Redelijk ontwikkeld. Revisiedatum: 24 november 2007
  8. Commandoregel-argumenten Goed ontwikkeld. Revisiedatum: 24 Februari 2021
  9. Invoer van een toetstenbord Nog vrijwel niets. Revisiedatum: 24 Februari 2021
  10. Multithreading Nog vrijwel niets. Revisiedatum: 20 januari 2007
  11. GUI In ontwikkeling. Revisiedatum: 24 november 2007
  12. In- & uitvoer In ontwikkeling. Revisiedatum: 24 november 2007
Appendices

Invoer[bewerken]

Van het toetsenbord[bewerken]

Uitdrukkingen
  • Console.in.readInt();
  • Console.in.readLine();
  • (char) Console.in.readChar();

Bij de laatste uitdrukking wordt de overeenkomstige ASCII-integer doorgegeven; je moet dus expliciet naar char typecasten.

Voorbeeld

Java-code: Invoer.java

import java.util.Scanner;

public class Invoer {
    public static void main(String[] args) throws Exception {
        int getal;
        System.out.println("Typ een getal");
        Scanner sc = new Scanner(System.in);
        getal = sc.nextInt();
        System.out.println("Het ingevoerde getal is: " + getal);
    }
}

Van de commandoregel[bewerken]

De commandoregel werd vroeger in MS-DOS en in Unix-systemen gebruikt. Alles wat na "java ProgrammaNaam" (het aanroepen van het programma) komt, wordt beschouwd als een array van strings. Elk element wordt gescheiden door een spatie; opvragen van het i+1-ste element gebeurt met de uitdrukking args[i].

Uitdrukkingen
  • args[int index]
  • Integer.parseInt(args[int index])
  • Double.parseDouble(args[int index])
Voorbeeld

Aanroepen met "java Commandolijn appel 10 3.14" geeft "appel 10 3.14":

Java-code: Commandolijn.java

public class Commandolijn {
  public static void main (String[] args){
    System.out.println(args[0] + " " + Integer.parseInt(args[1]) + " " + Double.parseDouble(args[2]));
  }
}

Java-code: Omkeren.java

import java.io.*;

public class Omkeren {
  public static void main (String[] args){
    int x, y;
    //Console.in.readInt vervangen door:
    x = Integer.parseInt(args[0]);                   // invoer via de commandoregel:
    y = Integer.parseInt(args[1]);                   //> java Omkeren x y
    System.out.println("In omgekeerde volgorde: " + y + " en " + x);
  }
}

Uit een bestand[bewerken]

Bij het lezen van een bestand, ziet het Warnierdiagram er altijd zo uit:

open
read
lijnen(*) {verwerk
 (eof)    {read
close

Uit byte-bestand[bewerken]

Uitdrukkingen
  • FileInputStream lijst = new FileInputStream(bestandsnaam);
  • boolean eof (end-of-file)
  • int getal = lijst.read();
Voorbeeld

Java-code: invoerB.java

import java.io.*;
import tio.*;

public class invoerB{
  static String bestandsnaam;
  public static void main (String[] args) {
    if (args.length != 1){
      System.out.println ("Geef bestandsnaam, vb.\n> java invoerB bestandB");
    }
    else {
      if (1 == args.length) {
        bestandsnaam = args[0];
        leesBestandB();
        System.out.println("Bestandsnaam:\t" + bestandsnaam);
      }
    }
  }
  
  public static void leesBestandB () {
    try {
      bestandsnaam += ".bin";
      FileInputStream lijst = new FileInputStream(bestandsnaam);
      boolean eof = false;
      while (!eof) {
        int getal = lijst.read();
        if (getal == -1) eof = true;               // read()-method levert het getal -1 op het einde van de file
        else System.out.print(getal + " ");
      }
      lijst.close();
    } catch (FileNotFoundException e) { 
      System.out.println(e.getMessage());
    } catch (IOException e) {
      System.out.println(e.getMessage());
    }
  }
}

Uit een gebufferd bestand[bewerken]

Afhankelijk van het datatype, kies je readBoolean(), readByte(), readDouble(), readFloat(), readInt(), readLong(), readShort(), writeBoolean(boolean) of writeByte(byte).

Uitdrukkingen
  • FileReader fileReader = new FileReader(bestandsnaam);
  • BufferedReader inFile = new BufferedReader(fileReader);
  • (String) lijn = inFile.readLine();
  • fileReader.close();
Voorbeeld

Onderstaande code gaat een bestand lijn per lijn inlezen en weergeven. Omdat er fouten kunnen optreden (zgn. checked errors), moeten de commando's om een bestand in te lezen tussen een try-en-catch-uitdrukking staan.

Java-code: invoerBS.java

import java.io.*;

public class invoerBS{
  static String bestandsnaam;
  public static void main (String[] args) {
    if (args.length != 1){
      System.out.println ("Geef bestandsnaam, vb.\n> java invoerBS bestand");
    }
    else {
      if (1 == args.length) {
        bestandsnaam = args[0];
        leesBestand();
        System.out.println("Bestandsnaam:\t" + bestandsnaam);
      }
    }
  }
  
  public static void leesBestand () {
    try {
      bestandsnaam += ".txt";
      FileReader fileReader = new FileReader(bestandsnaam);         // Prompt the user and read a file name
      BufferedReader inFile = new BufferedReader(fileReader);       // Create a BufferedReader object
      int lijnNr = 0;                                               // Intialize line number and read the first line of the file
      String lijn = inFile.readLine(); //read-ahead
      while (lijn != null) {
        System.out.println(++lijnNr + ". " + lijn);
        lijn = inFile.readLine();
      }
      System.out.println("*** einde ***");
      fileReader.close(); 
    } catch (FileNotFoundException e) {
      System.out.println(e.getMessage() + " File not found!");
    } catch (IOException e) {
      System.out.println(e + " IO EXCEPTION");
    } catch (Exception e) {
      System.out.println(e + " EXCEPTION");
    }
  }
}

Uitvoer[bewerken]

Naar het beeldscherm[bewerken]

Uitdrukkingen
  • System.out.print("tekst");
  • System.out.println("tekst"); met LF (linefeed) en CR (carriage return), dus equivalent met System.out.print("tekst" + "\n");
  • "\n" = nieuwe lijn, "\t" = tab
Voorbeeld

Zie allereerste voorbeeld bovenaan.

Naar byte-bestand[bewerken]

Het schrijven gebeurt byte per byte.

Uitdrukkingen
  • FileOutputStream lijst = new FileOutputStream(bestandsnaam, false);
  • lijst.write(b[i]); //byte, byte[] of char
  • lijst.close();
Voorbeeld

Java-code: uitvoerB.java

import java.io.*;
public class uitvoerB {
  static String bestandsnaam;
  public static void main (String[] args) {
    if (args.length != 1){
      System.out.println ("Geef bestandsnaam, vb.\n> java uitvoerB bestandB");
    }
    else {
      if (1 == args.length) {
        bestandsnaam = args[0];
        byte[] cijfers = {7, 19, 4, 42, 33, 11};                    //weg te schrijven data
        schrijfBestand(cijfers);
        System.out.println(" weggeschreven naar:\t" + bestandsnaam);
      }
    }
  }
  public static void schrijfBestand (byte[] b){
    try {
      bestandsnaam += ".bin";
      FileOutputStream lijst = new FileOutputStream(bestandsnaam); //een nieuwe file aanmaken
      for (int i=0; i<b.length; i++){                              //alle cijfers wegschrijven
        lijst.write(b[i]);  
        System.out.print(b[i] + " ");
      }
      
      lijst.close();
    }
    catch (FileNotFoundException e) {
      System.out.println(e.getMessage());
    } catch (IOException e) { 
      System.out.println(e.getMessage()); 
    } 
  }
}

Als je dit bestand bekijkt met een teksteditor, zie je plots tekens verschijnen. Een byte stelt via de ASCII-codering namelijk ook een teken voor. Zo is '*' = 42 en '!' = 33.

Dezelfde uitvoer is dan ook toepasbaar voor tekens (char):

Java-code: uitvoerC.java

import java.io.*;
public class uitvoerC {
  static String bestandsnaam;
  public static void main (String[] args) {
    if (args.length != 1){
      System.out.println ("Geef bestandsnaam, vb.\n> java uitvoerC bestandC");
    }
    else {
      if (1 == args.length) {
        bestandsnaam = args[0];
        byte[] letters = {1,2,3}; // weg te schrijven data
        schrijfBestand(letters);
        System.out.println("weggeschreven naar:\t" + bestandsnaam);
      }
    }
  }
  public static void schrijfBestand (byte[] w){
    try {
      bestandsnaam += ".txt";
      //een nieuwe file aanmaken
      FileOutputStream lijst = new FileOutputStream(bestandsnaam, false); //true = append
      //alle lottocijfers wegschrijven
      for (int i=0; i<w.length; i++){
        lijst.write(w[i]);                 //byte, char, byte[]
        System.out.print(w[i] + " ");
      }
                                           // lijst.write(b,0,b.length); enkel voor byte[]
      lijst.close();
    }
    catch (FileNotFoundException e) {
      System.out.println(e.getMessage());
    } catch (IOException e) { 
      System.out.println(e.getMessage()); 
    } 
  }
}

Naar een gebufferd bestand[bewerken]

Afhankelijk van het datatype, kies je writeBoolean(boolean), writeByte(byte), writeDouble(double), writeFloat(float), writeInt(int), writeLong(long), writeShort(short).

Uitdrukkingen
  • FileOutputStream lijst = new FileOutputStream(bestandsnaam);
  • BufferedOutputStream buffer = new BufferedOutputStream(lijst);
  • DataOutputStream data = new DataOutputStream(buffer);
  • data.write(b[i]);
  • buffer.close(); Slechts bij het afsluiten van de buffer, wordt het bestand effectief opgevuld.
Voorbeeld

Java-code: uitvoerBB.java

import java.io.*; 

public class uitvoerBB {
  static String bestandsnaam;
  public static void main (String[] args) {
    if (args.length != 1){
      System.out.println ("Geef bestandsnaam, vb.\n> java uitvoerBS bestandBS");
    }
    else {
      if (1 == args.length) {
        bestandsnaam = args[0];
        byte[] reeks = {99, 11, 45, 77}; //weg te schrijven data
          schrijfBestand(reeks);
        System.out.println(" weggeschreven naar:\t" + bestandsnaam);
      }
    }
  }
  public static void schrijfBestand (byte[] b){
    try {                                                            //wegschrijven
      bestandsnaam += ".txt";
      FileOutputStream lijst = new FileOutputStream(bestandsnaam);
      BufferedOutputStream buffer = new BufferedOutputStream(lijst);
      DataOutputStream data = new DataOutputStream(buffer);
      for (int i=0; i<b.length; i++) {
        data.write(b[i]); 
        System.out.print(b[i] + " "); 
      }
      System.out.println("weggeschreven naar " + bestandsnaam); 
      buffer.close();
    } catch (FileNotFoundException e) { 
      System.out.println(e.getMessage()); 
    } catch (IOException e) {
      System.out.println(e.getMessage()); 
    }  
    try {                                                            //controle: lezen
      FileInputStream lijst = new FileInputStream(bestandsnaam);
      BufferedInputStream buffer = new BufferedInputStream(lijst);
      boolean eof = false;
      while (!eof) {
        int getal = buffer.read();
        if (getal == -1) eof = true;
        else System.out.print(getal + " "); 
      } 
      System.out.println("opgehaald uit " + bestandsnaam); 
      buffer.close(); 
    } catch (FileNotFoundException e) { 
      System.out.println(e.getMessage()); 
    } catch (IOException e) {
      System.out.println(e.getMessage()); 
    }
  }
}

Analoog gaat het met tekst:

Uitdrukkingen
  • FileWriter lijst = new FileWriter(bestandsnaam, false); true zorgt voor toevoegen van de tekst, zonder de oude tekst te wissen.
  • BufferedWriter buffer = new BufferedWriter(lijst);
  • buffer.write(w[i]);
  • buffer.newLine(); equivalent met buffer.write("\n");
Voorbeeld

Java-code: uitvoerBS.java

import java.io.*;
public class uitvoerBS {
  static String bestandsnaam;
  public static void main (String[] args) {
    if (args.length != 1){
      System.out.println ("Geef bestandsnaam, vb.\n> java uitvoerBS bestand");
    }
    else {
      if (1 == args.length) {
        bestandsnaam = args[0];
        String[] letters = {"a","bc","def"}; // weg te schrijven data
        schrijfBestand(letters);
        System.out.println("weggeschreven naar:\t" + bestandsnaam);
      }
    }
  }
  public static void schrijfBestand (String[] w){
    try {
      bestandsnaam += ".txt";
      FileWriter lijst = new FileWriter(bestandsnaam, false);  //true = append
      BufferedWriter buffer = new BufferedWriter(lijst);
      for (int i=0; i<w.length; i++){
        buffer.write(w[i]);    
        buffer.newLine();
        System.out.print(w[i] + " ");
      }
                                             // lijst.write(b,0,b.length);  enkel voor byte[]
      buffer.close();
    }
    catch (FileNotFoundException e) {
      System.out.println(e.getMessage());
    } catch (IOException e) { 
      System.out.println(e.getMessage()); 
    } 
  }
}

Bestanden behandelen[bewerken]

Uitdrukkingen
  • File bestand = new File("pad");
  • bestand.createNewFile();
  • bestand.exists()
  • bestand.renameTo(bestand2)
  • bestand.delete()
  • bestand.getName() en bestand.getAbsolutePath()
  • pad.mkdir();
Voorbeeld

Java-code: bestand.java

import java.io.*;
public class bestand {
  public static void main(String[] args) {
    try {
      File bestand = new File("C:\\Bestand.txt");
      if (bestand.exists()) {
        System.out.println(bestand.getAbsolutePath() + " bestaat al.");
      }
      else {
        if (bestand.createNewFile()) {
          System.out.println(bestand.getAbsolutePath() + " werd aangemaakt.");
        }
        else {
          System.out.println("Kan " + bestand.getName() + " niet aanmaken.");
        }
      }
    } catch (IOException e) {
      System.out.println(e.getMessage());
    }
  }
}

Java-code: map.java

import java.io.*;
public class map{
  public static void main (String[] args){
    try {
      File pad = new File ("C:\\test");                                       //eerst ernaar verwijzen
      pad.mkdir();                                                            //daarna pas aanmaken
      String t1, t2, t3, t4;
      t1 = "test1.txt"; t2 = "test2.txt"; t3 = "test3.txt"; t4 = "test4.txt";   
      File test1 = new File(pad,t1);                                              //eerst ernaar verwijzen
      File test2 = new File(pad,t2);
      File test3 = new File(pad,t3);
      File test4 = new File(pad,t4);            
      test1.createNewFile(); test2.createNewFile(); test3.createNewFile(); test4.createNewFile(); //daarna pas aanmaken
      if (test1.exists()) System.out.println(test1.getAbsolutePath() + " werd aangemaakt"); 
      else System.out.println(test1.getName() + " werd niet aangemaakt");                                       
      test2.delete();
      if (test2.exists()) System.out.println(test2.getName() + " werd niet gewist"); 
      else System.out.println(test2.getAbsolutePath() + " werd gewist");  
      if (test4.renameTo(test2)) System.out.println(test4.getName() + " hernoemd tot " + test2.getName());
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
  }
}

Objecten[bewerken]

De interface Serializable is een marker interface; die bevat immers geen methods, maar heeft als doel aan te duiden dat het object kan wegge­schreven en gelezen kan worden door middel van een stream.

Uitdrukkingen
  • stroom.writeObject(object)
Voorbeeld

Java-code: objectStroom.java

import java.io.*;
public class ObjectStroom {
  public static void main(String[] args) {
    try {
      FileOutputStream fileO = new FileOutputStream("vrienden.dat");
      ObjectOutputStream stroomO = new ObjectOutputStream(fileO);
      Vriend tom = new Vriend("Tom",12);
      Vriend jan = new Vriend("Jan",15);
      Vriend pol = new Vriend("Pol",45);
      stroomO.writeObject(tom);
      stroomO.writeObject(jan);
      stroomO.writeObject(pol);
      stroomO.close();   
      
      FileInputStream fileI = new FileInputStream("vrienden.dat");
      ObjectInputStream stroomI = new ObjectInputStream(fileI);
      boolean eof = false;
      while (!eof) {
        Vriend eenVriend = (Vriend) stroomI.readObject();
        if (eenVriend == null) eof = true;
        else System.out.println(eenVriend.getInfo());
      }
      stroomI.close(); 
    } catch (ClassNotFoundException e) { 
      System.out.println(e.getMessage()); 
    } catch (IOException e) { 
      System.out.println(e.getMessage()); 
    }
  }
}

Bovenstaande code schrijft onderstaand type object weg.

Java-code: Vriend.java

import java.io.*;
public class Vriend implements Serializable {
  private String naam;
  private int leeftijd;
  public Vriend(String naam,int leeftijd) {
    this.naam=naam;
    this.leeftijd=leeftijd;
  }
  public String getInfo() {
    return naam + " " + leeftijd;
  }
  public double getLeeftijd() {
    return leeftijd;
  }  
}

Je kan met transient voorkomen dat een bepaalde variabele van een object weggeschreven wordt, bvb. omdat je het niet veilig vindt om deze gevoelige informatie in een bestand weg te schrijven, bvb. privé-data als paswoord, inkomen, ...: private transient double loon;

Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.