IO
Advanced Programming
SUT • Spring 2019
Contents
-
Java I/O
-
Java Files
-
Streams
-
Reader/Writer
-
Serialization
Streams
Streams
-
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
Streams
Java I/O Classes
-
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
-
Text Files
-
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
-
Binary Files
-
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 / FileWriter
-
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 Example
FileReader inf = new FileReader("filename");
int chCode;
while(-1 != (chCode = inf.read()) )
System.out.println("Next char: " + (char)chCode);
inf.close();
Returned int
-
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
Other Reader Methods
-
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
FileWriter outf = new FileWriter("filename");
outf.write('A');
outf.write('\n');
outf.write("Strings too!\n");
outf.close();
Reader & Writers
-
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/FileOutputStream
-
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
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
FileOutputStream outf = new FileOutputStream("filename");
byte[] out = {52, 99, 13, 10};
outf.write(out);
outf.close();
InputStream/OutputStream
-
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)
-
Paths and Filenames
-
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"
-
RandomAccessFile
-
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
Example
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();
File Class
-
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
-
File Methods
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() ;
Scanner
-
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()
-
Formatter
-
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();
-
Serialization
-
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
-
Example
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
}
Object Serialization
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();
Object Deserialization
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();
java.net.Socket
-
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
Writing into Socket
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");
Reading from a Socket
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();
ServerSocket
-
How to listen to other sockets?
-
What do yahoo and google do?
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
Binary or Text?
-
You can use a socket as a binary or text stream
The First Version of Java I/O APIs
-
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
-
Java New IO (NIO)
-
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
-
NIO.2
-
Introduced in Java 1.7 (2011)
-
Java 7 introduces the java.nio.file package
-
New interfaces and classes
-
Path, Paths, and Files
-
Path and Paths
-
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 interface
- The toPath() method in the java.io.File class
- returns the Path object; this method was added in Java 7
- The toFile() method in the Path interface to get a File object
Path dirname = Paths.get("D:\\test\sub\1\");
Path resolvedPath = dirName.resolve("Test");
System.out.println(resolvedPath);
The Files Class
-
the java.nio.file package
-
Provides static methods for copy, move, delete, …
-
New methods for
-
Symbolic linked files
-
Attributes
-
...
-
copy
- it will not copy the files/directories contained in the source directory
- you need to explicitly copy them to the destination folder
Path pathSource = Paths.get(str1);
Path pathDestination = Paths.get(str2);
Files.copy(pathSource, pathDestination);
Listening for Changes
Path path = Paths.get("..\\src");
WatchService watchService = null;
watchService = path.getFileSystem().newWatchService();
path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);
Summary
-
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
Further Reading
-
Other java I/O classes
-
Buffered input and output
-
-
Decorator pattern in java.io classes
-
java.nio
-
Socket Programming
-
Object serialization applications
-
RMI
-
Title Text
IO
By Behnam Hatami
IO
IO / Advanced Programming Course @ SUT, Spring 2019
- 1,236