/* Tiedosto: Listaa1.java Tekijä: Juha Peltomäki, 8.1998. Korjaus: 10.1999. Kirjasto syötteiden lukemisiin ja tulostamiseen. Kirjasto käsittelee sekä tiedostojen lukemisen tiedostosta tai jostain URl-osoitteesta. Kirjastosta on toteutettu myös tiedoston kopiointi ja tulostaminen. Lisäksi kirjastossa on toteutettu tiedon pakkaaminen ja purkaminen käyttäen ZIP-koodausta. Luokan Metodit: * tiedosto_mjonoksi() * URLista_mjonoksi() * tallenna_tiedostoon() * kopioi_tiedosto() * pakkaa_tiedostot() * pura_ZIP() */ import java.io.*; import java.util.zip.*; import java.util.Vector; import java.net.*; class Tiedosto { // Puskurin koko. Käytetään tiedostoon kirjoittamisessa public static final int PUSKURI_KOKO = 128; public static final int EOF = -1; /*********************************************************************/ // palauttaa tiedoston merkkijonona public String tiedosto_mjonoksi(String nimi) throws FileNotFoundException, IOException { String luettu_rivi; String tulos = ""; FileInputStream tied_virta = new FileInputStream(new File(nimi)); BufferedReader syote = new BufferedReader(new InputStreamReader(tied_virta)); while (( luettu_rivi = syote.readLine()) != null) tulos += luettu_rivi + "\n"; syote.close(); tied_virta.close(); return tulos; } /*********************************************************************/ // Lukee tiedoston parametrinä tuodusta URL-osoitteesta. // Paikallinen tiedosto, file: -protokolla, // Etätiedosto: -http: -protokolla. public String URLista_mjonoksi(String osoite) throws MalformedURLException, IOException { String luettu_rivi = ""; String tulos = ""; URL lahde = new URL(osoite); InputStream tied_virta = lahde.openStream(); BufferedReader syote = new BufferedReader( new InputStreamReader(tied_virta)); while (( luettu_rivi = syote.readLine()) != null) tulos += luettu_rivi + "\n"; syote.close(); tied_virta.close(); return tulos; } /*********************************************************************/ // Tallentaa parametrinä tuodut merkkijonot tiedostoon // käyttäen FileOutputStream-luokan oliota. public void tallenna_tiedostoon(String nimi, Vector merkkijonot) throws IOException { FileOutputStream tulos; File t = new File(nimi); // Jos tiedosto on olemassa, liitetään sen perään. if (t.exists() && t.canRead()) tulos = new FileOutputStream(nimi, true); // Muuten luodaan uusi. else tulos = new FileOutputStream(nimi); PrintWriter tulostus = new PrintWriter(tulos, true); for (int i=0; i < merkkijonot.size(); i++) tulostus.println(((String)merkkijonot.elementAt(i))); tulos.close(); } /*********************************************************************/ // TIedosto kopioidaan tavu kerrallaan käyttäen FIleInputStream ja // FileOutputStream-luokkien olioita. public void kopioi_tiedosto(String tiedosto1, String tiedosto2) throws IOException { byte puskuri[] = new byte[PUSKURI_KOKO]; FileInputStream lahde = new FileInputStream(new File(tiedosto1)); FileOutputStream kohde = new FileOutputStream(new File(tiedosto2)); int pituus = 0; while ((pituus=lahde.read(puskuri)) != EOF) { kohde.write(puskuri, 0, pituus); } lahde.close(); kohde.close(); } /*********************************************************************/ public void pakkaa_ZIPiksi(String nimi, Vector tiedostot) throws IOException { byte puskuri[] = new byte[PUSKURI_KOKO]; FileOutputStream pak_os = new FileOutputStream(nimi); ZipOutputStream pakkaus = new ZipOutputStream(pak_os); for (int i=0; i < tiedostot.size(); i++) { FileInputStream syote = new FileInputStream((String)tiedostot.elementAt(i)); ZipEntry uusi = new ZipEntry(((String)tiedostot.elementAt(i)).replace(File.separatorChar,'/')); pakkaus.putNextEntry(uusi); int pituus = 0; while ((pituus = syote.read(puskuri)) != EOF) { pakkaus.write(puskuri, 0, pituus); } syote.close(); pakkaus.closeEntry(); System.out.println("Alkuperäinen: " + uusi.getSize() + " tavua. "); System.out.println("Pakattu: " + uusi.getCompressedSize() + " tavua."); } // lopullinen sulkeminen pakkaus.close(); } /********************************************************************/ public void pura_ZIP(String nimi) throws IOException { FileInputStream syote_tied = new FileInputStream(nimi); ZipInputStream zip_tied = new ZipInputStream(syote_tied); byte puskuri[] = new byte[PUSKURI_KOKO]; ZipEntry purettava; for (purettava = zip_tied.getNextEntry(); purettava != null; purettava = zip_tied.getNextEntry()) { FileOutputStream purku_virta = new FileOutputStream(purettava.getName()); int tavuja = 0; while ((tavuja = zip_tied.read(puskuri, 0, puskuri.length)) != EOF) purku_virta.write(puskuri, 0, tavuja); purku_virta.close(); zip_tied.closeEntry(); } zip_tied.close(); } } /********************************************************************/ public class TiedostoKasitt { public static void main (String args[] ) { try { String url = "file:/E:/teknolit/Javakirja/romppu/luku4/3InputOutput/TiedostoLuokka/Testi1.txt"; Tiedosto f = new Tiedosto(); for (int i=0; i < args.length; i++) { String mj1 = f.tiedosto_mjonoksi(args[i]); System.out.print(mj1); f.kopioi_tiedosto(args[i], args[i]+".vara"); String mj2 = f.URLista_mjonoksi(url); System.out.print(mj2); Vector v = new Vector(); v.addElement("Tämä on 1. rivi"); v.addElement("Tämä on 2. rivi"); v.addElement("Tämä on 3. rivi"); f.tallenna_tiedostoon("tulostettu.txt", v); } } catch (Exception e) { e.printStackTrace(); } // System.out.PrintStream(); /* // Esimerkki tiedostojen pakkaamisesta Vector v = new Vector(); v.addElement((String)"testi1.txt.vara"); v.addElement((String)"testi2.txt.vara"); v.addElement((String)"testi3.txt.vara"); f.pakkaa_ZIPiksi("testi.zip", v); f.pura_ZIP("testi.zip"); */ } }