Recipe 10.13 Beware Platform-Dependent File Code


Problem

Chastened by the previous recipe, you now wish to write only platform-independent code.

Solution

Use readLine( ) and println( ). Never use \n by itself; use File.separator if you must.

Discussion

As mentioned in Recipe 10.12, if you just use readLine( ) and println( ), you won't have to think about the line endings. But a particular problem, especially for recycled C programmers and their relatives, is using the \n character in text strings to mean a newline. What is particularly distressing about this code is that it works sometimes usually on the developer's own platform. But it will surely someday fail, on some other system:

// BadNewline.java String myName; public static void main(String argv[]) {     BadNewline jack = new BadNewline("Jack Adolphus Schmidt, III");     System.out.println(jack); } /**  * DON'T DO THIS. THIS IS BAD CODE.  */ public String toString( ) {     return "BadNewlineDemo@" + hashCode( ) + "\n" + myName; } // The obvious Constructor is not shown for brevity; it's in the code

The real problem is not that it fails on some platforms, though. What's really wrong is that it mixes formatting and I/O, or tries to. Don't mix line-based display with toString( ) ; avoid "multiline strings" output from toString( ) or any other string-returning method. If you need to write multiple strings, then say what you mean:

// GoodNewline.java String myName; public static void main(String argv[]) {     GoodNewline jack = new GoodNewline("Jack Adolphus Schmidt, III");     jack.print(System.out); } protected void print(PrintStream out) {     out.println(toString( ));    // classname and hashcode     out.println(myName);        // print name  on next line }



Java Cookbook
Java Cookbook, Second Edition
ISBN: 0596007019
EAN: 2147483647
Year: 2003
Pages: 409
Authors: Ian F Darwin

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net