Programování v jazyce Java

V předešlém díle jsme skončili u interakcí appletu s okolím. U javových appletů ještě chvíli zůstaneme i dnešní...


V předešlém díle jsme skončili u interakcí appletu s okolím. U javových appletů
ještě chvíli zůstaneme i dnešním pokračování našeho seriálu.
Další použitelné funkce: AppletContext
Některé funkce, které můžeme v appletu využít, jsou implementovány v
prohlížeči. K vyvolání funkcí prohlížeče slouží rozhraní
java.applet.AppletContext. Toto rozhraní definuje několik užitečných funkcí,
které můžeme vyvolat, pokud nejprve získáme odkaz na prohlížeč pomocí volání
metody getAppletContext.Ukážeme si použití AppletContextu na příkladu volání
metody showDocument, která říká prohlížeči, že má zobrazit novou WWW stránku:
import java.awt.*;
import java.applet.*;
import java.net.*;
public class Zobraz extends Applet{ Button jdiButton = new Button("Jdi");
public void init() { add(jdiButton); } public boolean action(Event e, Object
what){ if (e.target == jdiButton) { AppletContext ac = getAppletContext(); try
{ ac.showDocument(new URL("http://java.sun.com")); } catch
(MalformedURLException x) {}; } return true; }
}
Při volání prohlížeče z appletu záleží také na prohlížeči, zda nám požadovanou
funkci umožní provést. Tento příklad byl otestován na prohlížeči Netscape, kde
fungoval, jak má. Pokud jej spustíme pomocí programu appletviewer, nestane se
po stisku tlačítka nic.
Omezení appletů z důvodů bezpečnosti
Protože jsou applety nahrávány jakou součást HTML dokumentů, je nutné, aby jim
nebylo umožněno vše, co může "obyčejný" program napsaný v Javě. Následuje popis
toho, co mají aplety obvykle zakázáno. Slovo obvykle je na místě, protože to,
co má applet zakázáno a co povoleno, určuje objekt třídy Security Manager,
který je součástí JVM pro applety je součástí prohlížeče, tj. omezení appletů
jsou z velké části dána politikou prohlížeče. Je na výrobci prohlížeče, aby se
postaral o zajištění uživatelů před případnými nepřátelskými applety.
Pokud se applet pokusí provést akci, kterou nemá povolenu, je vyvolána Security
Exception. Nyní tedy uveďme slibovaný seznam omezení činnosti appletů:
a)Applety nesmí pracovat se soubory na klientském počítači. Toto omezení bývá
nutné, aby applet nemohl uživateli smazat nebo jiným způsobem modifikovat
soubory. Některé prohlížeče (HotJava) umožňují práci se soubory pouze v
uživatelem stanoveném adresáři, jiné (Netscape) práci se soubory zakazují úplně.
b)Applety nemohou volat systémové nebo jiné dynamicky linkované knihovny.
Samostatná aplikace napsaná v Javě může používat native kód nahraný z dynamicky
linkovaných knihoven appletu se tato činnost zakazuje.
c)Applety nemohou u uživatele spouštět jiné programy.
d)Applety mohou navazovat síťová spojení pouze se serverem, ze kterého byly
nahrány.
e)Okna, která applet vytváří, bývají označena varováním.
Všechna tato omezení jsou nutná, protože při prohlížení WWW stránek se můžeme
dostat na stránku, v jejímž rámci se nám do počítače nahraje applet a v tomto
případě musíme mít jistotu, že se nám nemůže stát nic špatného.
Vstup a výstup
Java programy mohou k práci se vstupem a výstupem používat standardní knihovny
java.io a java.net (pro práci se sítí). V balíku java.io jsou hlavně obsaženy
tzv. proudy (Streams). Hlavními datovými typy jsou InputStream pro reprezentaci
vstupních proudů a OutputStream pro reprezentaci výstupu. Tyto základní třídy
mají řadu potomků, které reprezentují různé druhy vstupně-výstupních proudů.
Vstupní proudy (InputStream)
Třída InputStream je základní třídou pro práci se vstupem, který přichází
postupně jako posloupnost bytů. Základní metodou třídy InputStream je metoda
public int read()
která přečte jeden byte z otevřeného vstupního proudu. Pokud se zdroj bytů
uzavřel, vrací hodnotu -1. InputStream je abstraktní třída, tj. nemůžeme přímo
vytvořit instanci této třídy. Musíme použít jednoho z jejích potomků. Jedním z
potomků je třída FileInputStream, která slouží k načítání dat ze souborů. Pokud
chceme načíst obsah souboru, můžeme to provést následujícím způsobem: ..
FileInputStream fis = new FileInputStream("mujSoubor.txt"); int i = 0; while (i
!= -1) { i = fis.read(); ... // zpracuj i }
Tento fragment kódu by se nám však nepodařilo přeložit, protože použitý
konstruktor a metoda read mohou způsobovat výjimku IOException. Celý kód na
vypsání souboru na obrazovku tedy vypadá takto:
import java.io.*;
public class T { public static void main(String arg[]) { try { FileInputStream
fis = new FileInputStream("a.txt"); int i = 0; while (i != -1) { i =
fis.read(); System.out.write(i); } fis.close(); } catch (IOException x) { } }
}
Program otevře vstupní proud ze souboru a.txt a ve smyčce postupně načítá
jednotlivé byty a vypisuje je na standardní výstup.
Kromě třídy FileInputStream obsahuje balík ještě několik pomocných tříd potomků
InputStreamu, které vytvářejí vstupní proud z pole bytů (ByteArrayInputStream)
a z řetězce (StringBufferInputStream).
Výstupní proudy (OutputStream)
Třída OutputStream je základ pro proudy, které realizují zápis posloupnosti
bytů na nějaké zařízení. Prakticky všechny vstupní proudy mají svůj protějšek v
nějakém výstupním proudu a naopak.
Ukážeme si použití výstupního proudu FileOutput Stream pro vytvoření nového
souboru tento příklad vznikne rozšířením uvedeného příkladu o zápis do nového
výstupního proudu:
import java.io.*;
public class Kopie { public static void main(String arg[]) { try {
FileInputStream fis = new FileInputStream("a.txt"); FileOutputStream fos = new
FileOutputStream("b.txt"); int i = 0; while (i != -1) { i = fis.read(); if (i
!= -1) fos.write(i); } fis.close(); fos.close(); } catch (IOException x) { } }
}
Protějškem metody read je metoda write, která zapíše jeden byte do výstupního
proudu.
Filtry
Knihovna java.io obsahuje zvláštní potomky třídy InputStream a OutputStream
tzv. filtry. Vstupní filtr je potomkem třídy FilterInputStream a výstupní filtr
je potomkem třídy FilterOutputStream. Podobně jako vstupní a výstupní proudy,
vyskytují se filtry rovněž většinou ve dvojicích. Při použití filtru vždy
potřebujeme původní proud, na který náš filtr "nasadíme".
Začněme ukázkou dvojice nejběžnějších filtrů: DataOutpuStream a
DataInputStream. Použití těchto filtrů je analogické, tj. omezíme se na ukázku
DataOutputStreamu případ se vstupním proudem je velice podobný. Data
OutputStream slouží k zápisu všech základních datových typů do výstupního
proudu. Tento filtr tedy bere datové typy a vytváří jejich bytovou
reprezentaci, kterou můžeme posléze přečíst pomocí DataInputStreamu. V
následujícím příkladu zapíšeme několik údajů do souboru:
import java.io.*;
public class Filtr { public static void main(String arg[]) { try {
FileOutputStream fos = new FileOutputStream("d.dat"); // nasazení filtru
DataOutputStream dos = new DataOutputStream(fos); // a nyní zápis do souboru
dos.writeInt(25); dos.writeUTF("Ja jsem retezec"); // a zavreni dos.close(); }
catch (IOException x) { } }
}
Rozkódování dat, zapsaných pomocí DataOutputStreamu, je možné pomocí
příslušných volání variant metody read u DataInputStreamu.
DataInputStream a DataOutputStream nás zbavují nutnosti převádět primitivní
datové typy na posloupnost bytů, která je přenášena do vstupně-výstupního
proudu.
Dalším užitečným filtrem je třída PrintStream, která nám umožňuje používat
příkazy print a prinln. Tyto příkazy vypisují zadané argumenty tak, aby je bylo
možné číst. Podíváme-li se na typ proměnné System.out zjistíme, že je typu
PrintStream na standardní výstup tedy píšeme pomocí volání println.
Třída File
Balík java.io obsahuje další dvě třídy pro práci se souborovým systémem. Třída
File reprezentuje jméno souboru nebo adresáře na hostitelském operačním
systému. Umožňuje procházet adresářovou strukturou počítače, zjišťovat, zda
zadané soubory existují a jaká k nim máme práva.
Chceme-li použít objekt třídy File, nejprve jej vytvoříme zavoláním jednoho z
konstruktorů. Např. takto: File mujSoubor = new File("ahoj.txt");
Na takto vytvořený objekt můžeme zavolat některou z metod třídy File:
lexists() testuje, zda soubor reprezentovaný daným objektem existuje,
lcanRead(), canWrite() testuje naše práva k tomuto souboru,
lisDirectory(), isFile() tyto dvě metody zjišťují, zda se jedná o normální
soubor nebo o adresář,
llastModified(), length() tyto metody zjišťují některé vlastnosti daného
souboru.
Pokud objekt třídy File reprezentuje soubor, můžeme použít také následující
metody:
ldelete() smaže reprezentovaný soubor,
lrenameTo(File) přejmenuje soubor na jméno reprezentované jiným objektem třídy
File.
Pokud objekt reprezentuje platný adresář, můžeme zkusit následující metody:
llist() vrátí seznam všech souborů v daném adresáři jako pole řetězců,
lmkdir(),mkdirs() vytvoří nový adresář (druhá varianta i s případnou cestou).
8 0232 / pah









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.