Advanced Programming
SUT • Spring 2019
Java I/O
Java Files
Streams
Reader/Writer
Serialization
Data flowing into and out of a program (I/O) is called a stream
Streams are either
binary: byte-based
text: character-based (unicode)
The java.io library provides classes to handle a wide variety of I/O situations
Text I/O
Stream of characters (Unicode format)
Support provided by Reader and Writer classes
Binary I/O
Stream of bytes (raw format)
Support provided by InputStream and OutputStream classes
A text file is a common way to organize a file as a sequence of lines.
Each line is a sequence of characters
Each OS's file system has its own way to mark the ends of lines
java.io abstracts this in a consistent way
Information from text files must be parsed to identify meaningful components
The Scanner class helps with parsing
The term binary file is used for every other type of file organization
Interpreting binary files requires knowledge of how the bytes are to be grouped and interpreted
Text files are also binary files;
but the bytes have predefined meanings (character and line data)
Binary files provide highly efficient storage
Java allows entire objects to be serialized as byte sequences for this purpose
FileReader extends
InputStreamReader extends
Reader extends Object
fr = new FileReader(location of a file);
Connects to and opens the file for character input
FileWriter extends
OutputStreamWriter extends
Writer extends Object
fw = new FileWriter(location of a file);
Creates and opens the file for character output
If the file exists, it is erased
FileReader inf = new FileReader("filename");
int chCode;
while(-1 != (chCode = inf.read()) )
System.out.println("Next char: " + (char)chCode);
inf.close();
Why does Reader.read() return int, not char ?
Because you may read an eof
which is -1
and you'd have no way to distinguish between eof and a valid char value otherwise
Reader.read() is not commonly used
Some other methods are (usually) better
int read(char[] cbuf, int off, int len)
int read(char[] cbuf)
int read(CharBuffer target)
FileWriter outf = new FileWriter("filename");
outf.write('A');
outf.write('\n');
outf.write("Strings too!\n");
outf.close();
FileReaders and FileWriters provide only very basic IO capabilities
The read and write methods are also overloaded to read and write an array of characters
FileWriter has a constructor with a boolean parameter
It can be used for appending the file
FileWriter(String fileName, boolean append)
FileInputStream extends
InputStream extends Object
fr = new FileInputStream(location of a file);
Connects to and opens the file for byte-oriented input
FileOutputStream extends
OutputStream extends Object
fw = new FileOutputStream(location of a file);
Creates and opens the file for byte-oriented output
If the file exists, it is erased
FileInputStream inf = new FileInputStream("filename");
int bCode;
while(-1 != (bCode = inf.read()))
System.out.println("Next byte: " + (byte)bCode);
inf.close();
Some other InputStream methods:
int read(byte b[])
int read(byte b[], int off, int len)
FileOutputStream outf = new FileOutputStream("filename");
byte[] out = {52, 99, 13, 10};
outf.write(out);
outf.close();
FileInputStream and FileOutputStream provides the same basic IO capabilities
Transfer is in bytes rather than characters.
There are no "lines" in these files.
How to append to a file
FileOutputStream(String name, boolean append)
Microsoft chose to use the backslash character in path names
new FileReader("c:\textfiles\newfile.txt");
What is wrong with this file name?
In Java the backslash character in a String literal is an escape character
"c:{tab}extfiles{newline}ewfile.txt"
Either type double backslashes in String literals, or use the forward slash
"c:\\textfiles\\newfile.txt"
"c:/textfiles/newfile.txt"
This class is not a reader/writer
nor a inputstream/outputstream
You can use file as binary or text file
Used to access desired location of file
For read or write
It has a file pointer
The place where you read from/write into the file
You can move file pointer using seek(long) method
It has different methods for reading and writing
RandomAccessFile raf = new RandomAccessFile("c:/1.txt", "rw");
byte ch = raf.readByte();
System.out.println("first character : " + (char)ch);
ch = raf.readByte();
System.out.println("second character : " + (char)ch);
String line = raf.readLine();
System.out.println("Read a line: " + line);
raf.seek(5);
float fl = raf.readFloat();
System.out.println("Read a float from index 5: " + fl);
raf.seek(26);
raf.write('\r');
raf.write('\n');
raf.writeDouble(1.2);
raf.writeBytes("This will complete the Demo");
raf.close();
The java.io.File class abstracts the connection to and properties of a file or folder (directory)
It does not offer read/write operations
File f = new File("c:/data/sample.txt");
Sample methods: f.delete(); f.length(); f.isFile(); …
File d = new File("c:/");
This object represents a folder, not a file
boolean canRead();
boolean canWrite();
boolean canExecute();
boolean exists();
boolean isFile() ;
boolean isDirectory() ;
boolean isAbsolute() ; //constructed by ”1” or “c:/test/1”
String getName();
String getPath(); // “1”
String getAbsolutePath() ; // “c:/test/1”
String getParent();
long length() ;//zero for folders
long lastModified() ;
String[] list() ;
The Scanner class is not technically an I/O class
It is found in java.util
You can use a Scanner wrapped around any InputStream object to provide sophisticated token-oriented input methods
new Scanner(System.in);
new Scanner(new FileInputStream("t.txt"));
scanner = new Scanner(new File("sample.txt));
scanner.nextDouble()
scanner.next()
Also found in java.util
Used to format output to text files
Formatter f = new Formatter("afile.txt");
Formatter g = new Formatter(aFileObject);
The format method is the most important
f.format("x=%d; s=%s\n", 23, "skidoo");
similar to printf in C++
The stream can be closed using…
g.close();
Most Objects in Java are serializable
Can turn themselves into a stream of bytes
Can reconstruct themselves from a stream of bytes
A serialized object includes all instance variables
Unless marked as transient
Members that are Object references are also serialized
Serializable is an interface
The serialized file is a binary file
Not a text file
public class Student implements Serializable{
private String name;
private String studentID;
private double[] grades ;
private transient double average = 17.27;
public Student(String name, String studentID, double[] grades) {
this.name = name;
this.studentID = studentID;
this.grades = grades;
}
public double getAverage() {
double sum = 0;
if(grades==null)
return -1;
for (double grade : grades) {
sum+=grade;
}
return sum/grades.length;
}
//setters and getters for name, studentID and grades
}
ObjectOutputStream output = new ObjectOutputStream(
new FileOutputStream("c:/1.txt"));
Student student =
new Student("Ali Alavi", "88305489", new double[]{17.2, 18.9, 20, 13});
output.writeObject(student);
output.close();
ObjectInputStream stream = new ObjectInputStream(
new FileInputStream("c:/1.txt"));
Student student = (Student) stream.readObject();
System.out.println(student.getName());
System.out.println(student.getAverage());
stream.close();
This class implements client sockets
also called just "sockets"
A socket is an endpoint for communication between two machines.
A stream of data is communicated between two nodes
Very similar to local I/O operations
Socket socket = new Socket(“192.168.10.21", 8888);
OutputStream outputStream = socket.getOutputStream();
Formatter formatter = new Formatter(outputStream);
formatter.format("Salam!\n");
formatter.flush();
formatter.format("Chetori?\n");
formatter.flush();
formatter.format("exit");
formatter.flush();
socket.close();
System.out.println("finished");
InputStream inputStream = socket.getInputStream();
Scanner scanner = new Scanner(inputStream);
while(true){
String next = scanner.next();
if(next.contains("exit"))
break;
System.out.println("Server : " + next);
System.out.flush();
}
socket.close();
How to listen to other sockets?
What do yahoo and google do?
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
You can use a socket as a binary or text stream
java.io package
The File class limitations:
more significant functionality required (e.g. copy method)
defines many methods that return a Boolean value
In case of an error, an exception is better than a simple false.
Poor support for handling symbolic links
inefficient way of handling directories and paths
very limited set of file attributes
Introduced in Java 1.4 (2002)
The key features of NIO were:
Channels and Selectors
Buffers
Charset
java.nio.charset
encoders, and decoders to map bytes and Unicode symbols
Introduced in Java 1.7 (2011)
Java 7 introduces the java.nio.file package
New interfaces and classes
Path, Paths, and Files
Path is an interface while Paths is a class
Path testFilePath = Paths.get("D:\\test\\testfile.txt");
//retrieve basic information about path
System.out.println("Printing file information: ");
System.out.println("\t file name: " + testFilePath.getFileName());
System.out.println("\t file name: " + testFilePath.getFileName());
System.out.println("\t root of path: " + testFilePath.getRoot());
System.out.println("\t parent of the target: "
+ testFilePath.getParent());
// print path elements
System.out.println("Printing element of the path: ");
for(Path element: testFilePath) {
System.out.println("\t path element: " + element);
}
Path dirname = Paths.get("D:\\test\sub\1\");
Path resolvedPath = dirName.resolve("Test");
System.out.println(resolvedPath);
the java.nio.file package
Provides static methods for copy, move, delete, …
New methods for
Symbolic linked files
Attributes
...
Path pathSource = Paths.get(str1);
Path pathDestination = Paths.get(str2);
Files.copy(pathSource, pathDestination);
Path path = Paths.get("..\\src");
WatchService watchService = null;
watchService = path.getFileSystem().newWatchService();
path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);
Streams access sequences of bytes
Readers and Writers access sequences of characters
FileReader, FileWriter, FileInputStream, FileOutputStream are the 4 major file access classes
Scanner provides sophisticated input parsing
Formatter provides sophisticated output formatting
Most objects can be serialized for storage in a file
The File class encapsulates files and paths of a file system
Other java I/O classes
Buffered input and output
Decorator pattern in java.io classes
java.nio
Socket Programming
Object serialization applications
RMI