Sprievodca po I / O v Groovy

1. Úvod

Aj keď v Groovy môžeme pracovať s I / O rovnako ako v Jave, Groovy rozširuje I / O funkcionalitu Javy o množstvo pomocných metód.

V tomto výučbe sa pozrieme na čítanie a zápis súborov, prechádzanie súborovými systémami a serializáciu údajov a objektov pomocou programu Groovy's Súbor rozširovacie metódy.

Ak je to možné, prepojíme odkazy na naše príslušné články o Jave, aby sme ich mohli ľahko porovnať s ekvivalentom Java.

2. Čítanie súborov

Groovy pridáva pohodlnú funkcionalitu pre čítanie súborov vo forme eachLine metódy, metódy na získanie BufferedReaders a InputStreams a spôsoby, ako získať všetky údaje súboru pomocou jedného riadku kódu.

Java 7 a Java 8 majú podobnú podporu pre čítanie súborov v prostredí Java.

2.1. Čítanie s eachLine

Pri práci s textovými súbormi musíme často prečítať každý riadok a spracovať ho. Groovy poskytuje pohodlné rozšírenie do java.io.Súbor s eachLine metóda:

def lines = [] nový súbor ('src / main / resources / ioInput.txt'). eachLine {line -> lines.add (line)}

Uzávierka bola poskytnutá eachLine má tiež užitočné voliteľné číslo riadku. Použime číslo riadku na získanie iba konkrétnych riadkov zo súboru:

def lineNoRange = 2..4 def lines = [] nový súbor ('src / main / resources / ioInput.txt'). eachLine {line, lineNo -> if (lineNoRange.contains (lineNo)) {lines.add (line )}}

Číslovanie riadkov sa predvolene začína na jednej. Môžeme poskytnúť hodnotu, ktorá sa má použiť ako číslo prvého riadku, a to tak, že ju odovzdáme ako prvý parameter do eachLine metóda.

Začnime čísla riadkov od nuly:

nový súbor ('src / main / resources / ioInput.txt'). eachLine (0, {line, lineNo -> if (lineNoRange.contains (lineNo)) {lines.add (line)}})

Ak je hodená výnimka eachLine, Groovy zaisťuje, aby bol súborový zdroj zatvorený. Podobne ako a vyskúšajte zdroje alebo a skús-konečne v Jave.

2.2. Čítanie pomocou aplikácie Reader

Môžeme tiež ľahko získať a BufferedReader z Groovy Súbor objekt. Môžeme použiť withReader získať a BufferedReader do objektu súboru a odovzdať ho uzávere:

def actualCount = 0 nový súbor ('src / main / resources / ioInput.txt'). withReader {reader -> while (reader.readLine ()) {actualCount ++}}

Ako s eachLine, withReader metóda automaticky zavrie zdroj, keď je vyvolaná výnimka.

Niekedy by sme mohli chcieť mať BufferedReader objekt k dispozícii. Napríklad by sme mohli plánovať zavolať metódu, ktorá berie jednu ako parameter. Môžeme použiť novýČítačka metóda pre toto:

def outputPath = 'src / main / resources / ioOut.txt' def reader = new File ('src / main / resources / ioInput.txt'). newReader () new File (outputPath) .append (reader) reader.close ( )

Na rozdiel od iných metód, ktoré sme doteraz skúmali, sme zodpovední za uzavretie BufferedReader zdroj, keď získame a VyrovnanéČitateľ tadiaľto.

2.3. Čítanie s InputStreams

Podobný withReader a novýČítačka, Groovy tiež poskytuje metódy na ľahkú prácu s nimi InputStreams. Aj keď dokážeme čítať text s InputStreams a Groovy pre to dokonca pridávajú funkcie, InputStreams sa najčastejšie používajú pre binárne dáta.

Poďme použiť withInputStream zložiť an InputStream do uzávierky a prečítať v bytoch:

byte [] data = [] nový súbor ("src / main / resources / binaryExample.jpg"). withInputStream {stream -> data = stream.getBytes ()}

Ak potrebujeme mať InputStream objekt môžeme získať pomocou newInputStream:

def outputPath = 'src / main / resources / binaryOut.jpg' def is = new File ('src / main / resources / binaryExample.jpg'). newInputStream () new File (outputPath) .append (is) is.close ( )

Rovnako ako v prípade BufferedReader, musíme uzavrieť svoje InputStream zdroje sami, keď používame newInputStream, ale nie pri použití withInputStream.

2.4. Čítanie iných spôsobov

Na záver si prečítajme niekoľko metód, ktoré má Groovy na získanie všetkých údajov súboru v jednom príkaze.

Ak chceme riadky nášho súboru v a Zoznam, môžeme použiť zbierať s iterátorom to prešiel k uzávere:

def actualList = nový súbor ('src / main / resources / ioInput.txt'). collect {it}

Ak chcete dostať riadky nášho súboru do poľa Struny, môžeme použiť ako reťazec []:

def actualArray = nový súbor ('src / main / resources / ioInput.txt') ako reťazec []

Pri krátkych súboroch môžeme dostať celý obsah do a String použitím text:

def actualString = nový súbor ('src / main / resources / ioInput.txt'). text

A keď pracujete s binárnymi súbormi, je tu bajtov metóda:

def obsah = nový súbor ('src / main / resources / binaryExample.jpg'). bajty

3. Písanie súborov

Predtým, ako začneme písať do súborov, nastavme text, ktorý budeme odosielať:

def outputLines = ['Riadok jeden príkladu výstupu', 'Riadok dva príkladu výstupu', 'Riadok tri príkladu výstupu']

3.1. Písanie so Writerom

Rovnako ako pri čítaní súboru, môžeme tiež ľahko získať a BufferedWriter z a Súbor objekt.

Poďme použiť withWriter získať a BufferedWriter a odovzdajte ho uzávere:

def outputFileName = 'src / main / resources / ioOutput.txt' nový súbor (outputFileName) .withWriter {Writer -> outputLines.each {line -> writer.writeLine line}}

Použitím withReader zavrie zdroj, ak by nastala výnimka.

Groovy má tiež spôsob získavania BufferedWriter objekt. Poďme a BufferedWriter použitím newWriter:

def outputFileName = 'src / main / resources / ioOutput.txt' def writer = nový File (outputFileName) .newWriter () outputLines.forEach {line -> writer.writeLine line} writer.flush () writer.close ()

Sme zodpovední za preplachovanie a zatváranie našich BufferedWriter objekt, keď používame newWriter.

3.2. Zápis s výstupnými tokmi

Ak vypíšeme binárne údaje, môžeme dostať OutputStream pomocou buď withOutputStream alebo newOutputStream.

Poďme napísať nejaké bajty do súboru pomocou withOutputStream:

byte [] outBytes = [44, 88, 22] nový súbor (outputFileName) .withOutputStream {stream -> stream.write (outBytes)}

Poďme OutputStream objekt s newOutputStream a použite ho na napísanie niekoľkých bajtov:

byte [] outBytes = [44, 88, 22] def os = nový súbor (outputFileName) .newOutputStream () os.write (outBytes) os.close ()

Podobne ako InputStream, BufferedReadera BufferedWriter, sme zodpovední za uzavretie OutputStream sami seba, keď používame newOutputStream.

3.3. Píše sa s operátorom <<

Pretože písanie textu do súborov je také bežné, << operátor poskytuje túto funkciu priamo.

Použime << operátor napísať niekoľko jednoduchých riadkov textu:

def ln = System.getProperty ('line.separator') def outputFileName = 'src / main / resources / ioOutput.txt' nový súbor (outputFileName) << "Riadok jeden z príkladov výstupu $ {ln}" + "Riadok dva z príklad výstupu $ {ln} tretí riadok príkladu výstupu "

3.4. Zápis binárnych údajov bajtmi

Už predtým v článku sme videli, že môžeme získať všetky bajty z binárneho súboru jednoduchým prístupom k súboru bajtov lúka.

Poďme binárne údaje zapísať rovnakým spôsobom:

def outputFileName = 'src / main / resources / ioBinaryOutput.bin' def outputFile = nový súbor (outputFileName) bajt [] outBytes = [44, 88, 22] outputFile.bytes = outBytes

4. Traverzovanie stromov súborov

Groovy nám poskytuje aj jednoduché spôsoby práce so stromami súborov. V tejto časti to urobíme s eachFile, každýDir a ich varianty a traverz metóda.

4.1. Zoznam súborov s eachFile

Vymenujme všetky súbory a adresáre v adresári, ktoré používajú eachFile:

nový súbor ('src / main / resources'). eachFile {file -> println file.name}

Ďalším bežným scenárom pri práci so súbormi je potreba filtrovať súbory podľa názvu súboru. Uveďme zoznam iba súborov, ktoré začínajú na „io“ a končia na „.txt“ použitím eachFileMatch a regulárny výraz:

new File ('src / main / resources'). eachFileMatch (~ / io. * \. txt /) {file -> println file.name}

The eachFile a eachFileMatch metódy iba vypíšu obsah adresára najvyššej úrovne. Groovy nám tiež umožňuje obmedziť to, čo eachFile metódy sa vracajú odovzdaním a Typ súboru k metódam. Možnosti sú AKÝKOĽVEK, SÚBORYa RIADITEĽSTVO.

Uveďme rekurzívne zoznam všetkých použitých súborov eachFileRecurse a poskytuje jej a Typ súboru z SÚBORY:

new File ('src / main'). eachFileRecurse (FileType.FILES) {file -> println "$ file.parent $ file.name"}

The eachFile metódy hod IllegalArgumentException ak im poskytneme cestu k súboru namiesto adresára.

Groovy tiež poskytuje každýDir metódy práce iba s adresármi. Môžeme použiť eachDir a jeho varianty na dosiahnutie toho istého ako pri použití eachFile s Typ súboru z RIADITEĽSTVO.

Uveďme rekurzívne zoznamy adresárov s eachFileRecurse:

new File ('src / main'). eachFileRecurse (FileType.DIRECTORIES) {file -> println "$ file.parent $ file.name"}

Teraz urobme to isté s eachDirRecurse:

new File ('src / main'). eachDirRecurse {dir -> println "$ dir.parent $ dir.name"}

4.2. Zoznam súborov s Traverse

Pre komplikovanejšie prípady použitia priechodu adresárom môžeme použiť znak traverz metóda. Funguje podobne ako eachFileRecurse ale poskytuje možnosť návratu FileVisitResult objekty na kontrolu spracovania.

Poďme použiť traverz na našom src / main adresár a preskočte spracovanie stromu pod groovy adresár:

new File ('src / main'). traverse {file -> if (file.directory && file.name == 'groovy') {FileVisitResult.SKIP_SUBTREE} else {println "$ file.parent - $ file.name"} }

5. Práca s údajmi a objektmi

5.1. Serializujúce primitívy

V Jave môžeme použiť DataInputStream a DataOutputStream serializovať primitívne dátové polia. Groovy aj tu pridáva užitočné rozšírenia.

Nastavme niekoľko primitívnych údajov:

String message = 'Toto je serializovaný reťazec' int length = message.length () boolean valid = true

Teraz poďme serializovať naše údaje do súboru pomocou withDataOutputStream:

new File ('src / main / resources / ioData.txt'). withDataOutputStream {out -> out.writeUTF (message) out.writeInt (length) out.writeBoolean (valid)}

A prečítajte si to späť v použití withDataInputStream:

String loadedMessage = "" int loadedLength boolean loadedValid new File ('src / main / resources / ioData.txt'). WithDataInputStream {is -> loadedMessage = is.readUTF () loadedLength = is.readInt () loadedValid = is.readBoolean ( )}

Podobne ako ten druhý s * metódy, withDataOutputStream a withDataInputStream odovzdajte potok uzávere a uistite sa, že je správne uzavretý.

5.2. Serializácia objektov

Groovy tiež stavia na Java ObjectInputStream a ObjectOutputStream aby sme mohli ľahko serializovať implementované objekty Serializovateľné.

Najprv si zadefinujme triedu, ktorá implementuje Serializovateľné:

trieda Implementácia úloh Serializovateľné {Popis reťazca Dátum startDate Dátum dueDate int status}

Teraz vytvorme inštanciu Úloha ktoré môžeme serializovať do súboru:

Úloha task = new Task (description: 'Take out the trash', startDate: new Date (), status: 0)

S našim Úloha objekt v ruke, serializujme ho do súboru pomocou withObjectOutputStream:

nový súbor ('src / main / resources / ioSerializedObject.txt'). withObjectOutputStream {out -> out.writeObject (task)}

Na záver si prečítajme naše Úloha späť v používaní withObjectInputStream:

Úloha taskRead nový súbor ('src / main / resources / ioSerializedObject.txt'). WithObjectInputStream {is -> taskRead = is.readObject ()}

Metódy, ktoré sme použili, withObjectOutputStream a withObjectInputStream, odovzdajte prúd uzáveru a primerane sa postarajte o uzavretie zdrojov, rovnako ako pri ostatných s * metódy.

6. Záver

V tomto článku sme preskúmali funkčnosť, ktorú Groovy pridáva do existujúcich tried I / O súborov Java File. Túto funkcionalitu sme využili na čítanie a zápis súborov, prácu s adresárovými štruktúrami a na serializáciu údajov a objektov.

Dotkli sme sa iba niekoľkých pomocných metód, takže stojí za to prehĺbiť sa v dokumentácii Groovy a zistiť, čo ešte pridáva k funkcii I / O Java.

Vzorový kód je k dispozícii na serveri GitHub.


$config[zx-auto] not found$config[zx-overlay] not found