Programmeren in Java/In- & uitvoer
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 weggeschreven 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;