Java2 Certification
|
|
You can discuss this topic with others at
http://www.jchq.net/discus
Read
reviews and buy a Java Certification book at
http://www.jchq.net/bookreviews/jcertbooks.htm
Write appropriate code to read, write and update files using FileInputStream, FileOutputStream, and RandomAccessFile objects.
The following example creates a text file called Out.txt and writes the text Hello into it. If you type out the resulting file you will see that file comes out as H e l l o (with a gap between each letter) . I suspect this is because a character is 16 bits and because ASCII is 8 bit, the upper 8 bits result in a blank character.
This also illustrates the previous objective in that it uses
the FilterOutputStream descendent DataOutputStream. This allows human
readable chars to be written. If this example only used
FileOutputStream methods you would be limited to writing bytes or
ints. If you do this and then type the results to the console, it
just shows up as junk characters.
import java.io.*; public class Fos{ String s = new String("Hello"); public static void main(String argv[]){ Fos f = new Fos(); f.amethod(); } public void amethod(){ try{ FileOutputStream fos = new FileOutputStream("Out.txt"); //DataOutputStream allows you to write chars DataOutputStream dos = new DataOutputStream(fos); dos.writeChars(s); }catch(IOException ioe) {} } }
The following example will read the text file produced by the last example and output the text to the console. Note that because the previous program will have written Out.txt as unicode, if you create a text file with an editor containing a a string such as "Hello" , the following code will probably print out junk such as question marks.
import java.io.*; public class Fis{ public static void main(String argv[]){ Fis f = new Fis(); f.amethod(); } public void amethod(){ try{ FileInputStream fis = new FileInputStream("Out.txt"); DataInputStream dis = new DataInputStream(fis); while(true){ char c =dis.readChar(); System.out.println(c); } }catch(IOException ioe) {} } }
The RandomAccessFile class is way out on it's own and doesn't fit neatly with the Stream I/O classes. If you get answer possibilities that mix instances of RandomAccessFile with other streams, then they are almost certainly the wrong answers. RandomAccessFile is more like the File class than the Stream classes. It is useful if you want to move backwards and forwards with in a file without re-opening it.
For its constructor RandomAccessFile takes either an instance of a File class or a string and a read/write mode argument. The mode argument can be either "r" for read only or "rw" can be read and written to. Memorise those two options, don't get caught out in the exam by a bogus mode such as "w", "ro" or "r+w";
Unlike the File class, if you attempt pass the name of a file as a constructor, RandomAccessFile will attempt to open that file. If you pass only the "r" parameter mode and the file does not exist an exception will be thrown. If you pass the mode as "rw" RandomAccessFile will attempt to create the file in the underlying operating system.
The Random Access does not take a stream as a constructor parameter. |
This example will read the Out.txt file created by the
Fos.java example shown earlier.
Because of the blank high byte (not bit), the results show a question mark with each letter.
import java.io.*; public class Raf{ public static void main(String argv[]){ Raf r = new Raf(); r.amethod(); } public void amethod(){ try{ RandomAccessFile raf = new RandomAccessFile("Out.txt","rw"); for(int i=0; i<10;i++){ raf.seek(i); char myc = raf.readChar(); //?Show for high bytes System.out.println(myc); } } catch(IOException ioe) {} } }
|
|
Assuming any exception handling has been set up, which of the following will create an instance of the RandomAccessFile class?
1) RandomAccessFile raf = new
RandomAccessFile("myfile.txt","rw");
2)
RandomAccessFile raf = new RandomAccessFile( new
DataInputStream());
3) RandomAccessFile raf = new
RandomAccessFile("myfile.txt");
4) RandomAccessFile raf
= new RandomAccessFile( new File("myfile.txt"));
Which of the following statements are true?
1) The RandomAccessFile class allows you to move forwards and
backwards without re-opening the file
2) An instance of
RandomAccessFile may be used as a constructor for FileInputStream
3)
The methods of RandomAccessFile do not throw exceptions
4)
Creating a RandomAccessFile instance with a constructor willl throw
an exception if the file does not exist.
Which of the following statements are true?
1) The FileInputStream can take either the name of a file or a an
instance of the File class as a constructor
2) FileInputStream
will throw an exception if the file name passed as a constructor does
not exist
3) The methods of the FileInputStream are especially
appropriate for manipulating text files
4) The delete method of
the FileOutputStream class will remove a file from the operating
system
Question 4)
What will happen when you attempt to compile and run the following code
import java.io.*; public class Fos{ String s = new String("Hello"); public static void main(String argv[]){ Fos f = new Fos(); f.amethod(); } public void amethod(){ FileOutputStream fos = new FileOutputStream("Out.txt"); fos.write(10); } }
1) Compile time error
2) Runtime error
3) Creation of a
file called Out.txt containing the text "10"
4)
Creation of a file called Out.txt
Which of the following statements are true?
1) The seek method of FileInputStream will set the position of the
file pointer
2) The read method of FileInputStream will read bytes
from a FileInputStream
3) The get method of FileInputStream will
read bytes from a FileInputStream
4) A FileOutputStream can be
closed using the close method
1) RandomAccessFile raf = new RandomAccessFile("myfile.txt","rw");
The RandomAccessFile is an anomoly in the Java I/O architecture. It descends directly from Object and is not part of the Streams architecture.
1) The RandomAccessFile class allows you to move forwards and
backwards without re-opening the file
4) Creating a
RandomAccessFile instance with a constructor willl throw an exception
if the file does not exist
1) The FileInputStream can take either the name of a file or a an
instance of the File class as a constructor
2) FileInputStream
will throw an exception if the file name passed as a constructor does
not exist
Option 3 is a reasonable description of the Reader and
Writer classes, the FileInput and Output clases are designed to read
and write bytes rather than text.
1) Compile time error
This code will throw an error something like
Fos.java:10: Exception java.io.IOException must be caught, or it must be declare in the throws clause of this method. FileOutputStream fos = new FileOutputStream("Out.txt");
2) The read method of FileInputStream can be used to read bytes
from a FileInputStream
4) A FileOutputStream can be closed using
the close method
Option one referring to a seek method is fairly implausible as the concept of file pointer is appropriate to the RandomAccessFile rather than the stream classes. The get method of option three is implausible as the prefix get is almost always follwed by what you are getting.
This topic is covered in the Sun Tutorial at
http://java.sun.com/docs/books/tutorial/essential/io/
The JLS on Java IO a bit academic and bare
http://www.infospheres.caltech.edu/resources/langspec-1.0/javaio.doc.html
Richard Baldwin on
I/O
http://home.att.net/~baldwin.rg/Intermediate/Java060.htm
Oreilly have published a book specifically about Java I/O It
probably goes into more detail than is necesary for the Certificaiton
exam but browsing the online samples might give you some insights.
The book gets generally good reviews at www.amazon.com
http://www.oreilly.com/catalog/javaio/
Joyothi has some handy tables for the I/O classes at
http://www.geocities.com/SiliconValley/Network/3693/io.html
Last updated
14 Oct 2001
copyright © Marcus Green
2000
most recent version at www.jchq.net