From C To Java
From C To Java
Welcome to another Java Tutorial. After looking into Interfaces and Exceptions we will now take a look into Files in Java. We will talk about Streams and how we use them to get input from a file and to write into a file. We will create 2 types of Files: Text and Binary Files. The first ones are simple Text Files that save as plain text. The second one will use serializable Objects and save in “encrypted” Files that use a specific Bit-order. So, without further do let’s start out with Streams.
Streams represent a simple sequence of elements that we get as Input or write as Output into a Location. So, we can use them to get input from a File and put it into a Array or write a variable’s value into a File. The Streams are inside of the java.io library and we need to import this library to use Text or “Object” Files.
The Scanner Object that we used some Posts before is also using a Stream called System.in that gets the input from our keyboard [Scanner s = new Scanner(System.in) ].
We will talk about 2 different types of Streams. The first is an FileInputStream or FileOutputStream that is used for Text Files and the second one is used for Objects and is called ObjectInputStream or ObjectOutputStream.
Let’s talk about Text and Binary Files now.
To create an Input Stream for Files we use the following Code that uses the Scanner Object that we already know with another parameter:
Scanner scan = new Scanner(new FileInputStream("file.txt"));
For an OutputStream we will use an Object called PrintWriter using the following Code:
PrintWriter w = new PrintWriter(new FileOutputStream("file.txt"));
Then we do Reading using the Scanner Object the same way as we did Keyboard Input with scan.nextLine() and so on. For Writing we use the PrintWriter Object with w.println(variable) to write the variable into a Line and so on.
Afterwards we have to close our stream using scan.close() or w.close().
To create an Input Stream for Binary Files we use the Object called ObjectInputStream that creates a stream of Objects from another Stream that will be a FileInputStream like this:
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.dat"));
An Output Stream for Binary Files uses an Object called ObjectOutputStream and uses in the same way as we did in the InputStream the FileOutputStream like this:
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file.dat"));
Then we do Reading using the ois. readObject(), ois.readInt() functions and so on. An we do Writing using oos.writeObject(object), oos.writeInt(integer) and so on.
Afterwards, we again have to close the Stream using ois.close() or oos.close().
To write an Object into a Binary File we have to serialize it first. Serialization is done implementing the Serializable Interface from the java.io library. It’s pretty easy to do. All you have to do is implement this Interface using implements Serializable on every class that will be written into a Binary File like this:
public class *class\_name* implements Serializable{
//DATA
//METHODS
}
This Interface doesn’t need any Method Implementation in the class that inherits and does everything by it’s own. And so using this Interface we already did was was needed to write inside of a Binary File and now we can use the ObjectOutputStream or ObjectInputStream for Writing and Reading into Serializable or Binary Files.
We will extend the Code from the previous post (Exceptions) and write 3 Students inside of an Text and Binary File and read them afterwards again and print them out.
IdNotGreaterThanZeroException:
// Custom Exception
public class IdNotGreaterThanZeroException extends Exception { // IdNotGreaterThanZeroException.java
public IdNotGreaterThanZeroException() {
super("Id is less than or equal to zero!");
}
}
Student:
import java.io.Serializable;
// Object class that makes sure that id is > 0
// and implements the Serializable Interface
// so that it can be written into a Binary File
public class Student implements Serializable{ // Student.java
private static final long serialVersionUID = -3527004674520842177L;
private int id;
private String name;
private String surname;
// Overloaded constructor
public Student(int id, String name, String surname) {
// try-catch statement for Exception Handling
try {
// We are trying to set the id
setId(id);
} catch (IdNotGreaterThanZeroException e) {
// id was less than 0 and an Exception occurs
System.out.println(e.getMessage()); // print error message
return; // optional
}
setName(name);
setSurname(surname);
}
// GETTERS-SETTERS
public int getId() {
return id;
}
// method that throws user-defined Exception
public void setId(int id) throws IdNotGreaterThanZeroException {
if (id < 0) {
throw new IdNotGreaterThanZeroException();
} else {
this.id = id;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String toString() {
return id + " " + name + " " + surname;
}
}
TestStudent:
import java.io.*;
import java.util.Scanner;
public class TestStudent { // TestStudent.java
public static void main(String[] args) {
// Array of 3 Students
Student[] students = new Student[3];
// Give values to our Students
students[0] = new Student(5, "James", "Mcdonald");
students[1] = new Student(8, "Nick", "Brown");
students[2] = new Student(15, "Tim", "Baines");
System.out.println("TEXTFILE:");
// write into TextFile checking Exceptions
try {
PrintWriter w = new PrintWriter(new FileOutputStream("file.txt"));
// write String representation of the Students
w.println(students[0].toString());
w.println(students[1].toString());
w.println(students[2].toString());
w.close(); // close stream
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
// read from TextFile checking Exceptions
try {
Scanner scan = new Scanner(new FileInputStream("file.txt"));
// print out all the Lines checking End of File
while (scan.hasNext()) {
System.out.println(scan.nextLine());
}
scan.close(); // close stream
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
System.out.println("\nBINARYFILE:");
// write into BinaryFile checking Exceptions
try { // write to file
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file.dat"));
for (int i = 0; i < students.length; i++) {
// write serializable Object Student to Binary File
oos.writeObject(students[i]);
}
oos.close(); // close stream
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
// read from BinaryFile checking Exceptions
try { // read from file
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("file.dat"));
// print out all the Lines we wrote
for (int i = 0; i < students.length; i++) {
// checking if Object is of type Student
Student s = null;
try {
s = (Student) (ois.readObject());
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
System.out.println(s);
}
ois.close(); // close stream
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
}
}
Those Files are being saved inside of the root directory of our Project in the IDE and if you take a look you will see that the TextFile way is giving a “readable” file in plain text and that the BinaryFile way is giving something that is somewhat coded and that’s exactly why we use them. We could also hash or encode our stuff so that it is even safer and afterwards than dehash or decode it to get the real information out of it.
From C To Java
Java Classes and Methods
Java Composition and ArrayList
Java Inheritance
Java Interfaces
Java Exceptions
Java Files
Java All-in-One Exercise
Java All-in-One Exercise Solution
Java Data Structures
Java GUI (awt)
Java GUI (swing)
Java GUI Events and Listeners
Java GUI Examples
Java All-In-One Exercise Extended
Java Web Applets
Java All-In-One Exercise Extended Solution