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 by itself; use File.separator if you must.

Discussion

As mentioned in Section 9.10, 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 character in text strings to mean a newline. What is particularly distressing about this code is that it will work -- 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(  ) + "
" + myName;
}

// The obvious Constructor is not shown for brevity; it's in the code

The real problem is not that it will fail on some platforms, though. What’s really wrong is that it mixes formatting and input/output, 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
}
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.147.59.198