Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / August 2007

Tip: Looking for answers? Try searching our database.

How to implement this?

Thread view: 
xz - 06 Aug 2007 21:31 GMT
I want all the classes write the runtime information into one common
file, let's say, log.
So I define a BufferedWriter log in one of the classes and make it
public static, as follows,

import java.io.BufferedWriter;
import java.io.FileWriter;

public class Tester {

               static String path = "/home/xi/Desktop/D2V/
validation/";
               static FileWriter fwlog = new FileWriter(path +
"log");
               public static BufferedWriter log = new
BufferedWriter(fwlog);
               //the rest code
}

However, the constructor of FileWriter throws exception so it does not
compile:
--------------------
Tester.java:11: unreported exception java.io.IOException; must be
caught or declared to be thrown
               static FileWriter fwlog = new FileWriter(path +
"log");
                                         ^
1 error
--------------------

What can I do to handle this exception?

looks like I cannot either catch it here or put the "throws
IOException...." sentence after "public class Tester".
Chris - 06 Aug 2007 21:50 GMT
> I want all the classes write the runtime information into one common
> file, let's say, log.
[quoted text clipped - 30 lines]
> looks like I cannot either catch it here or put the "throws
> IOException...." sentence after "public class Tester".

Try this:

public class Tester {
    private static BufferedWriter logger;

    public static BufferedWriter getLogger() throws IOException {
        if (logger==null) {
            logger = new BufferedWriter(whatever...);
        }
        return logger;
    }
}

In your code, call:

Tester.getLogger().write("some message");

Of if you want to avoid the call to if (logger==null) on every log
statement, create a static init() method and call that before the first
call to getLogger().
xz - 06 Aug 2007 22:39 GMT
> > I want all the classes write the runtime information into one common
> > file, let's say, log.
[quoted text clipped - 52 lines]
> statement, create a static init() method and call that before the first
> call to getLogger().

Thanks. That works.
Lew - 06 Aug 2007 22:56 GMT
>> I want all the classes write the runtime information into one common
>> file, let's say, log.
[quoted text clipped - 51 lines]
> statement, create a static init() method and call that before the first
> call to getLogger().

The latter likely avoids the threading complications of the unsynchronized
test-and-set idiom you presented.  In a case like this there is no advantage
to lazy initialization.

If your Logger class is from log4j it is already thread safe, of course.

One more approach is a static initializer:

public class Tester
{
   private static final BufferedWriter logger;
   static
   {
     String path = "/home/xi/Desktop/D2V/validation/";
     try
     {
      logger = new BufferedWriter( new FileWriter(
                   new File( path, "log" )));
     }
     catch ( IOException exc )
     {
      String msg = "Cannot open log file \""+ path +"log\"";
      throw new IllegalStateException( msg, exc );
     }
   }
...
}

This is like using the static init() method without naming the method.  The
body of the static initializer could be the body of a static initialization
method like initLogger().

public class Tester
{
   private static final BufferedWriter logger = initLogger();
...
}

Signature

Lew

xz - 07 Aug 2007 06:23 GMT
> The latter likely avoids the threading complications of the unsynchronized
> test-and-set idiom you presented.  In a case like this there is no advantage
[quoted text clipped - 28 lines]
> body of the static initializer could be the body of a static initialization
> method like initLogger().

This is more close to what I wanted originally.
Thank you!


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2009 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.