O'Reilly logo

Java Cookbook by Ian F. Darwin

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

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 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 \n 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(  ) + "\n" + 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 ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required