Содержание
- 2. Основи вводу / виводу Потоки Байтові і символьні потоки Класи байтових потоків Попередньо визначені потоки Зчитування
- 3. Основи вводу / виводу Реальні програми Java не засновані на консольних текстових програмах. Вони є графічними
- 4. Потоки Java-програми виконують введення / виведення через потоки. Потік є абстракцією, яка або виробляє, або споживає
- 5. Байтові і символьні потоки Java 2 визначає два типи потоків (точніше - потокових класів і об'єктів):
- 6. Класи байтових потоків Байтові потоки визначаються у двох ієрархіях класів. Наверху цієї ієрархії - два абстрактних
- 7. Класи байтових потоків
- 8. Класи символьних потоків Символьні потоки визначені у двох ієрархіях класів. Наверху цієї ієрархії два абстрактних класу:
- 9. Класи символьних потоків
- 10. Попередньо визначені потоки Всі програми Java автоматично імпортують пакет java.lang. Цей пакет визначає клас з ім'ям
- 11. Зчитування консольного вводу Консольний введення в Java виконується за допомогою зчитування з об'єкта System.in. Щоб отримати
- 12. Зчитування символів Для читання символу з BufferedReader використовуйте метод read (). Версія read (), яку ми
- 13. Зчитування символів //Використовує BufferedReader для читання символів з консолі, import java.io. *; class BRRead { public
- 14. Зчитування рядків Для читання рядка, що вводиться з клавіатури, використовуйте версію методу readLine (), який є
- 15. Зчитування рядків / / Крихітний редактор. import java.io.. *; class TinyEdit { public static void main
- 16. Запис консольного виводу Консольний висновок найлегше виконати за допомогою методів print () і println (). Ці
- 17. Запис консольного виводу / / Демонструє System.out.write. class WriteDemo { public static void main (String args
- 18. Клас PrintWriter Хоча використання об'єкта System.out для запису на консоль все ще допустимо в Java, його
- 19. Клас PrintWriter // Демонстрирує Printwriter. import java.io.*; public class PrintWriterDemo { public static void main(String args[j])
- 20. Зчитування і запис файлів Java забезпечує ряд класів і методів, які дозволяють читати і записувати файли.
- 21. Зчитування і запис файлів Після завершення роботи з файлом, його потрібно закрити, викликавши метод close ().
- 22. Зчитування і запис файлів / * Виведе на екран текстовий файл. При запуску програми вкажіть (в
- 23. Аплети Всі попередні приклади були Java-додатками. Проте програма - це тільки один тип Java-програм. Інший тип
- 24. Аплети import java. awt. *; Import java.applet.*; public class SimpleApplet extends Applet { public void paint(Graphics
- 25. Аплети Існує два способи виконання аплету: Виконання аплету Java-сумісному Web-браузером, типу Netscape Navigator або Microsoft Internet
- 26. Аплети Кілька ключових моментів. Аплети не потребують методі main (). Аплети повинні виконуватися програмою перегляду аплетів
- 27. Модифікатори transient і volatile Коли екземплярність мінлива оголошена як transient, то її значення не буде запомнено
- 28. Використання instanceof Іноді корисно розпізнавати тип об'єкта під час виконання. Наприклад, можна мати один потік виконання
- 29. Native-методи Іноді може виникнути бажання викликати підпрограму, яка написана на іншій мові, а не на Java.
- 30. Native-методи / / Простий приклад, який використовує native-метод, public class NativeDemo { int i; public static
- 32. Скачать презентацию
Основи вводу / виводу
Потоки
Байтові і символьні потоки
Класи байтових потоків
Попередньо визначені потоки
Зчитування
Основи вводу / виводу
Потоки
Байтові і символьні потоки
Класи байтових потоків
Попередньо визначені потоки
Зчитування
Зчитування символів
Зчитування рядків
Запис консольного виводу
Клас PrintWriter
Зчитування і запис файлів
Аплети
Модифікатори transient і volatile
Використання instanceof
Основи вводу / виводу
Реальні програми Java не засновані на консольних
Основи вводу / виводу
Реальні програми Java не засновані на консольних
Вони є графічними апплетами, які для взаємодії з користувачем покладаються на систему класів AWT (Abstract Window Toolkit, інструментарій абстрактного вікна) мови Java.
Підтримка Java для консольного вводу / виводу обмежена і не дуже зручна у використанні - навіть в простих прикладах програм.
Текстовий консольний вводу / виводу в дійсності не дуже важливий для Java-програмування.
Незважаючи на це, Java забезпечує сильну, гнучку підтримку по суті текстового вводу / виводу для файлів і мереж. Система вводу / виводу Java связна і несуперечлива.
Потоки
Java-програми виконують введення / виведення через потоки.
Потік є абстракцією, яка або
Потоки
Java-програми виконують введення / виведення через потоки. Потік є абстракцією, яка або
Потік пов'язується з фізичним пристроєм за допомогою системи введення / виводу Java (Java I / O system).
Всі потоки поводяться однаковим чином, хоча фактичні фізичні пристрої, з якими вони пов'язані, можуть сильно відрізнятися. Таким чином, одні й ті ж класи і методи вводу / виводу можна застосовувати до пристроїв будь-якого типу.
Потік введення може витягувати багато різних видів вхідних даних: з дискового файлу, з клавіатури або мережевого роз'єму. Потік виведення може звернутися до консолі, дискового файлу або мережному з'єднанню (сокету).
Завдяки потокам ваша програма виконує введення / виведення, не розуміючи різниці між клавіатурою і мережею.
Java реалізує потоки за допомогою ієрархії класів, визначених в пакеті java.io.
Байтові і символьні потоки
Java 2 визначає два типи потоків (точніше -
Байтові і символьні потоки
Java 2 визначає два типи потоків (точніше -
Байтові потоки надають зручні засоби для обробки введення і виведення байтів. Байтові потоки використовуються, наприклад, при читанні або запису даних в двійковому коді.
Символьні потоки надають зручні засоби для обробки введення і виведення символів. Вони використовують Unicode і тому можуть бути інтернаціоналізовані. Крім того, в деяких випадках символьні потоки більш ефективні, ніж байтові.
На самому низькому рівні введення / виведення все ще байтове. Символьно-орієнтовані потоки забезпечують зручні та ефективні засоби для обробки символів.
Класи байтових потоків
Байтові потоки визначаються у двох ієрархіях класів.
Наверху цієї ієрархії
Класи байтових потоків
Байтові потоки визначаються у двох ієрархіях класів.
Наверху цієї ієрархії
Кожен з цих абстрактних класів має кілька конкретних підкласів, які обробляють відмінності між різними пристроями, такими як дискові файли, мережеві з'єднання і навіть буфери пам'яті.
Абстрактні класи Inputstream і Outputstream визначають декілька ключових методів, які реалізуються іншими поточними класами. Два найбільш важливих-read () і write (), які, відповідно, читають і записують байти даних.
Обидва методи оголошені як абстрактні всередині класів inputstream і outputstream і перевизначаються похідними потоковими класами.
Класи байтових потоків
Класи байтових потоків
Класи символьних потоків
Символьні потоки визначені у двох ієрархіях класів. Наверху цієї
Класи символьних потоків
Символьні потоки визначені у двох ієрархіях класів. Наверху цієї
Вони обробляють потоки символів Unicode.
Абстрактні класи Reader і Writer визначають декілька ключових методів, які реалізуються іншими поточними класами.
Два найважливіших методу - read () і write (), які читають і записують символи даних, відповідно. Вони перевизначаються похідними потоковими класами.
Класи символьних потоків
Класи символьних потоків
Попередньо визначені потоки
Всі програми Java автоматично імпортують пакет java.lang.
Цей пакет визначає
Попередньо визначені потоки
Всі програми Java автоматично імпортують пакет java.lang.
Цей пакет визначає
Клас system містить також три зумовлені потокові змінні in, out і err. Ці поля оголошені в System зі специфікаторами public і static.
Об'єкт System.out називають потоком стандартного виводу. За умовчанням з ним пов'язана консоль.
На об'єкт System.in посилаються як на стандартне введення, який за замовчуванням пов'язаний з клавіатурою.
До об'єкту System.err звертаються як до стандартного потоку помилок, який за замовчуванням також пов'язаний з консоллю.
Проте ці потоки можуть бути перепризначені на будь-який сумісний пристрій вводу / виводу.
Зчитування консольного вводу
Консольний введення в Java виконується за допомогою зчитування з
Зчитування консольного вводу
Консольний введення в Java виконується за допомогою зчитування з
Щоб отримати символьний потік, який приєднаний до консолі, ви переносите ("упаковуєте") System.in в об'єкт типу BufferedReader.
Клас BufferedReader підтримує буферізірованний вхідний потік. Зазвичай використовується наступний його конструктор:
BufferedReader (Reader inputReader)
де inputReader - потік, який пов'язаний з створюються екземпляром класу BufferedReader.
Reader - абстрактний клас. Один з його конкретних підкласів - це InputStreamReader, який перетворює байти в символи.
Щоб отримати InputStreamReader-об'єкт, який пов'язаний з System.in, використовуйте наступний конструктор:
InputstreamReader (InputStream inputstream)
Оскільки System.in посилається на об'єкт типу inputstream, його можна використовувати як параметр inputstream.
Наступний рядок коду створює об'єкт класу BufferedReader, який пов'язаний з клавіатурою:
BufferedReader br = new BufferedReader (new InputstreamReader (System.in));
Після того як цей оператор виконається, об'єктна мінлива br стане символьним потоком, пов'язаним з консоллю через System.in.
Зчитування символів
Для читання символу з BufferedReader використовуйте метод read (). Версія
Зчитування символів
Для читання символу з BufferedReader використовуйте метод read (). Версія
int read () throws IOException
При кожному виклику read () читає символ з вхідного потоку і повертає його у вигляді цілочисельного значення. Коли read про стикається з кінцем потоку, то повертає -1. Як ви бачите, він може викидати виняток введення / виводу (I / O-виключення - IOException).
Зчитування символів
//Використовує BufferedReader для читання символів з консолі,
import java.io. *;
class BRRead
{
public
Зчитування символів
//Використовує BufferedReader для читання символів з консолі, import java.io. *; class BRRead { public
Зчитування рядків
Для читання рядка, що вводиться з клавіатури, використовуйте версію методу
Зчитування рядків
Для читання рядка, що вводиться з клавіатури, використовуйте версію методу
String readLine () throws IOException
Як видно, він повертає string-об'єкт.
Зчитування рядків
/ / Крихітний редактор.
import java.io.. *;
class TinyEdit {
public static void
Зчитування рядків
/ / Крихітний редактор. import java.io.. *; class TinyEdit { public static void
Запис консольного виводу
Консольний висновок найлегше виконати за допомогою методів print ()
Запис консольного виводу
Консольний висновок найлегше виконати за допомогою методів print ()
Ці методи визначені класом Printstream (який є типом (класом) об'єкта System.out).
Оскільки PrintStream - вихідний потік, похідний від OutputStream, онтакже реалізує метод нижнього рівня write ().
Найпростіша форма write (), визначена в Printstream, має вигляд:
void write (int byteval) throws lOException
Цей метод записує в файл байт, вказаний в параметрі byteval. Хоча byteval оголошений як ціле число, записуються лише молодші вісім бітів.
Запис консольного виводу
/ / Демонструє System.out.write.
class WriteDemo {
public static void main
Запис консольного виводу
/ / Демонструє System.out.write. class WriteDemo { public static void main
Ви не часто будете застосовувати write () для виконання консольного виводу (хоча це може бути корисно в деяких ситуаціях), тому що використовувати print () println () набагато легше.
Клас PrintWriter
Хоча використання об'єкта System.out для запису на консоль все ще
Клас PrintWriter
Хоча використання об'єкта System.out для запису на консоль все ще
Для реальних Java-програм для запису на консоль рекомендується працювати з потоком типу PrintWriter.
PrintWriter - це один з класів символьного введення / виведення. Використання подібного класу для консольного виводу полегшує інтернаціоналізацію вашої програми.
PrintWriter визначає кілька конструкторів. Ми будемо використовувати наступний:
PrintWriter (OutputStream OutputStream, boolean flushOnNewline)
Тут OutputStream - об'єкт типу OutputStream; flushOnNewline - булевський параметр, який використовується як засіб управління скиданням вихідного потоку в буфер виводу (на диск) кожен раз, коли виводиться символ newline (\ n). Якщо fiushOnNewilne - true, потік скидається автоматично, якщо - false, то не автоматично.
Printwriter підтримує методи print () і println () для всіх типів, включаючи Object. Щоб записувати на консоль, використовуючи клас Printwriter, створіть об'єкт System.out для вихідного потоку, і скидайте потік після кожного символу newline.
Наприклад, наступний рядок коду створює об'єкт типу Printwriter, який з'єднаний з консольним висновком:
PrintWriter pw = new Printwriter (System.out, true);
Клас PrintWriter
// Демонстрирує Printwriter.
import java.io.*;
public class PrintWriterDemo
{
public static void
Клас PrintWriter
// Демонстрирує Printwriter.
import java.io.*;
public class PrintWriterDemo
{
public static void
{
Printwriter pw = new Printwriter(System.out, true);
pw.printIn(«Це рядок:");
int i = -7;
pw.println(i);
double d = 4.5e-7;
pw.println(d);
}
Вивод цієї програми:
Це рядок:
-7
4.5Е-7
Зчитування і запис файлів
Java забезпечує ряд класів і методів, які дозволяють
Зчитування і запис файлів
Java забезпечує ряд класів і методів, які дозволяють
Для Java всі файли мають байтове структуру, a Java забезпечує методи для читання і запису байтів в файл.
Java дозволяє упаковувати байтовий файловий потік в символьно-орієнтований об'єкт. (Про це пізніше).
Для створення байтових потоків, пов'язаних з файлами, найчастіше за все використовуються два поточних класу - FilelnputStream і FileOutputStream.
FilelnputStream (String fileName) throws FileNotFoundException FileOutputStream (String fileName) throws FileNotFoundException
де fileName визначає ім'я файлу, який ви хочете відкрити.
Коли ви створюєте вхідний потік при відсутньому файлі, викидається виключення FileNotFoundException.
Для вихідних потоків, якщо файл не може бути створений, викидається таке ж виключення (FileNotFoundException).
Коли вихідний файл відкривається, будь-який файл, що існував раніше з тим же самим ім'ям, руйнується.
Зчитування і запис файлів
Після завершення роботи з файлом, його потрібно закрити,
Зчитування і запис файлів
Після завершення роботи з файлом, його потрібно закрити,
void close () throws IOException
Для читання файлу можна використовувати версію методу read (), що визначений в FilelnputStream.
int read () throws IOException
При кожному виклику він (метод) читає один байт з файлу і повертає його у формі цілочисельного значення. Коли read про зустрічає символ кінця файлу (eof), то повертає -1.
Зчитування і запис файлів
/ * Виведе на екран текстовий файл.
При запуску
Зчитування і запис файлів
/ * Виведе на екран текстовий файл. При запуску
import j ava.io.*;
class ShowFile
{
public static void main(String args[])
throws IOException {
int i ;
FilelnputStream fin;
try
{
fin = new FilelnputStream(args[0]);
}
catch(FileNotFoundException e)
{
System.out.println("Файл не знайден");
return;
}
catch(ArraylndexOutOfBoundsException e)
{
System.out.println(«Використовуйте: ShowFile ім'я_файлу");
return;
}
// зчитувати символи файлу, поки
// не зустрінеться символ EOF
Do
{
i = fin.read();
if(I != -1) System.out.print((char) i);
}
while (i != -1) ;
in.close ();
}
}
Аплети
Всі попередні приклади були Java-додатками.
Проте програма - це тільки один тип
Аплети
Всі попередні приклади були Java-додатками.
Проте програма - це тільки один тип
Інший тип програм представлений аплетом - невеликих додатків, які доступні на Internet-сервері, транспортуються по Internet, автоматично встановлюються і виконуються як частина Web-документа.
Після того, як аплет прибуває до клієнта, він має обмежений доступ до ресурсів системи, які використовує для створення довільного мультимедійного інтерфейсу користувача і виконання комплексних обчислень без ризику зараження вірусами або порушення цілісності даних.
Аплети відрізняються від додатків в декількох ключових областях.
Аплети
import java. awt. *;
Import java.applet.*;
public class SimpleApplet extends Applet
{
public void
Аплети
import java. awt. *;
Import java.applet.*;
public class SimpleApplet extends Applet
{
public void
g.drawstring ("A 'Simple Applet", 20, 20);
}
}
Аплет починається; з двох операторів import.
Перший імпортує AWT (Abstract Windowing Toolkit) - абстрактний віконний інтерфейс класи.
Наступний рядок у програмі оголошує клас SimpleApplet. Він повинен бути оголошений як public, тому що до нього необхідно забезпечити доступ з кодів, які знаходяться поза програмою.
Усередині SimpleApplet оголошений метод paint (). Цей метод визначено в AWT і повинен бути перевизначений аплетом. Метод paint про викликається кожного разу, коли аплет повинен відновлювати зображення свого висновку.
Метод paint () викликається також, коли аплет починає виконання.
Метод має один параметр типу Graphics, через який отримує графічний контекст, що описує графічне середовище виконання аплету.
Усередині paint () знаходиться звернення до методу drawstring (), який є членом класу Graphics. Цей метод виводить рядок, починаючи, з зазначених його аргументами (х, у)-координат у вікні аплету. Він має таку загальну форму:
void drawstring (String massage, int x, int y)
Аплети
Існує два способи виконання аплету:
Виконання аплету Java-сумісному Web-браузером, типу Netscape Navigator
Аплети
Існує два способи виконання аплету:
Виконання аплету Java-сумісному Web-браузером, типу Netscape Navigator
Використання програми перегляду аплетів, типу стандартної утиліти JDK appletviewer. Програма перегляду аплетів виконує аплет в його вікні.
Для виконання апплета в Web-браузері потрібно записати короткий текстовий файл у форматі мови HTML, який містить спеціальний тег
Аплети
Кілька ключових моментів.
Аплети не потребують методі main ().
Аплети повинні виконуватися програмою
Аплети
Кілька ключових моментів.
Аплети не потребують методі main ().
Аплети повинні виконуватися програмою
Користувацький ввід / вивід в аплетах не виконується за допомогою Java-класів поточного введення / виведення. Замість цього аплети використовують? Інтерфейс, забезпечений системою AWT.
Модифікатори transient і volatile
Коли екземплярність мінлива оголошена як transient, то її
Модифікатори transient і volatile
Коли екземплярність мінлива оголошена як transient, то її
class T { transient int a; / / не буде зберігатися int b; / / зберігатиметься }
Модифікатор volatile повідомляє компілятору, що змінна, модифікована з його допомогою, може бути несподівано змінена іншими частинами вашої програми.
Використання instanceof
Іноді корисно розпізнавати тип об'єкта під час виконання.
Наприклад, можна мати
Використання instanceof
Іноді корисно розпізнавати тип об'єкта під час виконання.
Наприклад, можна мати
В Java неприпустиме приведення викликає помилку часу виконання. Багато неприпустимих привидів можна перехопити під час компіляції. Однак операції приведення, пов'язані з типами об'єктів (тобто з ієрархіями класів), можуть виявитися неприпустимими і можуть бути виявлені тільки під час виконання. Операція instanceof має таку загальну форму:
object instanceof type
де object - екземпляр класу; type - клас (як тип). Якщо object-операнд має тип або його тип може бути приведений до типу, зазначений в type-операнді, то результат операції instanceof має значення true. Інакше, її результат - false. Таким чином, instanceof - це засіб, за допомогою якого ваша програма може отримати інформацію про тип об'єкта під час виконання.
Операція instanceof не потрібна для більшості програм, тому що, взагалі-то, ви знаєте тип об'єкта, з яким працюєте.
Native-методи
Іноді може виникнути бажання викликати підпрограму, яка написана на іншій мові,
Native-методи
Іноді може виникнути бажання викликати підпрограму, яка написана на іншій мові,
Як правило, така підпрограма існує як виконується код для CPU і середовища, в якій ви працюєте - тобто як "рідний" (native) код.
Однак через те, що Java-програми компілюються в байт-код, який потім інтерпретується (або компілюється "на льоту") виконавчою системою Java, здавалося б, неможливо викликати підпрограму native-коду зсередини Java-програми.
В Java існує ключове слово native, яке використовується для оголошення методів native-коду. Після оголошення ці методи можна викликати усередині Java-програми точно так само, як викликається будь-який інший метод Java.
Для оголошення native-методу потрібно випередити його заголовок модифікатором native, при цьому, однак, не слід визначати ніякого тіла. Наприклад:
public native int meth ();
Після оголошення native-методу, слід записати сам рідний метод і виконати досить складну процедуру для зв'язку його з кодом Java.
Більшість рідних методів записуються на С. Механізм, використовуваний для інтеграції С-коду з Java-програмою, називається JNI (Java Native Interface - native-інтерфейс Java).
Native-методи
/ / Простий приклад, який використовує native-метод,
public class NativeDemo {
int i;
public
Native-методи
/ / Простий приклад, який використовує native-метод,
public class NativeDemo {
int i;
public
{NativeDemo ob = new NativeDemo ();
ob.i = 10;
System.out.println ("Цей ob.i перед native-методом:" + ob.i);
ob.testO;/ / виклик native-метода
System.out.println ("Цей ob.i після native-методу:" + ob.i);}
/ / Оголосити native-метод public native
void test ();
/ / Завантажити DLL, який містить static-метод
static {
System.loadLibrary ("NativeDemo");}}
Зауважимо, що метод test () оголошений як native і не має тіла. Він буде реалізований на С.
Зверніть також увагу на блок static. Як пояснювалося раніше, static-блок виконується тільки один раз, коли програма починає виконуватися (або, більш точно, коли його клас вперше завантажується).
В даному випадку він використовується для завантаження DLL (Dynamic Link Library)-бібліотеки, яка містить native-реалізацію методу test ().
Бібліотека завантажується методом loadLibrary (), який є частиною класу system. Ось його загальна форма:
static void loadLibrary (String filename)
Тут filename - рядок, який специфікує ім'я файлу, що містить бібліотеку.