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 the file does not exist an exception will be thrown.
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
24 Sep 2000
copyright © Marcus Green 2000
most recent version at www.jchq.net