Hi Lawrence
This is a very nice explanation from Lawrance.
Concerning just the double management of the exceptions:
-- The main method throws any Exception
-- But catches the IOException
It means that IOExceptions alone are processed in the "catch" block: "do
nothing" in the original code. So that no error message is displayed.
The "exceptional" behavior of the code (reaching the end of the file for
instance) is accepted by the programmer as long as it concernes only the
I/O.
Throwing Exception means that the exception is not processed here, it is
notified to the caller in order to be processed at a higher instance. As
there is no higher instance for the "main" method except for the JVM
itself, the JVM processes the exception by displaying the error message
and the call stack.
You may see the exceptions as alerts that stop the current execution up
to a block able to process and consume it. The "try/catch" structure is
able to consume an exception, so it becomes invisible outside. A method
block containing the "throw" clause propagates the corresponding
exception up to the next higher block able to process and to consume it.
In the case you comment the try/catch structure, the end of file
generated IOException is propagated outside the "main" method, together
with any other java.lang.Exception that may occur (as the IOException is
a subclass for Exception).
If you leave the try/catch structure in place, then the IOException is
"consumed" at the try/catch structure, so it doesn't reach the method
block level to be propagated outside.
Of course, if you add the "throws Exception" to the "main" method, the
compiler no longer force you to use a try/catch. This is a syntactical
point of view. But just what the syntax allows is not necessarily what
you want to do. In this case, you may want not to write a big alert
about reaching the end of the file, as you consider it as an expected
behavior.
Concerning the reads on random objects from a file: your program must
know in advance what is in the file in order to do be able to read its
content or to skip the necessary number of bytes up to a particular
object. Of course, this cannot be always accomplish, for example, your
database file may contain a mix of objects, according to whatever the
end user stored in it. You cannot handle this without using much more
sophisticated techniques.
Databases use specific tricks to cheat. One solution is to have fixed
length records and to store in a file only records of the same kind. For
example, if your database is supposed to store Authors and Books, then
they have to be stored in two different files.
Another solution is to have fixed length blocks of bytes containing one
or more variable length objects. Each time an object is written, the
whole block is altered and the nature of the object, its actual length
and its position in the block is written in the block header. When you
read, you read full blocks and you retrieve the particular object you
need based on the information in the header.
In both cases, your file is simply a file of bytes and it is up to you
to assemble bytes into objects and to split object properties into bytes.
Of course, the easier was is to use some already existent database, as
sugested by Lawrance.
Hope it helps
Mihai
Le 20/02/2011 08:10, Lawrence Louie a écrit :
Hi Wayne,
Thanks for the reply/
For Question #1:
One thing that is not clear here is Exception is a superclass of all
other exception, which means that this should catch the exception if
any. So my understanding is that it should not require an exception
of EOFException inside the main. Do you agree?
For Question #2:
What this example deals with here is the random file access? This
means from my understanding is that we would need to understand the
data inside the object in order to figure out how to move the data
around. However, if the data object is a wrapper class which is a
user defined data objects and not using any database object, it
appears it is not easy to figure out the data access method using the
RandomAccessFile method. Any suggestion about this?
Thanks!
Lawrence
On Sat, Feb 19, 2011 at 5:52 PM, Wayne Riesterer
<nexus...@westnet.com.au <mailto:nexus...@westnet.com.au>> wrote:
Hi there Lawrence
I'm only just learning Java, but here is what I reckon...
Question 1
----------
-1 will never be returned, so the readInt() method attempts to read
past the end of the file after it has read in the value of 455. This
makes sense, or it would imply that we wouldn't be able to read and
write integer values of -1 without creating a file terminator :D
When the IOException is commented out and the code executed, the
EOFException is being passed to the next level up in the hierarchy -
in this case to the main() method. This is why the main() method is
referenced in the stack trace.
When the IOException is uncommented and the code is executed, it
appears that there are no errors. The reason for this is because the
IOException catch block doesn't do anything with the exception. If you
put a System.out.println("Oops - we have a problem here"); inside the
IOException block, you will see that it gets executed every time.
EOFException inherits from IOException and is handling the
EOFException in this case. You can prove that be changing the
IOException to EOFException and re-running the code. The results will
be the same.
I tried a simple code change to test this out and changed your code
to:
import java.io.*;
public class RandomFileAccessHandling {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
try {
RandomAccessFile raf = new
RandomAccessFile("/home/ocd/
Training/Java/test.txt", "rw");
raf.writeInt(10);
raf.writeInt(43);
raf.writeInt(88);
raf.writeInt(455);
// change the 3rd integer from 88 to 99
raf.seek((3 - 1) * 4);
raf.writeInt(99);
raf.seek(0); // go to the first integer
for (int i = 0; i < 4; i++) {
System.out.println(raf.readInt());
}
raf.close();
} catch (EOFException e) {
System.out.println("Oops - we have a
problem here...");
}
}
}
...and this runs without any errors.
(Note: my filename is for a Linux box)
Question 2
----------
Have you checked out db4o for this? db4o allows you to read and write
objects quite easily using an Object-Oriented Database.
You can download db4o for free (non-commercial use) and it comes with
a really cool tutorial.
Here is a link: http://www.db4o.com/DownloadNow.aspx
I hope this helps.
Wayne Riesterer :)
On Feb 18, 4:34 am, Lawrence Louie <lawrence.lo...@gmail.com
<mailto:lawrence.lo...@gmail.com>> wrote:
> import java.io.*;
>
> public class RandomFileAccessHandling {
>
> /**
> * @param args
> */
> public static void main(String[] args) throws Exception{
> // TODO Auto-generated method stub
>
> //try {
> RandomAccessFile raf = new
RandomAccessFile("E:\\temp\\abc\
> \test.txt", "rw");
> raf.writeInt(10);
> raf.writeInt(43);
> raf.writeInt(88);
> raf.writeInt(455);
>
> // change the 3rd integer from 88 to 99
> raf.seek((3 - 1) * 4);
> raf.writeInt(99);
> raf.seek(0); // go to the first integer
> int i = raf.readInt();
> while (i != -1) {
> System.out.println(i);
> i = raf.readInt();
> }
> raf.close();
> //} catch (IOException e) {
> //}
> }
>
> }
>
> Question 1:
> If I comment out the IOException, the output is the following:
> 10
> 43
> 99
> 455
> Exception in thread "main" java.io.EOFException
> at
java.io.RandomAccessFile.readInt(RandomAccessFile.java:739)
> at
>
com.ibm.test.JavaIO.RandomFileAccessHandling.main(RandomFileAccessHandling.
java:
> 27)
>
> In the main method, I already have the throws Exception. Why
would I
> require to have a catch IOException there still?
>
> Question 2:
> If I want to do a random access that's is not using primitive or its
> wrapper class, say Student object, how can I use the read or write
> method using the class? How can I determine determine the number of
> bytes so that I would need where to do the seek? Thx.
>
> Lawrence
--
To post to this group, send email to
javaprogrammingwithpassion@googlegroups.com
<mailto:javaprogrammingwithpassion@googlegroups.com>
To unsubscribe from this group, send email to
javaprogrammingwithpassion+unsubscr...@googlegroups.com
<mailto:javaprogrammingwithpassion%2bunsubscr...@googlegroups.com>
For more options, visit this group at
http://groups.google.com/group/javaprogrammingwithpassion?hl=en
--
To post to this group, send email to
javaprogrammingwithpassion@googlegroups.com
To unsubscribe from this group, send email to
javaprogrammingwithpassion+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/javaprogrammingwithpassion?hl=en
--
To post to this group, send email to javaprogrammingwithpassion@googlegroups.com
To unsubscribe from this group, send email to
javaprogrammingwithpassion+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/javaprogrammingwithpassion?hl=en