Компьютерный справочник
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд

Java system lineseparator

Java system lineseparator

Among the facilities provided by the System class are standard input, standard output, and error output streams; access to externally defined properties and environment variables; a means of loading files and libraries; and a utility method for quickly copying a portion of an array.

Field Summary

Method Summary

Methods inherited from class java.lang.Object

Field Detail

For simple stand-alone Java applications, a typical way to write a line of output data is:

See the println methods in class PrintStream .

Typically this stream corresponds to display output or another output destination specified by the host environment or user. By convention, this output stream is used to display error messages or other information that should come to the immediate attention of a user even if the principal output stream, the value of the variable out , has been redirected to a file or other destination that is typically not continuously monitored.

Method Detail


First, if there is a security manager, its checkPermission method is called with a RuntimePermission(«setIO») permission to see if it’s ok to reassign the «standard» input stream.


First, if there is a security manager, its checkPermission method is called with a RuntimePermission(«setIO») permission to see if it’s ok to reassign the «standard» output stream.


First, if there is a security manager, its checkPermission method is called with a RuntimePermission(«setIO») permission to see if it’s ok to reassign the «standard» error output stream.



This method returns the channel obtained by invoking the inheritedChannel method of the system-wide default SelectorProvider object.

In addition to the network-oriented channels described in inheritedChannel , this method may return other kinds of channels in the future.


If there is a security manager already installed, this method first calls the security manager’s checkPermission method with a RuntimePermission(«setSecurityManager») permission to ensure it’s ok to replace the existing security manager. This may result in throwing a SecurityException .

Otherwise, the argument is established as the current security manager. If the argument is null and no security manager has been established, then no action is taken and the method simply returns.



See the description of the class Date for a discussion of slight discrepancies that may arise between «computer time» and coordinated universal time (UTC).


This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time. The value returned represents nanoseconds since some fixed but arbitrary origin time (perhaps in the future, so values may be negative). The same origin is used by all invocations of this method in an instance of a Java virtual machine; other virtual machine instances are likely to use a different origin.

This method provides nanosecond precision, but not necessarily nanosecond resolution (that is, how frequently the value changes) — no guarantees are made except that the resolution is at least as good as that of currentTimeMillis() .

Differences in successive calls that span greater than approximately 292 years (2 63 nanoseconds) will not correctly compute elapsed time due to numerical overflow.

The values returned by this method become meaningful only when the difference between two such values, obtained within the same instance of a Java virtual machine, is computed.

For example, to measure how long some code takes to execute:

To compare two nanoTime values one should use t1 — t0 , not t1 , because of the possibility of numerical overflow.


If the src and dest arguments refer to the same array object, then the copying is performed as if the components at positions srcPos through srcPos+length-1 were first copied to a temporary array with length components and then the contents of the temporary array were copied into positions destPos through destPos+length-1 of the destination array.

If dest is null , then a NullPointerException is thrown.

If src is null , then a NullPointerException is thrown and the destination array is not modified.

Otherwise, if any of the following is true, an ArrayStoreException is thrown and the destination is not modified:

  • The src argument refers to an object that is not an array.
  • The dest argument refers to an object that is not an array.
  • The src argument and dest argument refer to arrays whose component types are different primitive types.
  • The src argument refers to an array with a primitive component type and the dest argument refers to an array with a reference component type.
  • The src argument refers to an array with a reference component type and the dest argument refers to an array with a primitive component type.

Otherwise, if any of the following is true, an IndexOutOfBoundsException is thrown and the destination is not modified:

  • The srcPos argument is negative.
  • The destPos argument is negative.
  • The length argument is negative.
  • srcPos+length is greater than src.length , the length of the source array.
  • destPos+length is greater than dest.length , the length of the destination array.
Читать еще:  Эта переменная не определена mathcad ошибка

Otherwise, if any actual component of the source array from position srcPos through srcPos+length-1 cannot be converted to the component type of the destination array by assignment conversion, an ArrayStoreException is thrown. In this case, let k be the smallest nonnegative integer less than length such that src[srcPos+ k ] cannot be converted to the component type of the destination array; when the exception is thrown, source array components from positions srcPos through srcPos+ k -1 will already have been copied to destination array positions destPos through destPos+ k -1 and no other positions of the destination array will have been modified. (Because of the restrictions already itemized, this paragraph effectively applies only to the situation where both arrays have component types that are reference types.)



First, if there is a security manager, its checkPropertiesAccess method is called with no arguments. This may result in a security exception.

The current set of system properties for use by the getProperty(String) method is returned as a Properties object. If there is no current set of system properties, a set of system properties is first created and initialized. This set of system properties always includes values for the following keys:

Prefer System.lineSeparator() for Writing System-Dependent Line Separator Strings in Java

Posted by: Dustin Marx in Core Java February 28th, 2018 0 Views

JDK 7 introduced a new method on the java.lang.System class called lineSeparator(). This method does not expect any arguments and returns a String that represents “the system-dependent line separator string.” The Javadoc documentation for this method also states that System.lineSeparator() “always returns the same value – the initial value of the system property line.separator .” It further explains, “On UNIX systems, it returns “ n “; on Microsoft Windows systems it returns “ rn “.”

Given that a Java developer has long been able to use System.getProperty(“line.separator”) to get this system-dependent line separator value, why would that same Java developer now favor using System.lineSeparator instead? JDK-8198645 [“Use System.lineSeparator() instead of getProperty(“line.separator”)”] provides a couple reasons for favoring System.lineSeparator() over the System.getProperty(String) approach in its “Description”:

A number of classes in the base module use System.getProperty(“line.separator”) and could use the more efficient System.lineSeparator() to simplify the code and improve performance.

As the “Description” in JDK-8198645 states, use of System.lineSeparator() is simpler to use and more efficient than System.getProperty(«line.separator») . A recent message on the core-libs-dev mailing list provides more details and Roger Riggs writes in that message that System.lineSeparator() “uses the line separator from System instead of looking it up in the properties each time.”

The performance benefit of using System.lineSeparator() over using System.getProperty(«line.separator») is probably not all that significant in many cases. However, given its simplicity, there’s no reason not to gain a performance benefit (even if tiny and difficult to measure in many cases) while writing simpler code. One of the drawbacks to the System.getProperty(String) approach is that one has to ensure that the exactly matching property name is provided to that method. With String -based APIs, there’s always a risk of spelling the string wrong (I have seen “separator” misspelled numerous times as “seperator”), using the wrong case, or accidentally introducing other typos that prevent exact matches from being made.

The JDK issue that introduced this feature to JDK 7, JDK-6900043 (“Add method to return line.separator property”), also spells out some benefits in its “Description”: “Querying the line.separator value is a common occurrence in large systems. Doing this properly is verbose and involves possible security failures; having a method return this value would be beneficial.” Duplicate JDK-6264243 (“File.lineSeparator() to retrieve value of commonly used ‘line.separator’ system property”) spells out advantages of this approach with even more detail and lists “correctness”, “performance”, and “ease of use and cross-platform development” as high-level advantages. Another duplicate issue, JDK-6529790 (“Please add LINE_SEPARATOR constant into System or some other class”), makes the point that there should be a “constant” added to “some standard Java class, as String or System,” in a manner similar to that provided for file separators by File.pathSeparator.

One of the messages associated with the JDK 7 introduction of System.lineSeparator() justifies it additions with this description:

Lots of classes need to use System.getProperty(«line.separator») . Many don’t do it right because you need to use a doPrivileged block whenever you read a system property. Yet it is no secret – you can divine the line separator even if you have no trust with the security manager.

An interesting side note related to the addition of System.lineSeparator() in JDK 7 is that the Javadoc at that time did not indicate that the method was new to JDK 7. JDK-7082231 (“Put a @since 1.7 on System.lineSeparator”) addressed this in JDK 8 and two other JDK issues (JDK-8011796 and JDK-7094275) indicate that this was desired by multiple Java developers.

The introduction of System.lineSeparator() was a very small enhancement, but it does improve the safety and readability of a relatively commonly used API while not reducing (and, in fact, while improving) performance.

Читать еще:  Классификация ошибок возникающих при тестировании по

Opinions expressed by Java Code Geeks contributors are their own.

Difference between n and System.lineSeparator();?

My Professor kept telling us that she wants us to use the System.lineSeparator(); to create an empty new line, she didn’t specify any reasons, but basically said it was cleaner. What’s the difference and should I use it in the described manner over.

Создан 17 мар. 18 2018-03-17 18:46:48 BlkPengu

The line separator isn’t always ‘n’, e.g. on windows it is ‘rn’. But aside from that, ‘System.lineSeparator();’ does absolutely nothing. – Andy Turner 17 мар. 18 2018-03-17 18:47:52

«My Professor kept telling us she want us to use the System.lineSeparator()» wait, what? This is terrible practice. Are you actually sure she meant that? Use ‘System.out.println’, or, if you’re using ‘String.format’ etc, use ‘%n’. – Andy Turner 17 мар. 18 2018-03-17 18:49:27

Google: eol character – Rui Lima 17 мар. 18 2018-03-17 18:51:05

@BlkPengu you shoul use ‘System.lineSeparator()’ like that: ‘System.out.println(«[your message]» + System.lineSeparator());’ – Artem Petrov 17 мар. 18 2018-03-17 18:51:15

@Artem no, really, don’t. Aside from the verbosity, that creates a new string. – Andy Turner 17 мар. 18 2018-03-17 18:52:10

@AndyTurner All I mean is that invoking ‘System.lineSeparator();’ without using its result does nothing – Artem Petrov 17 мар. 18 2018-03-17 18:53:46

@Artem right, but the correct way is to use ‘System.out.println();’, with no parameters, not to use string concatenation. – Andy Turner 17 мар. 18 2018-03-17 18:55:48

For the record: you are expected to do *serious* research prior posting questions here. Have you tried, well, just putting your question into google first? – GhostCat 17 мар. 18 2018-03-17 19:19:02

@GhostCat I did and it did yield similar questions. However they where badly discussed and did neither yield the specifics I needed, nor did they include the same details from the questions point of view. I’d be happy to discuss weather or not this is a duplicate and reject the notion I would post here without a reasonable discrepancy in other sources. Thank you for pointing it out. I too think the community rules are of major importance. – BlkPengu 17 мар. 18 2018-03-17 19:35:53

@ArtemPetrov please write this as an answer so I can give you credit – BlkPengu 17 мар. 18 2018-03-17 19:39:23

3 ответа

The n character is a single character which is called «new line», usually. Sometimes it may be called «linefeed» to be more accurate. The line separator varies from computer to computer, from Operating System to Operating System. You will get different line separators on Windows and Unix.

If you run this: System.getProperty(«line.separator») it will return the line separator that is specific to your OS. On windows it will return rn and on Unix it will return n .

I hope that it will be clear enough for you.

Создан 17 мар. 18 2018-03-17 18:54:09 Dina Bogdan

This is a good explanation. It does not, however, address the terrible advice OP’s teacher is f giving – Mad Physicist 17 мар. 18 2018-03-17 19:07:45

@MadPhysicist The advice is not terrible. I just think OP misunderstood it. When creating ‘String’s with newline inside, one shouldn’t use ‘n’ but the platform independent solution instead: ‘String text = «hello» + System.lineSeparator() + «test»;’. – Zabuza 17 мар. 18 2018-03-17 19:12:16

@Zabuza. Possibly. In fact probably. Still, all we have is OP’s word. – Mad Physicist 17 мар. 18 2018-03-17 22:35:42

Несколько способов синхронизации процессов и потоков в Java

Предлагаю рассмотреть несколько способов синхронизации потоков и процессов, которые наиболее часто используются в Java. Они отличаются реализацией и случаями применения. Все методы рассмотрим на интересных примерах.

Критические секции

Данный метод подойдет вам, если:

  • параллельные потоки работают с общим ресурсом;
  • требуется синхронизация между потоками, а не процессами;

Данный метод синхронизации называют синхронизацией по ресурсам (синхронизация типа “открыть – закрыть”). Идея данного метода состоит в том, что каждый объект в Java имеет ассоциированный с ним монитор. Монитор представляет своего рода инструмент для управления доступа к объекту.

Для создания критической секции используется оператор synchronized . Когда выполнение кода доходит до оператора synchronized , монитор объекта блокируется, и на время его блокировки монопольный доступ к блоку кода имеет только один поток, который и произвел блокировку. После окончания работы блока кода, монитор объекта освобождается и становится доступным для других потоков.

После освобождения монитора его захватывает другой поток, а все остальные потоки продолжают ожидать его освобождения.


Представим как работает розничный онлайн-магазин. После того, как один из покупателей положил товар в корзину, должен произойти подсчет оставшихся товаров. Только после этого другой покупатель сможет положить в корзину желаемое количество товаров. После чего, их купить.

Работа программы до использования блока синхронизации

Мы видим, что потоки выполняют код программы рандомно. Из-за этого «покупатели» кладут товар в корзины, но остаются без товаров.

Теперь добавим блок синхронизации и посмотрим, как изменится работа программы.

Теперь программа работает точно так, как мы и предполагали. Отлично!

Interface Channel

Вы можете использовать Interface Channel в случае, если вам нужно синхронизировать разные процессы . Канал создается на уровне JVM и будет един в системе.

Читать еще:  Javax jms message

Канал (Channel) представляет собой открытое соединение с объектом, таким как аппаратное устройство, файл, сетевой сокет или программный компонент, способный выполнять одну или несколько отдельных операций ввода-вывода, например чтение или запись.
Канал может быть «открыт» или «закрыт». Как только канал закрыт, любая попытка вызвать его приведет к выбросу ClosedChannelException. Открыт ли канал можно проверить, вызывав метод isOpen( ) или tryLock( ).

Пакет java.nio.channels содержит такие каналы, как:

  • AsynchronousChannel
  • ByteChannel
  • NetworkChannel
  • FileChannel
  • InterruptibleChannel
  • MulticastChannel и другие.


Два процесса записывают данные в файл. Они должны производить запись поочередно, не вмешиваясь, в работу друг друга.

Создадим два проекта, отличающиеся только тем, что они будут записывать в файл — «Программа 1» или «Программа 2». Запускать будем их одновременно.

Если бы мы использовали классический способ записи в файл с помощью FileWriter, то в файле бы обнаружили что-то подобное.

Теперь посмотрим, что будет в файле, если использовать каналы.

Это то, что нам нужно! Процессы захватывают доступ к файлу поочередно.


Кроме синхронизации по данным имеется синхронизация по событиям. Когда параллельно выполняющиеся потоки приостанавливаются вплоть до наступления некоторого события, о котором им сигнализирует другой поток. Основными операциями при таком типе синхронизации являются wait («ждать») и notify («оповестить»).

Это синхронизация типа “ждать – пропустить”:

  • параллельные потоки ждут наступления некоторого события (операция ждать);
  • один из потоков отвечает за наступление события и оповещает о нем остальные потоки(один, используя notify или все — notifyAll,) разблокируя их (операция пропустить).
  • подходит только для синхронизации потоков, не процессов;


Представим как работает система автоматической перезарядки оружия. Например, всего имеется 15 патронов в запасе. В магазине помещается только 6. Стрелок хочет использовать все патроны.

Результат работы программы


Как вы заметили, рассмотренные выше методы синхронизации имеют разные применения. Выбирайте подходящий и всегда синхронизируйте свои потоки и процессы, чтобы они жили мирно и никогда не вмешивались в работу друг друга.

Подписывайтесь на раздел Java, если хотите больше интересных статей. Пишите свое мнение и идеи, касательно данной темы, в комментариях.

Рекомендуем хостинг TIMEWEB

По статье задано0 вопрос(ов)

lineseparator — line separator java что это

Как использовать System.getProperty(«line.separator»). ToString()? (5)

Эта проблема

Вы НЕ должны предполагать, что произвольный входной текстовый файл использует «правильный» специфичный для платформы разделитель newline . Это, кажется, источник вашей проблемы; это имеет мало общего с регулярным выражением.

Для иллюстрации, на платформе Windows System.getProperty(«line.separator») имеет значение «rn» (CR + LF). Однако, когда вы запускаете свой Java-код на этой платформе, вам, вполне возможно, придется иметь дело с входным файлом, разделителем строк которого является просто «n» (LF). Возможно, этот файл изначально был создан на платформе Unix, а затем передан в бинарном (а не текстовом) режиме в Windows. Может быть много сценариев, в которых вы можете столкнуться с такими ситуациями, когда вы должны проанализировать текстовый файл как ввод, который не использует разделитель новой строки текущей платформы.

(По совпадению, когда текстовый файл Windows переносится в Unix в двоичном режиме, многие редакторы отображали ^M что приводило в замешательство некоторых людей, которые не понимали, что происходит).

Когда вы создаете текстовый файл в качестве вывода, вам, вероятно, следует предпочесть разделитель новой строки для конкретной платформы, но когда вы используете текстовый файл в качестве ввода, вероятно, небезопасно делать предположение, что он правильно использует разделитель новой строки для конкретной платформы.


Одним из способов решения проблемы является использование, например, java.util.Scanner . У него есть nextLine() который может возвращать следующую строку (если она существует), корректно обрабатывая любые несоответствия между разделителем новой строки платформы и входным текстовым файлом.

Вы также можете объединить 2 Scanner , один для сканирования файла строка за строкой, а другой для сканирования токенов каждой строки. Вот простой пример использования, который разбивает каждую строку на List . Таким образом, весь файл становится List
> .

Это, вероятно, лучший подход, чем чтение всего файла в одну огромную String а затем split на строки (которые затем split на части).

Смотрите также

  • Эффективное Java, 2-е издание, пункт 25. Предпочитайте списки массивам

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

  • Проверка ввода с использованием java.util.Scanner — имеет много примеров использования
  • Сканер против StringTokenizer против String.Split

У меня есть строка с разделителями табуляции (представляющая таблицу), которая передается моему методу. Когда я печатаю его в командной строке, он выглядит как таблица со строками:

Командное окно правильно буферизовано. Я думаю, что перед или после каждой строки определенно есть новый символ строки.

Моя проблема в том, что я хочу разделить входящую строку на отдельные строки, представляющие строки таблицы. Пока что у меня есть:

Очевидно, что в строке есть что-то, указывающее ОС начать новую строку. Тем не менее, он, очевидно, не содержит символов новой строки.

Запуск последней версии JDK в Windows XP SP3.

В Windows line.separator является комбинацией CR / LF (ссылка here ).

Метод Java String.split() принимает регулярное выражение . Поэтому я думаю, что здесь есть некоторая путаница.

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

Ссылка на основную публикацию