GWT平台独立的换行符

时间:2014-10-23 09:54:12

标签: java javascript gwt

在我的一个java类中,我想写一个看起来像这样的结果:

String LINE_SEPARATOR = System.lineSeparator();
Stringbuilder result = new Stringbuilder();
result.append("some characters");
result.append(LINE_SEPARATOR);

使用此代码的类将传递给基于GWT的前端。 GWT将GWT使用的所有java类(例如前端的所有类)编译成javascript。但是,GWT无法编译System.lineSeparator(),因为javascript中没有等效的方法。

String LINE_SEPARATOR = System.getProperty(line.separator);

String LINE_SEPARATOR = String.format("%n");

也会导致GWT编译器异常。但是,

String LINE_SEPARATOR = "\r\n";

有效,但与平台无关。

如何获得与GWT兼容的独立于平台的换行符?

2 个答案:

答案 0 :(得分:3)

最简单的事情可能会起作用(从头顶开始):

String LINE_SEPARATOR = GWT.isClient() ? "\n" : getLineSeparator();

@GwtIncompatible
private static String getLineSeparator() {
  return System.lineSeparator();
}

这需要最新版本的GWT(至少2.6,可能是2.7)。

另一种方法是使用带有简单提供者类的超级源:

public class LineSeparatorProvider {
  public final String LINE_SEPARATOR = System.lineSeparator();
}

// in super-source
public class LineSeparatorProvider {
  public final String LINE_SEPARATOR = "\n";
}

请注意,在将来的GWT版本中,System.getProperty将起作用(对于某些属性),因此您可以使其适用于line.separator

... ,您可以在任何地方使用\n,并且只有当您确实需要\r\n然后执行replace("\n", "\r\n")时。

(如果你问我,我在任何地方都使用\n,即使在Windows上也是如此)

答案 1 :(得分:1)

一个简单的解决方案是:

String systemLineSeparator;
String platform = Window.Navigator.getPlatform();
if(platform.toLowerCase().contains("windows")) {
    systemLineSeparator = "\r\n";
}
else {
    systemLineSeparator = "\n";
}

更高级的解决方案可以使用延迟绑定。