Подскажите, как ускорить Java-программу, которая читает строки из файла и выводит номер строки на экран

В эклипсе написана простая программа читающая строки из файла и выводящая номер строки на экран. В файле 100,000 строк. Первые 1000-6000 строк выводит за 1 секунду и потом нада ждать долгие минуты до 10,000 строк и окончания я так и не дождался. В гогле нашлось решение которое должно оптимизировать скорость, но оно нефига не работает. Подскажите как ускорить. Внизу листинг

	public void ReadFromFile2() {
		int i = 0;
		try {
			InputStream is = new BufferedInputStream(new FileInputStream(
					SCOREFILE));
			int val;
			while ((val = is.read()) != -1) {
				println(val);
				println(++i);
			}
		} catch (IOException ex) {
			println("An I/O exception has occurred");
		}

	}
👍НравитсяПонравилось0
В избранноеВ избранном0
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Файлик бы прикрепили что-ли :)

Прогресс ведь можно отрисовать в одной строке.

И очищать консоль после N итераций. Скажем, тыща.

Я конечно не гуру еще в Джаве, но мне кажется, оно так долго печатает из за 2-х принтов, не пробовал, но может 2-а принта заменить на 1-н типа println(val + «\n» + (++i)); = надо пробовать, и какой смысл постоянно это дело выводить по 1-му элементу, может где то в массив или структуру как то записать и делать один вывод, когда например она заполниться 1_000 элементами, также можно ваше ++i в конце вывести, количество элементов, что бы не нагружать вывод 100к раз ... или еще что то крутое заюзать из NIO. Я думаю вариантов есть много, надо сидеть думать, искать, пробовать, проверять.

фигня какая-то у вас происходит. Попробовал у себя, файл на 535 кб читает и выводит за пару секунд. Последнее число счетчика, соответственно 546949
Кстати, так и не понял, к чему этот код к подсчету строк? Используйте BufferedReader и метод readLine()

Вот вам чтение и вывод именно строк и номеров строк


final int[] i = {0};

BufferedReader br = new BufferedReader(
new InputStreamReader(new
FileInputStream(SCOREFILE)));

br.lines()
.peek(System.out::println)
.forEach(line -> System.out.println(++i[0]));

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

еще раз повторю, ваш код не читает каждую строку а читает каждый байт

br.lines().peek(System.out::println).forEach(line -> System.out.println(++i[0]));
вот эту строку чето подсвечивает с ошибками, может какая то либа нужна ? для println

это 8-я джава. В предыдущих просто используйте

while ((val = br.readLine()) != null) {
System.out.println(val);
System.out.println(++i); }

проблема оказалась в println(), это функция из пакета еклипс который я скачал со стендфорда. Она делает вывод в окошко ConsoleProgramm а не в консоль.

Можно выводить номера не всех строк, а только тех, которые кратные 100 или 1000. Это конечно, если вывод на экран просто служит индикатором какого-то процесса.

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

а ежели убрать весь вывод, то отработает быстро?

таки да, только не понятно считывался файл или нет

работает очень быстро, до этого я ждал 1 час и дошел до 55000, если отключить вывод то принтаут окончания выводит сразу же. диск ссд, файл гдето 8 мб.

Подписаться на комментарии