BCA IV
Syllabus
Using I/O: Elementary concepts of Input/Output, using
the byte streams, reading and writing using byte streams,
automatically closing a file, using the character-based
streams, File I/O using character streams (using a File
Writer and using a File Reader)
Multi-threaded programming: Multithreading
fundamentals, Thread class, and Runnable interface, the
life cycle of thread, creation of single and multiple threads,
implementation of Thread methods, Synchronization
(using Synchronized methods, synchronized statement).
Ms. Sushma Malik, Associate Professor,IINTM
Elementary concepts of Input/Output
Java brings various Streams with its I/O package that
helps the user to perform all the input-output
operations. These streams support all the types of
objects, data-types, characters, files etc to fully execute
the I/O operations.
Java I/O (Input and Output) is used to process the
input and produce the output.
Java uses the concept of a stream to make I/O
operation fast. The [Link] package contains all the
classes required for input and output operations.
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
Stream
A stream is a sequence of data.
In Java, a stream is composed of bytes.
It's called a stream because it is like a stream of
water that continues to flow.
In Java, 3 streams are created for us automatically.
All these streams are attached with the console.
1) [Link]: standard output stream
2) [Link]: standard input stream
3) [Link]: standard error stream
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
Standard Input Stream
[Link]: This is the standard input stream that is
used to read characters from the keyboard or any other
standard input device.
Java application uses an input stream to read data from
a source; it may be a file, an array, peripheral device or
socket.
Ms. Sushma Malik, Associate Professor,IINTM
Standard Output Stream
[Link]: This is the standard output stream that
is used to produce the result of a program on an output
device like the computer screen.
Java application uses an output stream to write data to
a destination; it may be a file, an array, peripheral
device or socket.
Ms. Sushma Malik, Associate Professor,IINTM
various print functions that use to
output statements
print(): This method in Java is used to display a text
on the console. This text is passed as the parameter to
this method in the form of String. This method prints
the text on the console and the cursor remains at the
end of the text at the console. The next printing takes
place from just here.
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
various print functions that use to
output statements
println(): This method in Java is also used to display a
text on the console. It prints the text on the console
and the cursor moves to the start of the next line at the
console. The next printing takes place from the next
line.
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
various print functions that use to
output statements
printf(): This is the easiest of all methods as this is
similar to printf in C.
Note that [Link]() and [Link]()
take a single argument, but printf() may take multiple
arguments.
This is used to format the output in Java.
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
[Link]
[Link]: This is the standard error stream that is
used to output all the error data that a program might
throw, on a computer screen or any standard output
device.
This stream also uses all the 3 above-mentioned
functions to output the error data:
print()
println()
printf()
Ms. Sushma Malik, Associate Professor,IINTM
Java code to illustrate standard
input output streams
Ms. Sushma Malik, Associate Professor,IINTM
Types of Streams
Depending on the type of operations, streams can be
divided into two primary classes:
Input Stream: These streams are used to read data
that must be taken as an input from a source array or
file or any peripheral device. For eg., FileInputStream,
BufferedInputStream, ByteArrayInputStream etc.
Output Stream: These streams are used to write data
as outputs into an array or file or any output peripheral
device. For eg., FileOutputStream, BufferedOutput
Stream, ByteArrayOutputStream etc.
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
Types of Streams
Depending on the types of file, Streams can be
divided into two primary classes which can be further
divided into other classes as can be seen through the
diagram below followed by the explanations.
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
Using the Byte Streams
ByteStream classes are used to read bytes from the
input stream and write bytes to the output stream.
In other words, we can say that ByteStream classes
read/write the data of 8-bits.
We can store video, audio, characters, etc., by using
ByteStream classes.
These classes are part of the [Link] package.
Ms. Sushma Malik, Associate Professor,IINTM
using the byte streams
Ms. Sushma Malik, Associate Professor,IINTM
InputStream Class
The InputStream class provides methods to read
bytes from a file, console or memory.
It is an abstract class and can't be instantiated;
however, various classes inherit the InputStream
class and override its methods.
The InputStream class contains various methods
to read the data from an input stream. These
methods are overridden by the classes that inherit
the InputStream class.
Ms. Sushma Malik, Associate Professor,IINTM
InputStream Class
Ms. Sushma Malik, Associate Professor,IINTM
InputStream Class Methods
Ms. Sushma Malik, Associate Professor,IINTM
OutputStream Class
The OutputStream is an abstract class that is used to
write 8-bit bytes to the stream.
It is the superclass of all the output stream classes.
This class can't be instantiated; however, it is inherited
by various subclasses
Ms. Sushma Malik, Associate Professor,IINTM
OutputStream Class
Ms. Sushma Malik, Associate Professor,IINTM
OutputStream Class Methods
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
Automatically closing a file in Java
⚫ Any file that is opened and used must be closed by
calling the close() method. If this is not done, then it
can memory leak and related complications.
⚫ JDK 7 introduces a new ability to control file
input/output streams – automatic resource
management (ARM) or automatic process
termination.
⚫ This feature is based on an improved version of
the try statement and consists in preventing cases of
erroneous non-closing of a file (not freeing up a
resource).
Ms. Sushma Malik, Associate Professor,IINTM
CharacterStream Classes in Java
⚫ The [Link] package provides CharacterStream classes
to overcome the limitations of ByteStream classes,
which can only handle the 8-bit bytes and is not
compatible to work directly with the Unicode
characters.
⚫ CharacterStream classes are used to work with 16-bit
Unicode characters. They can perform operations on
characters, char arrays and Strings.
⚫ However, the CharacterStream classes are mainly used
to read characters from the source and write them to
the destination. For this purpose, the CharacterStream
classes are divided into two types of classes, I.e.,
Reader class and Writer class.
Ms. Sushma Malik, Associate Professor,IINTM
Reader Class
Reader class is used to read the 16-bit characters from
the input stream.
However, it is an abstract class and can’t be
instantiated, but there are various subclasses that
inherit the Reader class and override the methods of
the Reader class.
⚫ All methods of the Reader class throw an IOException.
Ms. Sushma Malik, Associate Professor,IINTM
The subclasses of the Reader class
Ms. Sushma Malik, Associate Professor,IINTM
The Reader class methods
Ms. Sushma Malik, Associate Professor,IINTM
Writer Class
Writer class is used to write 16-bit Unicode characters
to the output stream.
The methods of the Writer class generate IOException.
Like Reader class, Writer class is also an abstract class
that cannot be instantiated; therefore, the subclasses
of the Writer class are used to write the characters
onto the output stream.
Ms. Sushma Malik, Associate Professor,IINTM
The subclasses of the Writer class
Ms. Sushma Malik, Associate Professor,IINTM
The Writer class methods
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
Difference between Byte Stream
and Character Stream
Byte Stream Character Stream
InputStream/Output Stream class is Reader/Writer class is character-
byte-oriented. oriented.
Byte stream access the file byte by byte A character stream will read a file
(8-bits). character by character (16-bits).
Byte-stream classes end with the suffix Character-stream classes end with the
InputStream and OutputStream. suffix Reader or Writer.
Byte stream classes are classified into : Character stream classes are classified
(i) Input Stream classes, (ii) Output into : (i) Reader Class and (ii) Writer
Stream Classes Class
In Character Stream is possible to
In Byte Stream is possible to translate
translate the byte stream into a
character stream into byte stream with
character stream with
OutputStream Writer.
InputStreamReader.
Ms. Sushma Malik, Associate Professor,IINTM
Difference between Byte Stream
and Character Stream
Byte Stream Character Stream
Character streams generally accept
Byte streams generally work with the
parameters of data type char
byte data type.
parameters.
Advantage of character streams that is
Byte streams are specifically used for they make it easy to write programs
reading and writing data in byte format. which are not dependent upon a
specific character encoding.
Byte streams are dumb. Character Streams are quite dumb.
Character streams convert the
In Byte Stream no conversion needed. underlying data bytes of Unicode,
which is a costly operation
Ms. Sushma Malik, Associate Professor,IINTM
Example of Byte Stream
Ms. Sushma Malik, Associate Professor,IINTM
Example of Char Stream
Ms. Sushma Malik, Associate Professor,IINTM
Multithreading in Java
Java is a multi-threaded programming language which
means we can develop multi-threaded program using
Java.
A multi-threaded program contains two or more parts
that can run concurrently and each part can handle a
different task at the same time making optimal use of
the available resources specially when your computer
has multiple CPUs.
Ms. Sushma Malik, Associate Professor,IINTM
Multithreading in Java
By definition, multitasking is when multiple processes
share common processing resources such as a CPU.
Multi-threading extends the idea of multitasking into
applications where you can subdivide specific operations
within a single application into individual threads.
Each of the threads can run in parallel.
The OS divides processing time not only among different
applications, but also among each thread within an
application.
Ms. Sushma Malik, Associate Professor,IINTM
Multithreading in Java
we use multithreading than multiprocessing because
threads use a shared memory area.
They don't allocate separate memory area so saves
memory, and context-switching between the threads
takes less time than process.
Java Multithreading is mostly used in games,
animation, etc.
Ms. Sushma Malik, Associate Professor,IINTM
Multithreading in Java
Threads run in parallel,
does not really mean that
they actually run at the
same time.
Since all threads are
running on a single
processor, the flow of
execution is shared
between threads.
Java Interpreter handles
the switching of control
between the threads in
such a way , that it
appears they run
concurrently.
Ms. Sushma Malik, Associate Professor,IINTM
Advantages of Java Multithreading
It doesn't block the user because threads are
independent and you can perform multiple operations
at the same time.
You can perform many operations together, so it
saves time.
Threads are independent, so it doesn't affect other
threads if an exception occurs in a single thread.
Ms. Sushma Malik, Associate Professor,IINTM
Example of Multithreading
Banking system use multithreading concept, when
someone withdraw the amount at same time, user get
message on phone and get email as well. So that, we can say
one thread is working to send message on phone and
another thread in working to send email and there may be
more threads, giving example only for two major threads.
Basically, multithreading is useful for those application
where we need multiple tasks to be done parallelly.
If any system has single processor in that case multiple
threads share the CPU time which is knows as Time-
Sharing.
Ms. Sushma Malik, Associate Professor,IINTM
What is Thread in java
A thread is a lightweight subprocess, the smallest unit
of processing. It is a separate path of execution.
Threads are independent. If there occurs exception in
one thread, it doesn't affect other threads. It uses a
shared memory area.
Ms. Sushma Malik, Associate Professor,IINTM
What is Thread in java
As shown in the above
figure, a thread is
executed inside the
process. There is
context-switching
between the threads.
There can be multiple
processes inside
the OS, and one
process can have
multiple threads.
Ms. Sushma Malik, Associate Professor,IINTM
Multithreading Vs Multitasking
Multithreading Multitasking
It is a programming concept in which a It is an operating system concept, in which
program or process is divided into two or multiple tasks are performed
more subprograms(thread) simultaneously
It supports execution of multiple parts of a It supports execution of multiple
single program simultaneously programs simultaneously
The processor has to switch between The processor has to switch between
different parts or threads of program different programs or process
A thread is smallest unit in multithreading A program is smallest unit of
multithreading
It helps in developing efficient programs It helps in developing efficient operating
system
It is cost effective It is expensive in case of context switching
Ms. Sushma Malik, Associate Professor,IINTM
Life Cycle of Thread in Java
Ms. Sushma Malik, Associate Professor,IINTM
Thread States in Java
A thread is a path of execution in a program that
enters any one of the following five states during its
life cycle. The five states are as follows:
1. New
2. Runnable
3. Running
4. Blocked (Non-runnable state)
5. Dead
Ms. Sushma Malik, Associate Professor,IINTM
Life Cycle of Thread in Java
New (Newborn
State): When we create
a thread object using
Thread class, thread is
born and is known to be
in Newborn state. That
is, when a thread is
born, it enters into new
state.
Only start() method can
be called on a new
thread; otherwise,
an IllegalThreadStateEx
ception will be thrown.
Ms. Sushma Malik, Associate Professor,IINTM
Life Cycle of Thread in Java
Runnable state means a thread is ready for execution. When the
start() method is called on a new thread, thread enters into a
runnable state.
In runnable state, thread is ready for execution and is waiting for
availability of the processor (CPU time). That is, thread has joined
queue (line) of threads that are waiting for execution.
If all threads have equal priority, CPU allocates time slots for thread
execution on the basis of first-come, first-serve manner. The
process of allocating time to threads is known as time slicing. A
thread can come into runnable state from running, waiting, or new
states.
Ms. Sushma Malik, Associate Professor,IINTM
Life Cycle of Thread in Java
Ms. Sushma Malik, Associate Professor,IINTM
Life Cycle of Thread in Java
Running means Processor (CPU) has allocated time slot to
thread for its execution. When thread scheduler selects a thread
from the runnable state for execution, it goes into running state.
Look at the above figure.
In running state, processor gives its time to the thread for
execution and executes its run method. This is the state where
thread performs its actual functions. A thread can come into
running state only from runnable state.
A running thread may give up its control in any one of the
following situations and can enter into the blocked state.
Ms. Sushma Malik, Associate Professor,IINTM
Life Cycle of Thread in Java
Ms. Sushma Malik, Associate Professor,IINTM
Life Cycle of Thread in Java
When sleep() method is invoked on a thread to sleep for
specified time period, the thread is out of queue during this
time period. The thread again reenters into the runnable state
as soon as this time period is elapsed.
When a thread is suspended using suspend() method for some
time in order to satisfy some conditions. A suspended thread
can be revived by using resume() method.
When wait() method is called on a thread to wait for some
time. The thread in wait state can be run again using notify() or
notifyAll() method.
Ms. Sushma Malik, Associate Professor,IINTM
Life Cycle of Thread in Java
Blocked state: A thread is considered to be in the blocked state
when it is suspended, sleeping, or waiting for some time in order to
satisfy some condition.
Dead state: A thread dies or moves into dead state automatically
when its run() method completes the execution of statements. That
is, a thread is terminated or dead when a thread comes out of run()
method. A thread can also be dead when the stop() method is called.
During the life cycle of thread in Java, a thread moves from one state
to another state in a variety of ways. This is because in
multithreading environment, when multiple threads are executing,
only one thread can use CPU at a time.
All other threads live in some other states, either waiting for their
turn on CPU or waiting for satisfying some conditions. Therefore, a
thread is always in any of the five states.
Ms. Sushma Malik, Associate Professor,IINTM
Java Thread Methods
Method Description
start() It is used to start the execution of the thread.
run() It is used to do an action for a thread.
sleep() It sleeps a thread for the specified amount of time.
getName() It returns the name of the thread.
getPriority() It returns the threads priority
setName() It changes the name of the thread.
currentThread() Gives the name of current thread that is running
stop() It is used to stop the thread.
It is used to destroy the thread group and all of its
destroy() subgroups.
suspend() It is used to suspend the thread.
resume() It is used to resume the suspended thread.
Ms. Sushma Malik, Associate Professor,IINTM
How to create a thread in Java
To implement multithreading, Java defines two ways by
which a thread can be created.
By implementing the Runnable interface.
By extending the Thread class.
Ms. Sushma Malik, Associate Professor,IINTM
Thread class
Thread class provide constructors and methods to create
and perform operations on a thread.
Thread class extends Object class and implements
Runnable interface.
Commonly used Constructors of Thread class:
Thread()
Thread(String name)
Thread(Runnable r)
Thread(Runnable r,String name)
Ms. Sushma Malik, Associate Professor,IINTM
Commonly used methods of Thread class
public void run(): is used to perform action for a thread.
public void start(): starts the execution of the [Link]
calls the run() method on the thread.
public void sleep(long miliseconds): Causes the currently
executing thread to sleep (temporarily cease execution) for the
specified number of milliseconds.
public void join(): waits for a thread to die.
public int getPriority(): returns the priority of the thread.
public int setPriority(int priority): changes the priority of
the thread.
public String getName(): returns the name of the thread.
public int getId(): returns the id of the thread.
public void resume(): is used to resume the suspended
thread(depricated).
public void stop(): is used to stop the thread(depricated).
Ms. Sushma Malik, Associate Professor,IINTM
Java Thread Example by extending Thread class
Ms. Sushma Malik, Associate Professor,IINTM
Java Thread Example by implementing Runnable interface
Ms. Sushma Malik, Associate Professor,IINTM
Using the Thread Class: Thread(String Name)
Ms. Sushma Malik, Associate Professor,IINTM
Using the Thread Class: Thread(Runnable r, String name)
Ms. Sushma Malik, Associate Professor,IINTM
Creation of Multithread
Ms. Sushma Malik, Associate Professor,IINTM
Ms. Sushma Malik, Associate Professor,IINTM
Thread VS Runnable
Ms. Sushma Malik, Associate Professor,IINTM
Synchronization in Java
Synchronization in Java is the capability to control the
access of multiple threads to any shared resource.
Java Synchronization is better option where we want to
allow only one thread to access the shared resource.
Ms. Sushma Malik, Associate Professor,IINTM
Why use Synchronization?
The synchronization is mainly used to
To prevent thread interference.
To prevent consistency problem.
Ms. Sushma Malik, Associate Professor,IINTM
The problem without Synchronization
Ms. Sushma Malik, Associate Professor,IINTM
The problem without Synchronization
In the above example, we didn’t use the synchronized
keyword so both the threads are executing at a time so
in the output, thread-0 is interfering with thread-1,
and hence, we are getting inconsistent results.
Ms. Sushma Malik, Associate Professor,IINTM
Types of Synchronization
There are two types of synchronization
Process Synchronization
Thread Synchronization
Ms. Sushma Malik, Associate Professor,IINTM
Thread Synchronization
There are two types of thread synchronization mutual
exclusive and inter-thread communication.
Mutual Exclusive
Cooperation (Inter-thread communication in java)
Ms. Sushma Malik, Associate Professor,IINTM
Mutual Exclusive
Mutual Exclusive helps keep threads from interfering
with one another while sharing data. It can be
achieved by using the following three ways:
By Using Synchronized Method
By Using Synchronized Block
By Using Static Synchronization
Ms. Sushma Malik, Associate Professor,IINTM
Java Synchronized Method
If we use the Synchronized keywords in any method
then that method is Synchronized Method.
It is used to lock an object for any shared resources.
The object gets the lock when the synchronized
method is called.
The lock won’t be released until the thread completes
its function.
Ms. Sushma Malik, Associate Professor,IINTM
Java Synchronized Method Example
Ms. Sushma Malik, Associate Professor,IINTM
Java Synchronized Method Example
In the above example we used synchronized keywords.
It helps to execute a single thread at a time. It is not
allowing another thread to execute until the first one is
completed, after completion of the first thread it
allowed the second thread.
Now we can see the output correctly the powers 5 and
8 from n1 to n5. Thread-0 completed then only thread-1
begin.
Ms. Sushma Malik, Associate Professor,IINTM
Synchronized Block
Suppose you don’t want to synchronize the entire
method, you want to synchronize few lines of code in
the method, then a synchronized block helps to
synchronize those few lines of code.
It will take the object as a parameter. It will work the
same as Synchronized Method.
In the case of synchronized method lock accessed is
on the method but in the case of synchronized block
lock accessed is on the object.
Ms. Sushma Malik, Associate Professor,IINTM
Synchronized Block
Ms. Sushma Malik, Associate Professor,IINTM
Static Synchronization
In java, every object has a single lock (monitor) associated
with it. The thread which is entering into synchronized
method or synchronized block will get that lock, all other
threads which are remaining to use the shared resources have
to wait for the completion of the first thread and release of
the lock.
Suppose in the case of where we have more than one object,
in this case, two separate threads will acquire the locks and
enter into a synchronized block or synchronized method with
a separate lock for each object at the same time. To avoid this,
we will use static synchronization.
In this, we will place synchronized keywords before the static
method. In static synchronization, lock access is on the class
not on object and Method.
Ms. Sushma Malik, Associate Professor,IINTM
Static Synchronization
Ms. Sushma Malik, Associate Professor,IINTM
Static Synchronization
If you observe the above program results Thread-0,
Thread-1 belongs to object-1 and Thread-2, Thread-3
are belonging to Object-2.
So, there is no interference between thread 0 and 1
because of the same object (obj1).
In the same way, there is no interference between
Thread 2 and 3 because they belong to the same object
(obj2).
But if you observe there is interference between
Thread 0 and 2, same as there is interference between
Thread 1 and 3. To rectify this problem we will use
static synchronization.
Ms. Sushma Malik, Associate Professor,IINTM
Static Synchronization
Ms. Sushma Malik, Associate Professor,IINTM
Static Synchronization
In the above static synchronization program, we can
observe there is no interference between Thread-0 and
Thread-2 same as there is no interference between
Thread-1 and 3.
The next thread is executing after the previous thread
completion or releasing lock only.
Ms. Sushma Malik, Associate Professor,IINTM