Что такое буферизация в java
Класс BufferedWriter записывает текст в поток, предварительно буферизируя записываемые символы, тем самым снижая количество обращений к физическому носителю для записи данных.
Класс BufferedWriter имеет следующие конструкторы:
BufferedWriter(Writer out) BufferedWriter(Writer out, int sz)
В качестве параметра он принимает поток вывода, в который надо осуществить запись. Второй параметр указывает на размер буфера.
Например, осуществим запись в файл:
import java.io.*; public class Program < public static void main(String[] args) < try(BufferedWriter bw = new BufferedWriter(new FileWriter("notes4.txt"))) < String text = "Hello World!\nHey! Teachers! Leave the kids alone."; bw.write(text); >catch(IOException ex) < System.out.println(ex.getMessage()); >> >
Чтение текста и BufferedReader
Класс BufferedReader считывает текст из символьного потока ввода, буферизируя прочитанные символы. Использование буфера призвано увеличить производительность чтения данных из потока.
Класс BufferedReader имеет следующие конструкторы:
BufferedReader(Reader in) BufferedReader(Reader in, int sz)
Второй конструктор, кроме потока ввода, из которого производится чтение, также определяет размер буфера, в который будут считываться символы.
Так как BufferedReader наследуется от класса Reader , то он может использовать все те методы для чтения из потока, которые определены в Reader. И также BufferedReader определяет свой собственный метод readLine() , который позволяет считывать из потока построчно.
Рассмотрим применение BufferedReader:
import java.io.*; public class Program < public static void main(String[] args) < try(BufferedReader br = new BufferedReader (new FileReader("notes4.txt"))) < // чтение посимвольно int c; while((c=br.read())!=-1)< System.out.print((char)c); >> catch(IOException ex) < System.out.println(ex.getMessage()); >> >
Также можно считать текст построчно:
try(BufferedReader br = new BufferedReader(new FileReader(«notes4.txt»))) < //чтение построчно String s; while((s=br.readLine())!=null)< System.out.println(s); >> catch(IOException ex)
Считывание с консоли в файл
Соединим оба класса BufferedReader и BufferedWriter для считывания с консоли в файл. Для этого определим следующий код программы:
import java.io.*; public class Program < public static void main(String[] args) < try(BufferedReader br = new BufferedReader (new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new FileWriter("notes5.txt"))) < // чтение построчно String text; while(!(text=br.readLine()).equals("ESC"))< bw.write(text + "\n"); bw.flush(); >> catch(IOException ex) < System.out.println(ex.getMessage()); >> >
Здесь объект BufferedReader устанавливается для чтения с консоли с помощью объекта new InputStreamReader(System.in) . В цикле while считывается введенный текст. И пока пользователь не введет строку «ESC», объект BufferedWriter будет записывать текст файл.
3.15. Java примеры – Как буферизовать строки методом emit()
В следующем примере строки буферизуются и сбрасываются с помощью метода emit().
public class StringBuffer < public static void main(String[] args) < countTo_N_Improved(); >private final static int MAX_LENGTH = 30; private static String buffer = ""; private static void emit(String nextChunk) < if(buffer.length() + nextChunk.length() >MAX_LENGTH) < System.out.println(buffer); buffer = ""; >buffer += nextChunk; > private static final int N = 100; private static void countTo_N_Improved() < for (int count = 2; count > >
Результат
Вышеприведенный пример кода даст следующий результат:
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82
StringBuffer
Классы StringBuffer и StringBuilder используются для создания изменяемой строки.
public class HelloWorld < public static void main(String []args) < StringBuffer sb = new StringBuffer("привет"); sb.append("мир"); sb.insert(0, " ProgLang"); System.out.print(sb); >>
Результат
Вышеприведенный пример кода даст следующий результат:
ProgLangприветмир
Оглавление
- 1. Java примеры – Использование кода на практике
- 2. Java примеры – Окружающая среда
- 2.1. Java примеры – Скомпилировать файл
- 2.2. Java примеры – Установить путь к нескольким классам
- 2.3. Java примеры – Отладка java-файла
- 2.4. Java примеры – Установить путь к классу
- 2.5. Java примеры – Просмотреть текущий путь класса
- 2.6. Java примеры – Установить назначение файла класса
- 2.7. Java примеры – Запустить скомпилированный java-файл класса
- 2.8. Java примеры – Узнать версию Java
- 2.9. Java примеры – Установить путь к классу в .jar-файле или .zip-файле
- 3. Java примеры – Строки
- 3.1. Java примеры – Сравнить две строки
- 3.2. Java примеры – Найти последнее вхождение подстроки внутри подстроки
- 3.3. Java примеры – Удалить нужный символ из строки
- 3.4. Java примеры – Заменить символ в строке
- 3.5. Java примеры – Вывод в обратном порядке
- 3.6. Java примеры – Нахождение символа или слова в строке
- 3.7. Java примеры – Разбиение строки на слова и символы
- 3.8. Java примеры – Преобразование строки в верхний регистр
- 3.9. Java примеры – Найти слово в строке
- 3.10. Java примеры – Сравнить производительность создания строки
- 3.11. Java примеры – Оптимизировать создание строк
- 3.12. Java примеры – Форматирование строк
- 3.13. Java примеры – Конкатенация строк
- 3.14. Java примеры – Определить код Юникода символа в строке
- 3.15. Java примеры – Буферизация строк
- 4. Java примеры – Массивы
- 4.1. Java примеры – Сортировка массива и поиск элемента
- 4.2. Java примеры – Метод сортировки массива, вставить элемент в массив
- 4.3. Java примеры – Размер двумерного массива
- 4.4. Java примеры – Обратный порядок массива, переворачиваем массив
- 4.5. Java примеры – Как выводить массивы и двумерные массивы в консоль
- 4.6. Java примеры – Найти максимальный и минимальный элемент массива
- 4.7. Java примеры – Соединить два массива в один
- 4.8. Java примеры – Как заполнить массив числами
- 4.9. Java примеры – Увеличить массив после инициализации
- 4.10. Java примеры – Сравнение двух массивов
- 4.11. Java примеры – Удаление элемента из массива
- 4.12. Java примеры – Удаление массива из другого массива
- 4.13. Java примеры – Одинаковые элементы массивов
- 4.14. Java примеры – Поиск в массиве
- 4.15. Java примеры – Равенство двух массивов
- 4.16. Java примеры – Сравнить массивы
- 5. Java примеры – Дата и время
- 5.1. Java примеры – Форматирование времени в формате AM-PM
- 5.2. Java примеры – Получение названия и номера текущего месяца
- 5.3. Java примеры – Получить текущее время в часах и минутах
- 5.4. Java примеры – Вывести текущее время и дату
- 5.5. Java примеры – Вывести текущее время в 24-часовом формате
- 5.6. Java примеры – Получить текущий месяц
- 5.7. Java примеры – Получить текущие секунды
- 5.8. Java примеры – Получить короткое название месяца
- 5.9. Java примеры – Получить день недели
- 5.10. Java примеры – Добавление времени к дате
- 5.11. Java примеры – Отображение времени в формате другой страны
- 5.12. Java примеры – Отображение времени на разных языках
- 5.13. Java примеры – Прокрутить часы и месяцы
- 5.14. Java примеры – Получить номер недели и месяц в году
- 5.15. Java примеры – Форматы текущей даты
- 6. Java примеры – Методы
- 6.1. Java примеры – Перезагрузка методов
- 6.2. Java примеры – Вывод массива с использованием метода
- 6.3. Java примеры – Решение Ханойской башни
- 6.4. Java примеры – Последовательность чисел Фибоначчи
- 6.5. Java примеры – Вычисление факториала числа
- 6.6. Java примеры – Переопределение метода
- 6.7. Java примеры – Вывод массива с использованием метода
- 6.8. Java примеры – Использование оператора break
- 6.9. Java примеры – Использование оператора continue
- 6.10. Java примеры – Использование метки в методе
- 6.11. Java примеры – Использование операторов enum и switch
- 6.12. Java примеры – Использование конструктора enum
Что такое буферизация в java


Скачай курс
в приложении
Перейти в приложение
Открыть мобильную версию сайта
© 2013 — 2023. Stepik
Наши условия использования и конфиденциальности

Public user contributions licensed under cc-wiki license with attribution required
Двойная буферизация или Назад в прошлое. Часть вторая
На дворе уже четвёртое января, а моя душа всё не успокаивается. Поэтому я решил продолжить тему написания J2ME приложений. Плюс ко всему, несколько человек проявили нешуточный интерес к данной теме. Причём это были не только рядовые пользователи хабра, но и read-only аккаунты. Ну да ладно, ближе к теме.
Буквально сразу же после публикации топика, были получены очень дельные комментарии от хабраюзера barker, а именно замечание, по сути являющееся прописной истиной и второй комментарий — поправка, не менее дельная.
О чём мы поговорим сегодня
Сегодня мы с вами поговорим о самом процессе двойной буферизации в javax.microedition.lcdui.Canvas и о том, почему же был создан javax.microedition.lcdui.game.GameCanvas.
Что такое «двойная буферизация»
Двойная буферизация является ничем иным, как техникой, которой предусматривается использование второго (внеэкранного) буфера для отрисовки фигур, спрайтов и так далее в него, с последующим копированием его содержания в экранный. Проблема в том, что при рисовании напрямую, т.е. рисование непосредственно в экранный буфер по времени не укладывается в промежуток времени перерисовки экрана (в Canvas это осуществляется функцией repaint()) и экран попросту начинает «мигать», т.е. пользователь видит перед собой промежуточный результат этого самого рисования. Использование этой самой технике позволяет разработчику избегать этих «миганий». Тем не менее, в Canvas использование этой техники является процессом велосипедостроения, т.к. разработчики стандарта и платформы J2ME не позаботились об этом.
«Двойная буферизация» в Canvas
Процесс «двойной буферизации» в Canvas проходит с помощью использования изображения (объекта Image пакета javax.microedition.lcdui), в качестве внеэкранного буфера. Вот так:
import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; /* импортируем необходимые для работы библиотеки */ import javax.microedition.lcdui.Image; public class OurCanvas extends Canvas < Image img; // наш Image Graphics buf; // вот он, буфер int w; // высота экрана int h; // его ширина public OurCanvas() < // конструктор Lego w = getWidth(); // узнаём высоту экрана h = getHeight(); // ширину // сначала проверяем, поддерживается ли "двойная буферизация" самим устройством // если да, то и заботится о создании второго буфера нам не нужно // если же нет, то создаём Image if (!isDoubleBuffered()) < buffer = Image.createImage(w,h); >// получаем возможность отрисовки в img buf = img.getGraphics(); > // рисуем в наш буфер public void draw(Graphics g) < g.setColor(0xffffff); g.fillRect(0,0,w,h); g.setColor(0x111111); g.fillRect(25,25,125,125); g.setColor(0xababab); g.fillRect(70,60,70,60); >public void paint(Graphics g) < g.drawImage(0,0,w,h); // рисуем сам буфер draw(buf); // рисуем в буфер >>
Вот и всё. Код содержит более чем наглядные комментарии, так что разбор кода не должен вызвать у вас проблем. Теперь рассмотрим «двойную буферизацию» в GameCanvas.
«Двойная буферизация» в GameCanvas
Прошло некоторое время и J2ME консорциумом был разработан пакет javax.microedition.lcdui.game, в котором содержался GameCanvas, который представлял собой всё тот же Canvas, но уже с решённой проблемой «двойной буферизации». Программистам теперь не нужно о ней заботиться. Код же будет выглядеть следующим образом:
import javax.microedition.lcdui.game.GameCanvas; import javax.microedition.lcdui.Graphics; /* импортируем необходимые для работы библиотеки */ import javax.microedition.lcdui.Image; public class OurCanvas extends GameCanvas implements Runnable < Graphics buf; Thread t; int w; // высота экрана int h; // его ширина public OurCanvas() < // конструктор нашего OurCanvas w = getWidth(); // узнаём высоту экрана h = getHeight(); // ширину // получаем ссылку на объект Graphics buf = getGraphics(); // наша нить t = new Thread(this); >// let's draw public void run < g.setColor(0xffffff); g.fillRect(0,0,w,h); g.setColor(0x111111); g.fillRect(25,25,125,125); g.setColor(0xababab); g.fillRect(70,60,70,60); flushGraphics(); // вот и вся наша "двойная буферизация" >>
Тут нам не нужно заботиться о буфере — всё сразу рисуется в него, а затем при вызове flushGraphics всё содержимое внеэкранного буфера копируется в экранный.
На этом всё
Несмотря на то, что данная задача отрисовки решается в несколько строк — это достаточно важная тема, в которой разработчикам нельзя «плавать». Надеюсь, сегодняшний урок был не менее поучительным, чем прошлый. На этом всё, разрешите откланяться.
До скорых встреч!
Пейте кофе, пишите на Java.
Post Scriptum
Исходники по сложившейся традиции вы можете забрать на Pastebin.
Здесь — первый пример.
И здесь — второй.
