Easy to Learn Java: Programming Articles, Examples and Tips

Start with Java in a few days with Java Lessons or Lectures

Home

Code Examples

Java Tools

More Java Tools!

Java Forum

All Java Tips

Books

Submit News
Search the site here...
Search...
 
Search the JavaFAQ.nu
1000 Java Tips ebook

1000 Java Tips - Click here for the high resolution copy!1000 Java Tips - Click here for the high resolution copy!

Java Screensaver, take it here

Free "1000 Java Tips" eBook is here! It is huge collection of big and small Java programming articles and tips. Please take your copy here.

Take your copy of free "Java Technology Screensaver"!.

Easy Learn Java: Programming Articles, Examples and Tips - Page 342


Previous 1060 Stories (530 Pages, 2 Per Page) Next

Advanced Web Ranking v3.7 Released

Go to all tips in Web development, tech, marketing, securi
Release date: Mar 7, 2004

Manage Your Search Engine Web Rankings

Caphyon LLC is pleased to announce the release of Advanced Web Ranking 3.7, a tool that helps check your web site position on all major search engines. Advanced Web Ranking runs on Mac OS X, Windows 98/2000/XP, Linux and Solaris.

Checking your web site position is a very time consuming task. For example, if you have 10 keywords that you want to monitor, and you want to check the top 20 positions for 10 search engines, you need to perform about 200 (10 keywords * 10 engines * first 2 pages) individual searches to get the results. Then you need to compare the results one by one to find where your site is positioned. It may take you days to complete this task if you do this manually. That's where Advanced Web Ranking comes to help.

Advanced Web Ranking is able to query over 200 search engines and quickly find out if you're moving up or down in the rankings, or if your site is listed at all. It will track the progress of your rankings over time and display that information in an easy to read and understand graphical and tabular reports. It can help you check not just the position of your website but the position of your competitors' web sites as well.

Advanced Web Ranking has the ability to generate and email reports after an update was finished. Couple that with the Scheduled Updates ability, and you will be able to turn on your computer in the morning and find reports on your websites ranks waiting for you in your Inbox. As a SEO, you can have updates being run and sent to your customers every night without even lifting a hand. Various types of reports (Current Rank, Top Sites, Web Site, etc.) can be created in any of the formats Advanced Web Ranking supports (PDF, HTML, Excel, XML or Text). Then they can be emailed to any of the addresses you pick from the Address Book, or saved to a folder where you can access them over the Internet.

What's new in Advanced Web Ranking 3.7
======================================

This version adds two new reports (Search Engine Rank and Keyword Rank), the ability to upload reports to an FTP server and more search capabilities for Keywords, Search Engines and URLs panels.

- Added two new reports: Search Engine Rank and Keyword Rank (data and charts)
- Added search capabilities for Keywords, Search Engines and URLs panels
- Added ability to upload reports to an FTP server
- Added ability to sleep n minutes when a search engine fails m times
- Added ability to specify a URL where the HTML reports will get the images from

Advanced Web Ranking costs USD $149 for the Professional edition. Users who don't need certain advanced features like printable reports can purchase the Standard edition for USD $59.

The application can be downloaded from:
http://www.advancedwebranking.com/download.html

More details about the application can be found at:
http://www.advancedwebranking.com
2796 bytes more | 3 comments | Printer Friendly Page  Send to a Friend | Score: 0
Posted by Anonymous on Saturday, April 16, 2005 (00:00:00) (2214 reads)

Java Lesson 45: Low-level and high-level stream classes

Go to all tips in Java Lessons by Jon Huhtala
All Java Lessons contents page | Java Lesson 1 | Java Lesson 2 | Java Lesson 3 | Java Lesson 4 | Java Lesson 5 | Java Lesson 6 | Java Lesson 7 | Java Lesson 8 | Java Lesson 9 | Java Lesson 10 | Java Lesson 11 | Java Lesson 12 | Java Lesson 13 | Java Lesson 14 | Java Lesson 15 | Java Lesson 16 | Java Lesson 17 | Java Lesson 18 | Java Lesson 19 | Java Lesson 20 | Java Lesson 21 | Java Lesson 22 | Java Lesson 23 | Java Lesson 24 | Java Lesson 25 | Java Lesson 26 | Java Lesson 27 | Java Lesson 28 | Java Lesson 29 | Java Lesson 30 | Java Lesson 31 | Java Lesson 32 | Java Lesson 33 | Java Lesson 34 | Java Lesson 35 | Java Lesson 36 | Java Lesson 37 | Java Lesson 38 | Java Lesson 39 | Java Lesson 40 | Java Lesson 41 | Java Lesson 42 | Java Lesson 43 | Java Lesson 44 | Java Lesson 45 | Java Lesson 46

Java Lesson 45 by Jon Huhtala

Low-level and high-level stream classes


Overview

At its lowest level, all Java I/O involves a stream of bytes either entering or leaving memory as shown by this diagram:

Memory

Output stream of bytes

External device

----->

<-----

Input stream of bytes

Obviously, sending and receiving individual bytes would be tedious and difficult for an application to manage. For that reason, several packaged classes exist that make it easy for a program to read and write larger units of data.

Most programs use a "high-level" stream class object that is "chained" (connected) to a "low-level" stream class object. While the low-level stream class object handles byte I/O, the high-level stream class object will allow the program to read and write primitive data values and even objects (as shown below).

Application

"High-level" stream class object

"Low-level" stream class object

External device

<--->

<--->

primitives and objects

bytes

............


There are many stream classes, but you will only be required to know the ones that are highlighted below:

Direction

Low-level classes

High-level classes

Output

ByteArrayOutputStream

FileOutputStream

BufferedOutputStream

DataOutputStream

ObjectOutputStream

PrintStream

Input

ByteArrayInputStream

FileInputStream

BufferedInputStream

DataInputStream

LineNumberInputStream

ObjectInputStream

PushbackInputStream

The FileOutputStream class

  • Is part of the java.io package

  • Is an extension of the OutputStream class, an abstract class that describes the behavior of an output stream

Object

OutputStream

FileOutputStream
  • Is a low-level class that can be used to send individual, 8-bit bytes to a stream

  • Has several constructors. The most frequently used constructs a FileOutputStream object from a File object that encapsulates the file's pathname. For example, if fd is the reference of a File object

FileOutputStream out = new FileOutputStream(fd);

will construct a FileOutputStream object for sending bytes to the file. If the file already exists, its contents will be replaced (there is an overloaded constructor to specify appending). Because a checked, IOException may occur, the statement should be enclosed in a try block with an appropriate catch.
  • Has a few useful methods. The two most used are:

Method

Usage

close()

Closes the stream and releases stream resources

write()

Writes the right-most 8 bits of a specified integer value to the stream

Because a checked, IOException may occur, calls to these methods should be enclosed in a try block with an appropriate catch. Consult the Java API documentation for more details.

  • Example. The following program can be used to create a file of numbers on disk.

import java.io.*;
public class App {
public static void main(String[] args) {

// Local variables and object references.

char again = 'y';
File fd;
FileOutputStream out;

// Get the path name from the user.

System.out.print("Enter the file's complete path name: ");
fd = new File(Keyboard.readString());

// Try to write data to the output stream.

try {

// Open an output stream for the file.

out = new FileOutputStream(fd);

// This loop asks the user to enter a number and writes it to the
// stream. The user is then asked if they want to enter another.

while (again == 'Y' || again == 'y') {
System.out.print("Enter a number: ");
int theNumber = Keyboard.readInt();
out.write(theNumber);
System.out.print("Again? (Y/N): ");
again = Keyboard.readChar();
}

// Close the stream.

out.close();
System.out.println("Closed - " + fd.getPath());
}

// Catch an IOException if one is thrown.

catch (IOException e) {
System.out.println(e.getMessage());
}
}
}

The FileInputStream class

  • Is part of the java.io package

  • Is an extension of the InputStream class, an abstract class that describes the behavior of an input stream

Object

InputStream

FileInputStream
  • Is a low-level class that can be used to read individual, 8-bit bytes from a stream

  • Has several constructors. The most frequently used constructs a FileInputStream object from a File object that encapsulates the file's pathname. For example, if fd is the reference of a File object

FileInputStream in = new FileInputStream(fd);

will construct a FileInputStream object for reading bytes from the file. Because a checked, IOException may occur, the statement should be enclosed in a try block with an appropriate catch.
  • Has a few useful methods. The most used are:

Method

Usage

available()

Returns the number of bytes that can be read from this input stream

close()

Closes the stream and releases stream resources

read()

Reads the next byte value from the input stream

Because a checked, IOException may occur, calls to these methods should be enclosed in a try block with an appropriate catch. Consult the Java API documentation for more details.

  • Example. The following program can be used to read byte values from a disk file. It can be used to display the values stored by the previous sample program.

import java.io.*;
public class App {
public static void main(String[] args) {

// Local variables and object references.

File fd;
FileInputStream in;

// Get the path name from the user.

System.out.print("Enter the file's complete path name: ");
fd = new File(Keyboard.readString());

// Try to read data from the input stream.

try {

// Open an input stream for the file.

in = new FileInputStream(fd);

// This loop reads a byte from the stream and displays
// its value. The loop ends when no more bytes are available.

while (in.available() > 0) {
System.out.println(in.read());
}

// Close the stream.

in.close();
System.out.println("Closed - " + fd.getPath());
}

// Catch an IOException if one is thrown.

catch (IOException e) {
System.out.println(e.getMessage());
}
}
}

The DataOutputStream class

  • Is part of the java.io package

  • Is an extension of the FilterOutputStream class (a superclass that facilitates the chaining of high-level and low-level output streams)

Object

OutputStream

FilterOutputStream

DataOutputStream
  • Is a high-level class that can be used to send primitive values and UTF ("Unicode Transformation Format") strings to a stream

  • Has a single constructor that "chains" to an object that descends from the OutputStream class (such as a FileOutputStream object). For example, if fd is the reference of a File object

DataOutputStream out = new DataOutputStream(new FileOutputStream(fd));

will construct a DataOutputStream object chained to a FileOutputStream object for sending primitive values and UTF strings to the file. Because a checked, IOException may occur, the statement should be enclosed in a try block with an appropriate catch.
  • Has many useful methods as follows:

Method

Usage

writeBoolean()

Writes a specified boolean value to the stream

writeByte()

Writes a specified byte value to the stream

writeChar()

Writes a specified char value to the stream

writeDouble()

Writes a specified double value to the stream

writeFloat()

Writes a specified float value to the stream

writeInt()

Writes a specified int value to the stream

writeLong()

Writes a specified long value to the stream

writeShort()

Writes a specified short value to the stream

writeUTF()

Writes a specified String to the stream according to the UTF standard

Because a checked, IOException may occur, calls to these methods should be enclosed in a try block with an appropriate catch. Consult the Java API documentation for more details.

  • Example. The following program can be used to create a file of double values on disk.

import java.io.*;
public class App {
public static void main(String[] args) {

// Local variables and object references.

char again = 'y';
File fd;
DataOutputStream out;

// Get the path name from the user.

System.out.print("Enter the file's complete path name: ");
fd = new File(Keyboard.readString());

// Try to write data to the output stream.

try {

// Open an output stream for the file.

out = new DataOutputStream(new FileOutputStream(fd));

// This loop asks the user to enter a number and writes it to the
// stream. The user is then asked if they want to enter another.

while (again == 'Y' || again == 'y') {
System.out.print("Enter any real number (n.n): ");
double theNumber = Keyboard.readDouble();
out.writeDouble(theNumber);
System.out.print("Again? (Y/N): ");
again = Keyboard.readChar();
}

// Close the stream.

out.close();
System.out.println("Closed - " + fd.getPath());
}

// Catch an IOException if one is thrown.

catch (IOException e) {
System.out.println(e.getMessage());
}
}
}

The DataInputStream class

  • Is part of the java.io package

  • Is an extension of the FilterInputStream class (a superclass that facilitates the chaining of high-level and low-level input streams)

Object

InputStream

FilterInputStream

DataInputStream
  • Is a high-level class that can be used to read primitive values and UTF ("Unicode Transformation Format") strings from a stream

  • Has a single constructor that "chains" to an object that descends from the InputStream class (such as a FileInputStream object). For example, if fd is the reference of a File object

DataInputStream in = new DataInputStream(new FileInputStream(fd));

will construct a DataInputStream object chained to a FileInputStream object for reading primitive values and UTF strings from the file. Because a checked, IOException may occur, the statement should be enclosed in a try block with an appropriate catch.
  • Has many useful methods as follows:

Method

Usage

readBoolean()

Reads a boolean value from the stream

readByte()

Reads a byte value from the stream

readChar()

Reads a char value from the stream

readDouble()

Reads a double value from the stream

readFloat()

Reads a float value from the stream

readInt()

Reads a int value from the stream

readLong()

Reads a long value from the stream

readShort()

Reads a short value from the stream

readUTF()

Reads a String from the stream according to the UTF standard

Because a checked, IOException may occur, calls to these methods should be enclosed in a try block with an appropriate catch. Consult the Java API documentation for more details.

  • Example. The following program can be used to read a file of double values from disk. It can be used to display the values stored by the previous sample program.

import java.io.*;
public class App {
public static void main(String[] args) {

// Local variables and object references.

File fd;
DataInputStream in;

// Get the path name from the user.

System.out.print("Enter the file's complete path name: ");
fd = new File(Keyboard.readString());

// Try to read data from the input stream.

try {

// Open an input stream for the file.

in = new DataInputStream(new FileInputStream(fd));

// This loop reads a double value from the stream and displays
// it. The loop ends when end of file is reached.

try {
while (true) {
System.out.println(in.readDouble());
}
}
catch (EOFException e) {
System.out.println("");
}

// Close the stream.

in.close();
System.out.println("Closed - " + fd.getPath());
}

// Catch an IOException if one is thrown.

catch (IOException e) {
System.out.println(e.getMessage());
}
}
}

The ObjectOutputStream class

  • Is part of the java.io package

  • Is an extension of the OutputStream class, an abstract class that describes the behavior of an output stream

Object

OutputStream

ObjectOutputStream

  • Is a high-level class that can be used to send primitive values and "serializable" objects to a stream. All that is needed for an object to be serializable, is that its class must implement the Serializable interface. For example, if a Customer class is to be serializable, its header may be coded

public class Customer implements Serializable

The interface requires no methods.

Many packaged classes are serializable including all wrapper classes, String and Stringbuffer classes, Vector and Array classes, and the collection classes. In other words, an entire collection, such as a SortedMap, can be stored as an object on disk!

  • Has overloaded constructors but the most useful "chains" to an object that descends from the OutputStream class (such as a FileOutputStream object). For example, if fd is the reference of a File object

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fd));

will construct a ObjectOutputStream object chained to a FileOutputStream object for sending primitive values and serializable objects to the file. Because a checked, IOException may occur, the statement should be enclosed in a try block with an appropriate catch.
  • Has many useful methods as follows:

Method

Usage

writeBoolean()

Writes a specified boolean value to the stream

writeByte()

Writes a specified byte value to the stream

writeChar()

Writes a specified char value to the stream

writeDouble()

Writes a specified double value to the stream

writeFloat()

Writes a specified float value to the stream

writeInt()

Writes a specified int value to the stream

writeLong()

Writes a specified long value to the stream

writeObject()

Writes a specified serializable object to the stream

writeShort()

Writes a specified short value to the stream

writeUTF()

Writes a specified String to the stream according to the UTF standard

Because a checked, IOException may occur, calls to these methods should be enclosed in a try block with an appropriate catch. Consult the Java API documentation for more details.

  • Example. The following program can be used to create a file of multiple array objects on disk.

import java.io.*;
public class App {
public static void main(String[] args) {

// Local variables and object references.

char again = 'y';
String[] array;
File fd;
ObjectOutputStream out;

// Get the path name from the user.

System.out.print("Enter the file's complete path name: ");
fd = new File(Keyboard.readString());

// Try to write data to the output stream.

try {

// Open an output stream for the file.

out = new ObjectOutputStream(new FileOutputStream(fd));

// This loop constructs an array with values entered by the user
// and writes the array to the file. The user is given the option
// of repeating the loop to construct and store another array.

while (again == 'Y' || again == 'y') {
System.out.print("How many strings will you enter? ");
array = new String[Keyboard.readInt()];
for (int i = 0; i < array.length; i++) {
System.out.print("Enter a string: ");
array[i] = Keyboard.readString();
}
out.writeObject(array);
System.out.print("Again? (Y/N) ");
again = Keyboard.readChar();
}

// Close the stream.

out.close();
System.out.println("Closed - " + fd.getPath());
}

// Catch an IOException if one is thrown.

catch (IOException e) {
System.out.println(e.getMessage());
}
}
}

The ObjectInputStream class

  • Is part of the java.io package

  • Is an extension of the InputStream class, an abstract class that describes the behavior of an input stream

Object

InputStream

ObjectInputStream

  • Is a high-level class that can be used to read primitive values and serializable objects from a stream

  • Has overloaded constructors but the most useful "chains" to an object that descends from the InputStream class (such as a FileInputStream object). For example, if fd is the reference of a File object

ObjectInputStream out = new ObjectInputStream(new FileInputStream(fd));

will construct a ObjectInputStream object chained to a FileInputStream object for reading primitive values and serializable objects from the file. Because a checked, IOException may occur, the statement should be enclosed in a try block with an appropriate catch.
  • Has many useful methods as follows:

Method

Usage

readBoolean()

Reads a boolean value from the stream

readByte()

Reads a byte value from the stream

readChar()

Reads a char value from the stream

readDouble()

Reads a double value from the stream

readFloat()

Reads a float value from the stream

readInt()

Reads a int value from the stream

readLong()

Reads a long value from the stream

readObject()

Reads an object from the stream

readShort()

Reads a short value from the stream

readUTF()

Reads a String from the stream according to the UTF standard

Because a checked, IOException may occur, calls to these methods should be enclosed in a try block with an appropriate catch. Consult the Java API documentation for more details.

  • Example. The following program can be used to read a file of array objects from disk. It can be used to display the array values stored by the previous sample program.

import java.io.*;
public class App {
public static void main(String[] args) {

// Local variables and object references.

File fd;
ObjectInputStream in;

// Get the path name from the user.

System.out.print("Enter the file's complete path name: ");
fd = new File(Keyboard.readString());

// Try to read data from the input stream.

try {

// Open an input stream for the file.

in = new ObjectInputStream(new FileInputStream(fd));

// This loop reads a array objects from the stream and displays
// their contents. The loop ends when end of file is reached.

try {
while (true) {
String[] array = (String[]) in.readObject();
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
System.out.println("<< END OF ARRAY >>");
}
}
catch (EOFException e) {
System.out.println("<< END OF FILE >>");
}

// Close the stream.

in.close();
System.out.println("Closed - " + fd.getPath());
}

// Catch an IOException if one is thrown.

catch (IOException e) {
System.out.println(e.getMessage());
}

// Catch an ClassNotFoundException if one is thrown.

catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
}
}

Looking ahead

All the files in this lesson were sequential. The data was stored in a particular order and read in the same order. In the next lesson you will learn how to create and use a random access file in which an item of data may be read from or written to an existing file based upon its position within the file.

Lab exercise for Ferris students

E-mail your answers to this assignment no later than the due date listed in the class schedule.

Review questions

  1. Which of the following provide a method for reading of an int value from a stream? (choose two)

  1. ObjectInputStream

  2. FileInputStream

  3. FileStream

  4. InputStream

  5. DataInputStream

  1. What will happen when an attempt is made to compile and execute the following program? The line numbers are for reference purposes only.

1
2
3
4
5
6
7
8
9
import java.io.*;
public class App {
public static void main(String[] args) {
File fd = new File("c:tempmyfile.dat");
FileOutputStream out = new FileOutputStream(fd);
out.write(123);
out.close();
}
}
  1. The program will not compile

  2. The code will compile but a runtime exception will occur

  3. The program will compile and execute to store the int value 123 in the disk file

  4. The program will compile and execute to store the byte value 123 in the disk file

  5. The program will compile and execute but nothing will be stored in the disk file

  1. If fd is a File object containing a path name, code a single statement to construct a DataInputStream object named istream for the file.

  1. True or False: If the following is the header of an instantiable class, an object of the class can be written to disk using a DataOutputStream.

public class someClass implements Serializable

  1. True

  2. False


60426 bytes more | 3 comments | Printer Friendly Page  Send to a Friend | Score: 4.5
Posted by jalex on Saturday, April 16, 2005 (00:00:00) (11558 reads)

Previous 1060 Stories (530 Pages, 2 Per Page) Next

530| 529| 528| 527| 526| 525| 524| 523| 522| 521| 520| 519| 518| 517| 516| 515| 514| 513| 512| 511| 510| 509| 508| 507| 506| 505| 504| 503| 502| 501| 500| 499| 498| 497| 496| 495| 494| 493| 492| 491| 490| 489| 488| 487| 486| 485| 484| 483| 482| 481| 480| 479| 478| 477| 476| 475| 474| 473| 472| 471| 470| 469| 468| 467| 466| 465| 464| 463| 462| 461| 460| 459| 458| 457| 456| 455| 454| 453| 452| 451| 450| 449| 448| 447| 446| 445| 444| 443| 442| 441| 440| 439| 438| 437| 436| 435| 434| 433| 432| 431| 430| 429| 428| 427| 426| 425| 424| 423| 422| 421| 420| 419| 418| 417| 416| 415| 414| 413| 412| 411| 410| 409| 408| 407| 406| 405| 404| 403| 402| 401| 400| 399| 398| 397| 396| 395| 394| 393| 392| 391| 390| 389| 388| 387| 386| 385| 384| 383| 382| 381| 380| 379| 378| 377| 376| 375| 374| 373| 372| 371| 370| 369| 368| 367| 366| 365| 364| 363| 362| 361| 360| 359| 358| 357| 356| 355| 354| 353| 352| 351| 350| 349| 348| 347| 346| 345| 344| 343|
342
| 341| 340| 339| 338| 337| 336| 335| 334| 333| 332| 331| 330| 329| 328| 327| 326| 325| 324| 323| 322| 321| 320| 319| 318| 317| 316| 315| 314| 313| 312| 311| 310| 309| 308| 307| 306| 305| 304| 303| 302| 301| 300| 299| 298| 297| 296| 295| 294| 293| 292| 291| 290| 289| 288| 287| 286| 285| 284| 283| 282| 281| 280| 279| 278| 277| 276| 275| 274| 273| 272| 271| 270| 269| 268| 267| 266| 265| 264| 263| 262| 261| 260| 259| 258| 257| 256| 255| 254| 253| 252| 251| 250| 249| 248| 247| 246| 245| 244| 243| 242| 241| 240| 239| 238| 237| 236| 235| 234| 233| 232| 231| 230| 229| 228| 227| 226| 225| 224| 223| 222| 221| 220| 219| 218| 217| 216| 215| 214| 213| 212| 211| 210| 209| 208| 207| 206| 205| 204| 203| 202| 201| 200| 199| 198| 197| 196| 195| 194| 193| 192| 191| 190| 189| 188| 187| 186| 185| 184| 183| 182| 181| 180| 179| 178| 177| 176| 175| 174| 173| 172| 171| 170| 169| 168| 167| 166| 165| 164| 163| 162| 161| 160| 159| 158| 157| 156| 155| 154| 153| 152| 151| 150| 149| 148| 147| 146| 145| 144| 143| 142| 141| 140| 139| 138| 137| 136| 135| 134| 133| 132| 131| 130| 129| 128| 127| 126| 125| 124| 123| 122| 121| 120| 119| 118| 117| 116| 115| 114| 113| 112| 111| 110| 109| 108| 107| 106| 105| 104| 103| 102| 101| 100| 99| 98| 97| 96| 95| 94| 93| 92| 91| 90| 89| 88| 87| 86| 85| 84| 83| 82| 81| 80| 79| 78| 77| 76| 75| 74| 73| 72| 71| 70| 69| 68| 67| 66| 65| 64| 63| 62| 61| 60| 59| 58| 57| 56| 55| 54| 53| 52| 51| 50| 49| 48| 47| 46| 45| 44| 43| 42| 41| 40| 39| 38| 37| 36| 35| 34| 33| 32| 31| 30| 29| 28| 27| 26| 25| 24| 23| 22| 21| 20| 19| 18| 17| 16| 15| 14| 13| 12| 11| 10| 9| 8| 7| 6| 5| 4| 3| 2| 1|


Home Code Examples Java Forum All Java Tips Books Submit News, Code... Search... Offshore Software Tech Doodling

RSS feed Java FAQ RSS feed Java FAQ News     

    RSS feed Java Forums RSS feed Java Forums

All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest 1999-2006 by Java FAQs Daily Tips.

Interactive software released under GNU GPL, Code Credits, Privacy Policy