Tolong pilih kategori sesuai, jenis posting (pertanyaan atau bukan) dan sertakan tag/topik yang sesuai misal komputer, php, mysql, dll.
Promosi atau posting tidak pada tempatnya akan kami hapus.
Klik link berikut untuk informasi cara menyisipkan kode program supaya tampil rapi dan terformat dengan baik di diskusiweb.com: http://www.diskusiweb.com/discussion/50415/cara-menyisipkan-kode-program-di-diskusiweb-com

Baca cara posting gambar/image di post Anda: http://www.diskusiweb.com/discussion/47345/cara-menyisipkan-menyertakan-image-pada-posting/p1

[TANYA] Bagaimana baca file text agar tidak dibaca berulang2

salam kenal master java :)

saya punya data biner spt ini :

01110000000000101010010110011110011xxxxx1010101110xxxxxxxxxxxxxxxx1000010000101110000000000101010010011111110110011110011


data biner tersebut dipotong2 mulai dari 6 sampai 16 bit, untuk di cocokkan dengan bit biner yg ada di dalam tabel (textfile) spt dibawah ini :

0; 100011; 6; 1.7; 35
1; 101000; 6; 1.59301468774159; 40
-1; 101001; 6; 1.59301468774159; 41
2; 101111; 6; 1.51809563528226; 47
-2; 101110; 6; 1.51809563528226; 46
3; 110011; 6; 1.45367327552484; 51
-3; 110100; 6; 1.45367327552484; 52
...
...
-348; 1010111100011000; 16; 0.00152344640436903; 44824
349; 1010111100011111; 16; 0.00149907431839313; 44831
-349; 1010111100011110; 16; 0.00149907431839313; 44830
350; 1100001000010101; 16; 0.00147510576591937; 49685
-350; 1100001000010100; 16; 0.00147510576591937; 49684


saya sudah bisa memotong dan membandingkan data dlm tabel. utk baca tabel menggunakan FileInputStream. tapi ada error spt ini :

Exception in thread "main" java.lang.StackOverflowError
    at java.io.InputStream.<init>(InputStream.java:45)
    at java.io.FileInputStream.<init>(FileInputStream.java:123)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)
at Comp.LoselessDecode_x.HuffmanTable(LoselessDecode_x.java:76)


code yg error pd baris 76 >>>

public static void HuffmanTable(int looking, long lengthD, String match2split) throws FileNotFoundException, IOException {
        FileInputStream in  = new FileInputStream("D:\\HuffmanTableDIFF.txt");
        BufferedReader br   = new BufferedReader(new InputStreamReader(in));
        String  strLine, MatcherHuff, MatcherBin;
        Matcher matchHuff, matchBin;

kira2 error tsb disebabkan apa...? asumsi saya karena pembacaan textfile yg berulang2.
kira2metode terbaik apa yg bisa saya gunakan agar filetext tersebut tidak dibaca berulang2...?

tks
Tagged:

Comments

  • edited May 2015
    FileInputStream in  = new FileInputStream("D:\\HuffmanTableDIFF.txt");

    kalo bisa letakan di posisi global
    baca isi file juga di luar fungsi
    cukup jalan sekali
    toh yg dibaca itu-itu juga

    kalo dipake di dalam fungsi langsung pake variable yg sudah ada isinya

    tapi ini nya juga beresiko

    BufferedReader br   = new BufferedReader(new InputStreamReader(in));

    br selalu diberi alokasi alamat memori baru
    gw kagak tau yg lama elo hapus atau tidak
    kalo tidak, itu jadi alamat memori yg ada isinya tapi tidak ber-tuan dan kagak bisa dipake karena belum dibebaskan
  • untk FileInputStream in sudah diposisikan di global dan br di close ketika selesai scanning. tapi error nya masih sama pak @anjinglaut

    in.close();
    br.close();

    btw tks responnya
  • edited May 2015
    bukan di .close()

    .close() itu hubungannya dgn baca / tulis file

    error elo hubungannya dgn penggunaan memori : stack overflow

    gw kagak tau dispose isi memori pake method apa
    coba elo cari rujukan

    kalo di delphi sejenis dgn : FreeMem(pointervar);
    kalo di C++ sejenis : delete pointervar;
    di C sejenis dgn : free(pointervar);
  • edited May 2015
    kira2 ada metode utk READ yg kemungkinan kecil terjadi stckoverflow...?

    saya convert tabel jadi array malah jadi lama baca nya

    sudah nyoba pake scanner, fileinputstrean, datainputstream, semua overflow :(
  • coba pake class  Scanner, masih kena StackOverflowError?
  • hambok gitu ... master nya java yg turun tangan ;))

    awas kalo kabur lagi :))
  • scanner nya udh dibuat dlm kelas berbeda, masih error mas @newuser.
    bisa compare antara bit biner dgn bit table, tpi stelah kurang lebih 200an data, overflows terjadi. btw tks responnya :)

    pak @anjinglaut mungkin ada advice lain...?

    kalau pakai array, utk data ukuran 6kB terlalu lama, saya coba running 10menit gak kelar2, tpi proses gk ada error :|
  • edited May 2015
    kalo java ... suwer dah, kalo newuser yg jawab, kagak perlu gw
    itu salah satu master java di dweb

    gw blas belum pernah koding java sekali pun, kecuali bikin "hello world" :))
    gw kalo jawab cuma pake logika dan experience di bahasa pemrograman lain yg base on C/C++

    gimana kalo coba pake database ?
    sqlite mungkin, yg mini
  • bisa pakai mysql pak @anjinglaut :D mungkin ada yg lain selain pake database...?

    bisa bantu kasih clue atau solusi pak @. @buaya @babi @Goku
  • pak boo lebay ah  :D

    Sebenarnya mo pake FileInputStream atau Scanner sama aja karena masalah nya bukan di class nya.
    Tapi karena penggunaan fungsi rekursif, yg nyebabin object dipake berulang2 dan kemungkinan object digunakan oleh yang lainnya juga. 

    Btw dah coba pake ObjectInputStream?

    FileInputStream in  = new FileInputStream("D:\\HuffmanTableDIFF.txt");
    BufferedReader br   = new BufferedReader(new InputStreamReader(in));

    Jangan lupa di close juga ObjectInputStream setelah baca file selesai, 
    Sekali lagi gak bisa bantu banyak, karena logika rekursivenya kan di source code ente,
     hanya ente dan Tuhan yang tau dah ;))
  • edited May 2015
    saya cobain dulu pak... :)

    btw pak @newuser == pak @boo toh...?
  • weh pak boo itu mbahnya ependi, saya sih masih muda  :)>-
  • mana yg ngaku muda ?
    tinggal pilih, mau dikirim ke TL, taman KB atau stasiun tugu ? =))
  • kyknya pada alumni jogja nih:D
    klo iya, sama donk
  • ini mbak inti bukan?
  • saya mas2 kok pak :D
  • edited May 2015
    saya mas2 kok pak :D
    dan elo juga salah ... newuser itu mbak-mbak ... =))
  • ahhhh serius pak @boo ...? :|

    btw saya nyobain pakai lookup tables (HashMap), errornya sama saja. setelah beberapa ratus baris data yg dibaca dan dibandingkan dengan isi table lookup.

    Exception in thread "main" java.lang.StackOverflowError
        at java.io.InputStream.<init>(InputStream.java:45)
        at java.io.FileInputStream.<init>(FileInputStream.java:123)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)

    kalau pakai ObjectInputStream >>>

    File file = new File("Huffman Table DIFF.txt"); 
    FileInputStream f = new FileInputStream(file); 
    ObjectInputStream s = new ObjectInputStream(f);

    baris ke-3 saja sudah error :(

    Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 613A2030
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:806)
        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)


    613A2030(Hexa) =  a: 0.017; (ASCI) = header table

    ada clue lainnya...?
  • btw ini baca file nya gimana sih?

    1. baca file => ambil semua isinya => potong => bandingkan
    2. baca file  => ambil baris pertama => potong => bandingkan 

    yg mana?
  • edited May 2015
    gini mbak @newuser,

    baca file sampai selesai >> simpan di buffer >> ambil x bit pertama dari buffer >> bandingkan >> loop

    jika ada/ sesuai dgn table  :  ambil file dari buffer - x bit pertama >> bandingkan >> loop

    jika tidak ada di table : ambil x+1 bit pertama dari buffer >> bandingkan >> loop

    bit yg dipotong/diambil (x)  itu mulai dari 6 sampai 16 (bit biner), looping gitu pak, sampai ketemu/tidak ketemu didalam table
    biy yg disimpan di buffer itu dlm bentuk biner, jumlahnya 100000++ :D
  • edited May 2015
    ppfffffffttttttttttttt ... =)) =)) =)) =)) =)) =)) =)) =)) =)) =)) =)) =))

    * muncrat dah kopi gw *
  • edited May 2015
    :D diketawain pak boo tuh  :-t 

    hmm 100000 mestinya belum kena StackOverflowError, 
    nanti ikut nyoba deh ;)
  • koding fungsi / method HuffmanTable elo sekarang kaya apa ?
    fungsi / method itu dipanggil dimana ?
  • edited May 2015
    maaf pak @newuser, @anjinglaut slow respon...

    utk cek tabel

    public static void Check (int looking, int lengthD, String data, HashMap map) throws IOException {
            String value = data.substring(0, lengthD);
            Object oCut  = value;
            if ( map.containsValue(oCut) ) {
                System.out.println( map.get(oCut) );

                data = data.substring(lengthD, data.length());
                Loop ( data, map );
            }
    }

    //LOOP
    public static void Loop(String loop, Map map) throws IOException {
            for (int D = 6; D <= 16; D++) {
                int toHuffman = Integer.parseInt(loop.substring(0, D), 2);
                Check(toHuffman, D, loop, map);                        
            }          
        }

    semua disatuin dalam kelas yg sama. tapi nyoba dibeda kelas sama saja error nya

  • edited May 2015
    what ?

    public static void Check (int looking, int lengthD, String data, HashMap map) throws IOException {
      ...
      if ( map.containsValue(oCut) ) {
        ...
        Loop ( data, map );
      }
    }


    public static void Loop(String loop, Map map) throws IOException {
      for (int D = 6; D <= 16; D++) {
        ...
        Check(toHuffman, D, loop, map);                       
      }         
    }

    itu fungsi saling panggil, gimana ceritanya ?
    ini mah kaya "duluan mana ayam ama telor"

    gimana kagak stack overflow

    saat suatu fungsi memanggil fungsi yg lain,
    "alamat" fungsi pemanggil berikut seluruh local variabel nya di dalam fungsi tsb
    bakal di push ke stack
    kemudian bakal di pop kalo fungsi yg dipanggil selesai di eksekusi

    lha kalo alurnya kaya begitu
    pantes aja stack nya penuh

    alurnya mas yg dibenerin

    jangan Loop dipanggil di dalam Check
    tapi return kan saja "data" nya
    tinggal nanti dicari alur Loop yg bener

    dan dalam pikiran gw, itu bukan loop for()
    tapi sejenis while()

    alurnya misal begini,
    sepenangkapan gw ...

    len = 6 ... elo start panjang pengambilan string mulai dari 6 char
    pos = 0 ... awal string
    strcut = '' ... ini penampung potongan string
    found = false ... flag penanda potongan string ditemukan atau tidak di table

    while(... pos < panjang string total ...) {
      while(... len <= 16 ... AND ... NOT found ...) {
        * ambil string mulai pos sepanjang len, tampung di strcut
        strcut = ...
        * panggil fungsi Check, bandingkan strcut dgn table
        found = Check(strcut)
        * return Check itu true kalo ditemukan, false kalo tidak ditemukan
        * kalo tidak ditemukan ...
        if(NOT found) {
          * len + 1, tambah terus sampai max 16 char
          len = len + 1
        }
      }
      if(found) {
        * kalo dipemeriksaan Check potongan string memang ditemukan, geser pos maju sepanjang len
        pos = pos + len
        * len dikembalikan ke 6
        len = 6
      }
      else {
        * error, karena potongan string kagak ditemukan di table, mulai dari panjang 6 - 16 char
        ERROR, potongan string tidak ditemukan di table
      }
    }

    itu alur yg semestinya dipake sepenangkapan gw



    gw kagak ngerti java
    tapi gw bisa baca alur, dan gw bisa C/C++
    C/C++ sama, kalo model alur elo, kemungkinan besar juga stack overflow
    alamat memori di push terus ke stack, tapi ntah kapan di pop nya
  • edited May 2015
    dijadiin 1 metode gitu maksudnya...?

    public static String Loop(String loop, HashMap map) throws IOException {
            int D; String value;
            for (D = 6; D <= 16; D++) {           
                value = loop.substring(0, D);
                Object oCut  = value;
                if ( map.containsValue(oCut) == true ) {
                    System.out.println( oCut );
                    loop = loop.substring(D, loop.length()); 
                }
            }
            return loop;
        }

  • dan fungsi Loop nya elo panggil dimana ? dan kaya apa ?
  • kyk yg di atas itu mas, nyobain alur yg di cont
    ohin masih bingung buat boolean found nya
  • jadi begini ???

    public static void Check (int looking, int lengthD, String data, HashMap map) throws IOException {
            String value = data.substring(0, lengthD);
            Object oCut  = value;
            if ( map.containsValue(oCut) ) {
                System.out.println( map.get(oCut) );

                data = data.substring(lengthD, data.length());
                Loop ( data, map );
            }
    }

    //LOOP
    public static String Loop(String loop, HashMap map) throws IOException {
            int D; String value;
            for (D = 6; D <= 16; D++) {          
                value = loop.substring(0, D);
                Object oCut  = value;
                if ( map.containsValue(oCut) == true ) {
                    System.out.println( oCut );
                    loop = loop.substring(D, loop.length());
                }
            }
            return loop;
        }



    kagak ada perubahan apa pun di Check ?

    lha itu elo return loop nya buat apa ?
    lha di Check cuma dipanggil kaya begini : Loop ( data, map );

    btw, alur elo itu sebenernya kaya apa to ?
    yg dipanggil pertama itu Check ? atau Loop ?

    proses decoding elo itu sebenernya kaya apa ?
    karena yg gw tangkap proses nya :
    - baca file
    - baca table decode
    - bandingkan per potongan isi file sampai habis yg sesuai dgn isi table

    artinya, yg dipanggil pertama itu Loop
    Check dipanggil di dalam Loop

    kalo liat koding elo yg terakhir, berarti yg dipanggil pertama Check ?

  • mantap analisis nya...

    1. baca tabel trs di input jadi hashmap
    2. baca file samapai selesai dan diconvert jadi binary
    3. data bin dipotong2 dari x sampai y dan di compare sama isi hashmap
    4. kalau ada ambil, kalau tidak berarti kasih nilai tertentu

    kalau alur saya LOOP > CHECK > LOOP > ...

    public static String Loop(String loop, HashMap map) throws IOException {

    loop itu adalah data biner asli sebelum dipotong2 mas


  • edited May 2015
    lha iya, pan bisa pake alur yg gw tunjukin sebelumnya
    cukup pake while()
    bukan fungsi yg saling panggil, yg buntutnya jadi stack overflow

    dan alur yg gw tunjukin itu alur nya Loop()
    bukan Check()
    karena Check() bakal dipanggil di dalamnya : found = Check(strcut)
  • edited May 2015
     int awal = 0, d = 6;

    static void String Loop(String ASLI) throws IOException {
            while ( awal < ASLI.length() ) {       
                while ( d <= 16 && !found ) {
                    String cek = ASLI.substring ( awal, d);
                    Check (cek);               

                    if (!found) {
                        d = d + 1;
                    }
                }
               
                if ( found ) {
                    awal = awal + d;
                    d = 6;
                }
               
            }
            return ASLI;      
        }
        
          public static String Check (String toCheck) throws IOException {
            Object oCut = toCheck;    
      
            if (Huffman.containsValue(oCut)) {           
                String val = (String)Huffman.get(oCut);
               
                System.out.println(toCheck + " == " + Integer.parseInt(toCheck, 2) + " == " + val );

                foundSet(true);
            } else {
                foundSet(false);
            }
            return toCheck;
        }
           
    kalau kyk gitu hasilnya TRUE hanya untuk string pertama kali yg dipotong,
  • edited May 2015
    gimana to ?
    alur yg gw tunjukin dipahami atau kagak ?



    itu kenapa masih ada fungsi yg saling panggil ?

    static void Loop(String ASLI) throws IOException {
      ...
      Check (cek, ASLI);               
      ...
    }
       
    public static void Check (String toCheck, String asli) throws IOException {
      ...           
      Loop (asli);
    }



    dan kenapa juga fungsi foundGet() nya yg elo panggil berulang kali ?
    yg gw tunjukin itu cukup variabel yg menampung return fungsi
    tapi bukan fungsi nya



    masa kagak paham to mas ?

    * ini di global kan saja, dan kagak perlu dijadikan parameter fungsi,
    * yg penting isinya bisa dibaca di dalam fungsi
    string = '01110000000000101010010110011110011xxxxx1010101110xxxxxxxxxxxxxxxx... ... ...'
    table = ...

    FUNGSI Loop()


    len = 6 ... elo start panjang pengambilan string mulai dari 6 char
    pos = 0 ... awal string
    strcut = '' ... ini penampung potongan string
    found = false ... flag penanda potongan string ditemukan atau tidak di table, inisialisasi dgn FALSE

    while(... pos < panjang string total ...) {
      while(... len <= 16 ... AND ... NOT found ...) {
        * ambil string mulai pos sepanjang len, tampung di strcut
        strcut = ... potong string mulai dari pos, sepanjang len ...
        * panggil fungsi Check, bandingkan strcut dgn table
        found = Check(strcut)
        * return Check itu true kalo ditemukan, false kalo tidak ditemukan
        * kalo tidak ditemukan ...
        if(NOT found) {
          * len + 1, tambah terus sampai max 16 char
          len = len + 1
        }
      }
      if(found) {
        * kalo dipemeriksaan Check potongan string memang ditemukan, geser pos maju sepanjang len
        pos = pos + len
        * len dikembalikan ke 6
        len = 6
      }
      else {
        * error, karena potongan string kagak ditemukan di table, mulai dari panjang 6 - 16 char
        ERROR, potongan string tidak ditemukan di table
      }
    }

    FUNGSI Check(strcut)


    * bandingkan strcut dgn table
    if( strcut == isi table ) {
      * terserah data yg ditemukan mau diproses kaya apa
      * misal sekedar dicetak
      cetak isi table
      * tapi yg pasti return nya TRUE, karena data ditemukan
      return TRUE
    }
    else {
      return FALSE
    }

    alur kaya begitu masa kagak paham to mas ?
    apa ada fungsi yg saling panggil ?
    apa ada Check memanggil Loop ?

    Loop cuma menerima return nya Check



    kalo alur yg di atas elo tetep kagak paham ... gw nyerah :D
    karena gw bisa jelasin cuma alur nya doang
    gw kagak ngerti java

    tapi gw yakin, newuser paham maksud gw
    gw yakin newuser juga paham akar masalahnya
    dan newuser juga ngerti java

    jadi, kalo beneran elo masih belum paham juga ...
    biar dilanjutin ama newuser :D
  • edited May 2015
    bingung mas, udh di edit. coba cek mana yg logika yg salahnya mas. blm pernah main boolean sebelumnya :D
  • edited May 2015
    emang java kagak ada tipe variabel boolean ?
    dan fungsi di java kagak bisa mengembalikan return nilai boolean ?

    dan dilihat baik-baik lho ya ...

    found itu variabel boolean
    found = false

    dan found menerima balikan / return fungsi Check()
    found = Check(strcut)

    dan balikan / return fungsi Check() itu juga boolean
  • ada boolean mas, tapi g pernah make :D dicoba dulu mas, maklum nubie

  • edited May 2015
    kalo kagak mau pake boolean, pake integer dah ...
    0 = FALSE
    1 = TRUE

    string = '01110000000000101010010110011110011xxxxx1010101110xxxxxxxxxxxxxxxx... ... ...'
    table = ...

    FUNGSI Loop()


    len = 6 ... elo start panjang pengambilan string mulai dari 6 char
    pos = 0 ... awal string
    strcut = '' ... ini penampung potongan string
    found = 0 ... flag penanda potongan string ditemukan atau tidak di table, inisialisasi dgn 0

    while(... pos < panjang string total ...) {
      while(... len <= 16 ... AND ... found == 0 ...) {
        * ambil string mulai pos sepanjang len, tampung di strcut
        strcut = ... potong string mulai dari pos, sepanjang len ...
        * panggil fungsi Check, bandingkan strcut dgn table
        found = Check(strcut)
        * return Check itu 1 kalo ditemukan, 0 kalo tidak ditemukan
        * kalo tidak ditemukan ...
        if(found == 0) {
          * len + 1, tambah terus sampai max 16 char
          len = len + 1
        }
      }
      if(found == 1) {
        * kalo dipemeriksaan Check potongan string memang ditemukan, geser pos maju sepanjang len
        pos = pos + len
        * len dikembalikan ke 6
        len = 6
      }
      else {
        * error, karena potongan string kagak ditemukan di table, mulai dari panjang 6 - 16 char
        ERROR, potongan string tidak ditemukan di table
      }
    }

    FUNGSI Check(strcut)


    * bandingkan strcut dgn table
    if( strcut == isi table ) {
      * terserah data yg ditemukan mau diproses kaya apa
      * misal sekedar dicetak
      cetak isi table
      * tapi yg pasti return nya 1, karena data ditemukan
      return 1
    }
    else {
      return 0
    }

    sama saja to ?
    jadinya sekarang found itu variable integer
  • solved, tks pak @anjinglaut

    modif di  strcut = data.substring ( pos,pos + len );
  • edited May 2015
    kalo penggunaan method / fungsi java nya sih gw kagak tau :D

    kalo baca di :
    http://www.tutorialspoint.com/java/java_string_substring.htm

    public String substring(int beginIndex, int endIndex)

    iya, emang mesti pake pos + len,
    karena parameter nya baca bagian string dari posisi beginIndex sampai endIndex
    referensi nya posisi karakter
    bukan panjang

    tapi, kayanya ada yg perlu elo periksa ulang buat memastikan
    kalo ...
    pos = 10
    len = 6

    baca bagian string dari index 10 s/d (10+6) = 16 ...
    itu jadinya 7 karakter : 10 11 12 13 14 15 16
    atau 6 karakter : 11 12 13 14 15 16
    atau 6 karakter : 10 11 12 13 14 15 ... target elo yg ini, bukan 2 yg di atas

    elo coba dan pastikan
    soalnya gw kagak tau
  • besok tanya2 lagi pak @anjinglaut, jng bosan2 yah :D
  • java tanya ke newuser
    jangan ke gw

    gw cuma bisa bantu logika
Sign In or Register to comment.