Tämä kurssi on jo päättynyt.

⌛⌛ Tekstihaku 7z-tiedostosta

Tehtävän palautus koostuu Maven-projektista. Sijoita pom.xml-tiedosto paikallisen tietovarastosi round7/sevenzipsearch-hakemistoon ja tee tähän hakemistoon src/main/java-niminen alihakemisto. Voit valita Java-luokkasi tai luokkiesi nimet vapaasti, mutta kunkin luokan pitää kuulua fi.tuni.prog3.sevenzipsearch-nimiseen pakkaukseen. Näin ollen tiedostojesi tulee olla hakemistossa round7/sevenzipsearch/src/main/java/fi/tuni/prog3/sevenzipsearch ja tiedostojen tulee alkaa lauseella package fi.tuni.prog3.sevenzipsearch;.

NetBeans osaa luoda tehtävässä pom.xml-tiedoston ja hakemistorakenteen automaattisesti, kun annat Maven-projektia luodessasi oikeat tiedot. Näet alempana groupId-, artifactId- ja version-elementeille annettavat arvot.

Materiaalien etätietovarastossa on saatavilla testiaineistoa (round7/sevenzipsearch-hakemisto).

Tässä tehtävässä kokeillaan 7z-pakkausformaatilla pakatun tiedoston käsittelyä Apache Commons Compress -kirjastolla. Tehtävässä tarvitaan tarkemmin ottaen seuraavat kaksi kirjastoa:

7z-tiedostot (Wikipedia-artikkeli) ovat sinänsä samantapaisia kuin zip-tiedostot, mutta ne käyttävät tehokkaampaa pakkausalgoritmia.

Tehtävänäsi on toteuttaa ohjelma, joka etsii annetun hakusanan esiintymiä annetun 7z-tiedoston sisältämistä tekstitiedostoista. Ohjelman tulee toimia tarkemmin ottaen seuraavasti:

  • Ohjelma tulostaa näytölle kehotteen File:, jonka jälkeen käyttäjältä luetaan tiedostonimi. Seuraavaksi tulostetaan näytölle kehote Query:, jonka jälkeen käyttäjältä luetaan haettava sana. Tämän jälkeen tulostetaan vielä tyhjä rivi.

  • Ohjelma selaa käyttäjän antaman 7z-tiedoston sisältämät tiedostot läpi ja suorittaa hakusanahaun kussakin löytämässään tekstitiedostossa.

    • Tiedosto päätellään tekstitiedostoksi sen nimen päätteen perusteella: haku suoritetaan, jos ja vain jos tiedoston nimen loppu on “.txt”.

    • Kunkin haun alussa tulostetaan aina tiedoston nimi ruudulle.

    • Kunkin haun lopuksi tulostetaan aina yksi ylimääräinen rivinvaihto.

  • Sanahaun suorittaminen:

    • Tiedostoa luetaan rivi kerrallaan, ja kultakin riviltä etsitään kaikki hakusanan esiintymät kirjainkoosta riippumatta.

    • Jos yksikin esiintymä löytyy, kyseinen rivi tulostetaan ruudulle muodossa “rivinumero: rivi”, missä rivinumero on kyseisen rivin rivinumero (tiedoston ensimmäisen rivin numero on 1) ja rivi on kyseinen rivi esitettynä sellaisessa muodossa, että kaikki hakusanan esiintymät on muunnettu käyttämään isoja kirjaimia.

Annetut mallitulosteet selventävät tulosteen muotoa.

Automaattiset sekä alla kuvatut testit olettavat, että teet projektitiedostoosi pom.xml seuraavat määritykset:

  • groupId-elementin arvo on fi.tuni.prog3.

  • artifactId-elementin arvo on sevenzipsearch.

  • version-elementin arvo on 1.0.

  • maven.compiler.source ja maven.compiler.target -elementtien arvo on 17 tai pienempi. Tarkistimella on asennettuna Java 17, joten tätä uudempaa versiota ei voi käyttää.

  • Onejar-liitännäisen määritys, jonka mainClass-elementti viittaa ohjelmasi pääluokkaan, jonka saat tässä tehtävässä nimetä vapaasti. Jos pääluokkasi on nimeltään esimerkiksi SevenZipSearch, on elementin arvo fi.tuni.prog3.sevenzipsearch.SevenZipSearch.

Vinkki: Heikki Hyyrön koodausdemovideo luvussa 7.2.

HUOM! Älä luo useita standardisyötettä (System.in) käyttäviä Scanner-olioita ratkaisussasi! Luo ohjelman alussa yksi standardisyötettä lukeva Scanner-olio, ja käytä tätä samaa oliota koko ohjelman suorituksen ajan. Ainoastaan ensimmäinen standardisyötteeseen liitetty Scanner-olio saa syötettä. Sama pätee myös jos käytät esim. InputStreamReader-luokkaa syötteen lukemiseen.

Toteutuksen testaus

Voit testata ohjelmaasi testiaineistojen java.7z ja Dracula.7z sekä mallitulostetiedostojen output1.txt, output2.txt ja output3.txt avulla. Ohjelmasi löytää testitiedostot helpoiten, kun ne ovat alkuperäisessä paikassaan round7/sevenzipsearch-hakemistossa.

Tehtävää tehdessäsi kannattaa mahdollisesti tutkia 7z-tiedostojen java.7z ja Dracula.7z sisältöä. Monet käyttöjärjestelmät, esimerkiksi Ubuntu Linux, osaavat avata 7z-tiedostoja ilman erillistä ohjelmaa. Muussa tapauksessa voit käyttää jotain 7z-formaattia tukevaa pakkausohjelmaa. Varsin luonteva valinta lienee 7-zip (https://www.7-zip.org/), joka on valmiiksi asennettu yliopiston tietokoneille.

Käännä ohjelmasi tapaan mvn package ja suorita testit komennolla: java -jar target/sevenzipsearch-1.0.one-jar.jar projektin juurihakemistossa sevenzipsearch. Ensimmäisessä testissä tiedostonimi on java.7z ja hakusana Oracle, toisessa Dracula.7z ja under, kolmannessa Dracula.7z ja press. Näiden kolmen testin odotetut tulosteet on kuvattu tiedostoissa output1.txt, output2.txt ja output3.txt.

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.

Palautusta lähetetään...