2015-05-12 3 views
8

Почему нет b, равный true, если вы запустите этот код в Windows?Как сделать «% n» равным « n»

System.setProperty("line.separator", "\n"); 
String s=String.format("%n"); 
boolean b="\n".equals(s); 

Я хочу s быть "\n" и не "\r\n", даже на Windows.

+0

@RealSkeptic Потому что мой код должен производить тот же результат на всех платформах. –

+9

вы должны просто использовать '\ n' вместо'% n' ..., если код не находится под вашим контролем. – ZhongYu

ответ

5

К сожалению, единственный способ здесь отражение:

Field lineSeparator = System.class.getDeclaredField("lineSeparator"); 

lineSeparator.setAccessible(true); 
lineSeparator.set(null, "\n"); 
3

Проблема заключается в том, что lineSeparator определен и инициализирован в классе System.

Перед тем как позвонить по телефону System.setPropety(), класс System уже инициализирован, а lineSeparator инициализируется системным свойством в этот момент. Он не будет изменен позже.

Вы должны передать свойство системы на опции командной строки ...

Или, можно было бы использовать отражение для принудительного изменения System.lineSeparator поля. Это не гарантируется.

+0

Но 'System.setProperty (« line.separator »,« \ n »);' рассматривается, если я использую методы записи, такие как 'Files.write'. –

+1

ну, это может быть выборка текущего свойства системы; а 'String.format' - нет. – ZhongYu

+0

Неужели нет надежды сделать 'String.format' выборку текущего свойства? –

Смежные вопросы