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 ...
Get Java Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.