Давайте рассмотрим всем известный способ вывода данных, а именно:
System.out.println("123");Окей. А теперь давайте посмотрим на класс java.io.PrintWriter. Выведем 1 000 000 чисел на экран и засечем время работы.
import java.io.*; public class Temp { public static void main(String[] args){ PrintWriter writer = new PrintWriter(new OutputStreamWriter(System.out)); int n = 1000*1000; long time = System.currentTimeMillis(); for (int i = 0; i < n; ++i) writer.print(i + " "); writer.println(); writer.println(System.currentTimeMillis()-time); writer.close(); } }На моём компьютере результат получается равным примерно 1000-1100 мс. У вас может получится другое число. А теперь попробуем сделать тоже самое с помощью System.out.
public class Temp { public static void main(String[] args){ int n = 1000*1000; long time = System.currentTimeMillis(); for (int i = 0; i < n; ++i) System.out.print(i + " "); System.out.println(); System.out.println(System.currentTimeMillis()-time); } }У меня получилось около 4500 мс. Чувствуете разницу? Чтобы использовать PrintWriter понадобилось добавить всего 2 строчки, а какой прирост скорости!
Для записи в файл используйте FileOutputStream :
PrintWriter writer = new PrintWriter(new FileOutputStream("output.txt"));И да, не забудьте обработать IOException.
Будем считать, что с выводом мы разобрались.
Если для вас важны скорость и удобство вывода - используйте PrintWriter.
Теперь разберемся с вводом.
Для ввода есть очень удобный класс java.util.Scanner. Итак, давайте попробуем прочитать с помощью него всё те же 1 000 000 чисел из файла.
import java.io.*; import java.util.Scanner; public class Temp { public static void main(String[] args) throws IOException{ Scanner sc = new Scanner(new File("output.txt")); int n = 1000*1000; int x; long time = System.currentTimeMillis(); for (int i = 0; i < n; ++i) x = sc.nextInt(); System.out.println(System.currentTimeMillis()-time); } }У меня время работы получается равным примерно 1800 мс. Попробуем улучшить этот результат, правда теперь кода придется добавить побольше. Используем java.io.BufferedReader.
import java.io.*; import java.util.StringTokenizer; class MyReader{ private BufferedReader reader = null; private StringTokenizer tokenizer = null; MyReader(Reader r) throws IOException{ reader = new BufferedReader(r); } public int nextInt() throws IOException { return Integer.parseInt(nextToken()); } public String nextToken() throws IOException { while (tokenizer == null || !tokenizer.hasMoreTokens()) { tokenizer = new StringTokenizer(reader.readLine()); } return tokenizer.nextToken(); } } public class Temp { public static void main(String[] args) throws IOException{ MyReader reader = new MyReader(new FileReader("output.txt")); int n = 1000*1000; int x; long time = System.currentTimeMillis(); for (int i = 0; i < n; ++i) x = reader.nextInt(); System.out.println(System.currentTimeMillis()-time); } }Время работы на моём компьютере около 300 мс! По аналогии с методом nextInt() можно добавить методы и для остальных типов и будет прямо как Scanner. Только работать будет в разы быстрее. ;)
Для ввода из консоли используйте:
MyReader reader = new MyReader(new InputStreamReader(System.in));Нужна хорошая скорость ввода - BufferedReader вам в помощь!
Надеюсь кому-нибудь это пригодится.
Удачи!
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.