Vakiodataa Javaohjelmaan ?

Javakoodaaja80

Vakiodataa Javaohjelmaan - miten?

Mikä on paras tapa laittaavakiodataa javaohjelmaan - lähinnä tekstiä.

Kriteerinä tässä tilansäästö - jos (suomenkielistä) tekstiä on paljon, niin javan vakiomerkkijonojen käyttö vie 2 tavua/merkki.

UTF8 -koodauksella ä ja ö veisivät 2 tavua/merkki, kaikki muut 1 tavu/merkki.

Ympäristönä j2me ja matkapuhelin, eli tästä syystä tiedostosta lukeminen ei välttämättä ole järkevää tai edes mahdollista, vaan iso määrä vakiotekstiä pitäisi saada suoraan jar -tiedostoon (käytönnössä siis myös lähdekoodiin)

7

551

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • ((((((((((((((((((((

      --- ESIMERKKI ALKAA ---

      public class VakioTekstit {
         
         public static final String vakioJono= "Vakio dataa";
         
         public static void main(String[] args) {
            System.out.print(vakioJono);
         }
      }


      --- ESIMERKKI LOPPUU ---

      • Javakoodaaja80

        Merkkijonon "Vakio dataa" pituus on 11 merkkiä. Mutta koska java käyttää joko UTF16 -koodausta tai sitten ei edes tue merkkejä, joiden unicode -koodi > 65535, niin valitettavasti esittämälläsi tavalla tuo merkkijono vie tilaa 11*2=22 tavua.

        Tarkoitus oli saada se mahtumaan 11 tavuun.

        Tuo 16 bitin käyttö/merkki voisi olla perusteltua, jos esim. kirjoittaisin kiinalaisia katakana -merkkejä (joita on yli 256, joten ne eivät voi mahtua 1 tavuun/merkki).

        Mutta suomenkielen merkistö on sellainen, jossa käytettäviä merkkejä < 256 erilaista, joten 1 tavu/1 merkki pitäisi olla mahdollista.


      • ((((((((((((((((((
        Javakoodaaja80 kirjoitti:

        Merkkijonon "Vakio dataa" pituus on 11 merkkiä. Mutta koska java käyttää joko UTF16 -koodausta tai sitten ei edes tue merkkejä, joiden unicode -koodi > 65535, niin valitettavasti esittämälläsi tavalla tuo merkkijono vie tilaa 11*2=22 tavua.

        Tarkoitus oli saada se mahtumaan 11 tavuun.

        Tuo 16 bitin käyttö/merkki voisi olla perusteltua, jos esim. kirjoittaisin kiinalaisia katakana -merkkejä (joita on yli 256, joten ne eivät voi mahtua 1 tavuun/merkki).

        Mutta suomenkielen merkistö on sellainen, jossa käytettäviä merkkejä < 256 erilaista, joten 1 tavu/1 merkki pitäisi olla mahdollista.

        Kun kokeilin, niin kyllä tuo merkkijono class -tiedostoon 11 tavuna koodautui, eli 1 tavu/merkki. Jos merkkijonoon laittoi myös skandeja, niin vain skandit koodautuivat kahtena tavuna. Luulisi Javan käyttävän sisäisesti samaa koodausta mitä class tiedostostakin, eli niin että tuo vie muististakin sen 11 tavua.


      • ((((((((((((((((((
        (((((((((((((((((( kirjoitti:

        Kun kokeilin, niin kyllä tuo merkkijono class -tiedostoon 11 tavuna koodautui, eli 1 tavu/merkki. Jos merkkijonoon laittoi myös skandeja, niin vain skandit koodautuivat kahtena tavuna. Luulisi Javan käyttävän sisäisesti samaa koodausta mitä class tiedostostakin, eli niin että tuo vie muististakin sen 11 tavua.

        Tosiaan kun string olio ladataan muistiin, vie se yksi merkki sen jälkeen 2 tavua, koska stringin luokan sisällä on näköjään "private final char value[]" muuttuja merkkijonon säilytykseen.


      • javakoodaaja80
        (((((((((((((((((( kirjoitti:

        Tosiaan kun string olio ladataan muistiin, vie se yksi merkki sen jälkeen 2 tavua, koska stringin luokan sisällä on näköjään "private final char value[]" muuttuja merkkijonon säilytykseen.

        1. Siis onko todellakin niin, että ajoaikaista muistia javan merkkijono kuluttavat 2 tavua/merkki, mutta jar -tiedostossa vain 1 tavu/merkki, poikkeuksena esim. skandimerkit sielläkin 2 tavua/merkki ?

        Eli siis RAM -muistissa UTF-16 tai kiinteä 2 tavua/merkki mutta jar -tiedostossa UTF-8 ?


        JA ...

        2. Onko javan valmisluokkien (esim. string) lähdekoodi jossain saatavilla?

        Asensin joskus Netbeansin, mutta en ainakaan huomannut valmisluokkien lähdekoodeja.

        Enkö vain osannut katsoa oikeaan paikkaan vai pitääkö nuo ladata erikseen netistä ?


      • ((((((((((((((((((
        javakoodaaja80 kirjoitti:

        1. Siis onko todellakin niin, että ajoaikaista muistia javan merkkijono kuluttavat 2 tavua/merkki, mutta jar -tiedostossa vain 1 tavu/merkki, poikkeuksena esim. skandimerkit sielläkin 2 tavua/merkki ?

        Eli siis RAM -muistissa UTF-16 tai kiinteä 2 tavua/merkki mutta jar -tiedostossa UTF-8 ?


        JA ...

        2. Onko javan valmisluokkien (esim. string) lähdekoodi jossain saatavilla?

        Asensin joskus Netbeansin, mutta en ainakaan huomannut valmisluokkien lähdekoodeja.

        Enkö vain osannut katsoa oikeaan paikkaan vai pitääkö nuo ladata erikseen netistä ?

        1.

        Class -tiedostossa käytetään koodausta, jossa vakio merkkijonot koodataan hieman UTF-8 tapaisesti, eli 1 tavu per merkki. Näkyy kun katsoo HEX editorilla class -tiedostoa, alla kuitenkin tarkempi linkki aiheeseen:

        http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#7963

        Jos merkkijono ladataan muistiin char taulukkoon (kuten alla olevissa linkissä olevat String luokien toteutukset tekevät), niin silloin muistiin ladattuna merkkijono vie tilaa 2 tavua per merkki, ellei sitten virtuaalikone tee jotain optimointia.

        http://www.docjar.com/html/api/java/lang/String.java.html
        http://kickjava.com/src/java/lang/String.java.htm

        Sinänsä tuntuu järkevältä, että merkkijono vie muistiin ladattuna aina sen 2 tavua per merkki. Koska jos merkin pituus vaihtelisi muistissa, niin CharAt ja muiden merkin paikasta riippuvien metodien toteutus olisi varsin hankalaa, tai ne olisivat hitaita.


        2.

        En tiedä, googletin vain netistä, mahdollisia toteutuksia. Jotain open source juttuja Sunilla näyttää olevan:

        http://download.java.net/openjdk/jdk6/
        http://openjdk.java.net/


    • hemmoit

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Jens Ihlen (ex Kukka) poika todistaa oikeudessa

      10:49 "Välit ovat olemattomat" Minkälainen isäsi ja sinun välinen suhde on tällä hetkellä? "Minulla ei ole minkäännäkö
      Maailman menoa
      281
      10391
    2. K-kaupassa on mukava käydä, kun ei tarvitse katsella köyhiä

      vasemmistolaisia, joista monet myös varastavat. Mielellään maksaa vähän enemmän tuotteista K-kaupassa, jotka ovat paljon
      Maailman menoa
      245
      6036
    3. Suomeen ei kuulu ihmiset jotka ei halua kätellä toisia ihmisiä, koska tämä on vääräuskoinen

      Nainen joka ei halunnut kätellä Stubbia on selvästi ääripään muslimi, eli sitä sakkia josta niitä ongelmia koituu. Ulos
      Maailman menoa
      173
      5454
    4. PS:n Purra teki -JÄTTI-VELAT

      * * PS:n Purra teki -JÄTTI-VELAT - ! ja jätti MaksuHuolet -Kansan Maksettavaksi -! *
      Maailman menoa
      112
      5119
    5. Vain vasemmistolaiset rakennemuutokset pelastavat Suomen

      Kansaa on ankeutettu viimeiset 30+ vuotta porvarillisella minäminä-talouspolitiikalla, jossa tavalliselta kansalta on ot
      Maailman menoa
      19
      3335
    6. Persut huutaa taas: "kato! muslimi!"

      Persut on lyhyessä ajassa ajaneet läpi kaksi työntekijöiden oikeuksien heikennystä, joita se on aiemmin vastustanut. Pe
      Maailman menoa
      9
      2744
    7. Ootko sä nainen suuttunut

      jostain? Harmi jos tullut väärinkäsityksiä.
      Ikävä
      214
      2652
    8. Nainen, sanotaan että totuus tekee kipeää

      Ehkä mutta se voi olla myös se kaikkein kamalin asia kohdata. Kuplassa on turvallista, kun tietää vähemmän on helpompi.
      Ikävä
      20
      2499
    9. Menen nyt koisimaan

      Ja en ehkä palaa tänne. Asia on nyt loppuunkäsitelty ja totuus tuli ilmi
      Ikävä
      28
      2354
    10. Valtio lopettaa pienituloisten perheiden kylpylälomien tukemisen

      Pienituloiset suomalaiset ovat voineet vuosikymmenten ajan hakea tuettuja lomia terveydellisin, sosiaalisin ja taloudell
      Maailman menoa
      382
      2257
    Aihe