Kirjoittaja: Metabolix
Kirjoitettu: 15.01.2013 – 15.01.2013
Tagit: ohjelmointitavat, teksti, koodi näytille, vinkki
Windowsin komentorivi on ikuinen murheen aiheuttaja, kun pitäisi tulostaa erikoismerkkejä kuten kirjaimia ä ja ö. Javassa ongelman voi kuitenkin ratkaista käyttämällä olioiden System.in ja System.out sijaan toisia olioita, jotka saa metodeilta System.console().reader() ja System.console().writer().
System.console().writer().printf("Syötä yksi sana: ").flush(); java.util.Scanner input = new java.util.Scanner(System.console().reader()); String sana = input.next(); System.console().writer().println("Kirjoitit: " + sana);
Toinen mahdollisuus on lukea metodilla System.console().readLine() ja tulostaa metodilla System.console().printf().
System.console().printf("Syötä rivi tekstiä: "); String rivi = System.console().readLine(); System.console().printf("Kirjoitit: %s\n", rivi);
Lisäksi metodilla System.console().readPassword() voi lukea salasanan niin, että sitä ei näytetä ruudulla.
try { char[] salasana = System.console().readPassword("Syötä salasana: "); byte[] tavut = new String(salasana).getBytes("UTF-8"); byte[] hash = java.security.MessageDigest.getInstance("MD5").digest(tavut); String hashTeksti = new java.math.BigInteger(1, hash).toString(16); System.console().printf("MD5: %s\n", hashTeksti); } catch (java.io.UnsupportedEncodingException e) { System.console().printf("Tämä Java ei tue UTF-8-enkoodausta.\n"); } catch (java.security.NoSuchAlgorithmException e) { System.console().printf("Tämä Java ei tue MD5-tiivisteitä.\n"); }
Kaikki edelliset koodit kuitenkin kaatuvat, jos Java-ohjelmaa ei käytetäkään tavalliseen tapaan vaan syöte tulee tiedostosta tai tuloste ohjataan tiedostoon. Onneksi ohjelman alussa voi tarkistaa tilanteen ja sijoittaa oikeat oliot muuttujiin. Samalla päästään eroon äskeisistä pitkistä riveistä.
import java.util.Scanner; import java.io.PrintWriter; public class koe { // Näillä olioilla luetaan ja kirjoitetaan. public static Scanner in; public static PrintWriter out; // Tässä lohkossa alustetaan edelliset muuttujat. static { try { // Yritetään hakea tässä vinkissä esitelty olio. in = new Scanner(System.console().reader()); } catch (NullPointerException e) { // Virhetilanteessa käytetään tavallista tapaa. in = new Scanner(System.in); } // Vastaava tulostuspuolelle. try { out = System.console().writer(); } catch (NullPointerException e) { out = new PrintWriter(System.out, true); } } public static void main(String[] args) { // Nyt kaikki on helppoa: out.println("Syötä rivi:"); String rivi = in.nextLine(); out.println("Kirjoitit näin: " + rivi); } }
Ratkaisu ei ole täydellinen mutta auttaa yksinkertaisten Windows-komentoriviohjelmien tekemisessä.