Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    68

    Non legge correttamente un file di testo

    Ciao a tutti, sto impazzendo.
    Praticamente devo leggere un file di testo, che è formato solo da una riga, e devo visualizzarla in una parte grafica, sto utilizzando windowBuilder per aiutarmi nella realizzazione di una parte grafica.

    Vi descrivo cosa fa, legge da un file di testo la riga, e ogni 5 caratteri li inserisce in un Text.
    Non funziona, come stringa letta del file mi da questo:
    codice:
    ÿþ1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
    anche se il file di testo è
    codice:
    12345678901234567890
    vi riporto il codice
    codice:
    package main;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    
    
    public class Dati 
    {
    
    
        public Dati()
        {
            dati = new String("");
            i = 0;
        }
        
        public String dati;
        private int i;
        
        public String letturaFile() throws IOException
        {
            
            
            BufferedReader reader = new BufferedReader( new FileReader("c:/mio.dat") );
            dati = reader.readLine();
            
            System.out.print(dati);
            
            i = i +5;
            if (i>=20) i = 0;
            reader.close();
            return dati.substring(i, i+5);
            
            
            
        }
    mentre per la parte di interfaccia

    codice:
    package main;
    
    import java.io.IOException;
    
    
    public class Rubrica extends ApplicationWindow {
        private Text text;
        private Text text_1;
        private Text text_2;
        private Text text_3;
    
    
        /**
         * Create the application window.
         */
        public Rubrica() {
            super(null);
            createActions();
            addToolBar(SWT.FLAT | SWT.WRAP);
            addMenuBar();
            addStatusLine();
        }
    
    
        /**
         * Create contents of the application window.
         * @param parent
         */
        @Override
        protected Control createContents(Composite parent)
        {
            Dati dati = new Dati();
            
            Composite container = new Composite(parent, SWT.NONE);
            
            Label lblNome = new Label(container, SWT.NONE);
            lblNome.setBounds(10, 10, 55, 15);
            lblNome.setText("Nome");
            
            text = new Text(container, SWT.BORDER);
            text.setBounds(70, 4, 98, 21);
            
            try {
                text.setText(dati.letturaFile());
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            
            Label lblCognome = new Label(container, SWT.NONE);
            lblCognome.setBounds(187, 10, 55, 15);
            lblCognome.setText("Cognome");
            
            text_1 = new Text(container, SWT.BORDER);
            text_1.setBounds(262, 4, 108, 21);
            try {
                text_1.setText(dati.letturaFile());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
    
            
            Label lblNome_1 = new Label(container, SWT.NONE);
            lblNome_1.setBounds(10, 46, 55, 15);
            lblNome_1.setText("Nome");
            
            text_2 = new Text(container, SWT.BORDER);
            text_2.setBounds(70, 40, 98, 21);
            try {
                text_2.setText(dati.letturaFile());
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        
            
            Label lblCognome_1 = new Label(container, SWT.NONE);
            lblCognome_1.setBounds(187, 46, 55, 15);
            lblCognome_1.setText("Cognome");
            
            text_3 = new Text(container, SWT.BORDER);
            text_3.setBounds(262, 40, 108, 21);
            try {
                text_3.setText(dati.letturaFile());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            return container;
        }
    
    
        /**
         * Create the actions.
         */
        private void createActions() {
            // Create the actions
        }
    
    
        /**
         * Create the menu manager.
         * @return the menu manager
         */
        @Override
        protected MenuManager createMenuManager() {
            MenuManager menuManager = new MenuManager("menu");
            return menuManager;
        }
    
    
        /**
         * Create the toolbar manager.
         * @return the toolbar manager
         */
        @Override
        protected ToolBarManager createToolBarManager(int style) {
            ToolBarManager toolBarManager = new ToolBarManager(style);
            return toolBarManager;
        }
    
    
        /**
         * Create the status line manager.
         * @return the status line manager
         */
        @Override
        protected StatusLineManager createStatusLineManager() {
            StatusLineManager statusLineManager = new StatusLineManager();
            return statusLineManager;
        }
    
    
        /**
         * Launch the application.
         * @param args
         */
        public static void main(String args[]) {
            try {
                Rubrica window = new Rubrica();
                window.setBlockOnOpen(true);
                window.open();
                Display.getCurrent().dispose();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * Configure the shell.
         * @param newShell
         */
        @Override
        protected void configureShell(Shell newShell) {
            super.configureShell(newShell);
            newShell.setText("Gestione Rubrica");
        }
    
    
        /**
         * Return the initial size of the window.
         */
        @Override
        protected Point getInitialSize() {
            return new Point(450, 300);
        }
    }
    questa è la foto dell'interfaccia grafica, in ogni casella di testo dovrebbero esserci 5 numeri, ma non è così. Riuscite ad aiutarmi?
    https://www.dropbox.com/s/qxj5rxtbhk3z874/Immagine.jpg
    Ultima modifica di Maxton; 25-03-2014 a 17:38

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Codifica del file?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Maxton Visualizza il messaggio
    Non funziona, come stringa letta del file mi da questo:
    codice:
    ÿþ1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
    Sembrerebbe (da quanto posso intuire/dedurre) che il file di testo è codificato in UTF-16 LE (Little Endian), oltretutto con Byte Order Mark iniziale (vedere http://en.wikipedia.org/wiki/Byte_order_mark ).
    Se il file l'hai scritto tu, verifica con cosa l'hai scritto e come puoi controllare l'editor per salvarlo nel modo appropriato per il tuo codice (FileReader usa il charset di default della piattaforma).
    Se il file non puoi/vuoi cambiarlo, devi usare InputStreamReader e specificare esplicitamente il charset usato nel file.
    Tutto qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    68
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Sembrerebbe (da quanto posso intuire/dedurre) che il file di testo è codificato in UTF-16 LE (Little Endian), oltretutto con Byte Order Mark iniziale (vedere http://en.wikipedia.org/wiki/Byte_order_mark ).
    Se il file l'hai scritto tu, verifica con cosa l'hai scritto e come puoi controllare l'editor per salvarlo nel modo appropriato per il tuo codice (FileReader usa il charset di default della piattaforma).
    Se il file non puoi/vuoi cambiarlo, devi usare InputStreamReader e specificare esplicitamente il charset usato nel file.
    Tutto qui.
    Hai ragione, errore mio. Grazie mille.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    68
    Questa volta faccio creare il file dal programma, ecco il codice
    codice:
    File ff = new File(path);        
    RandomAccessFile in = new RandomAccessFile(path,"rw");
            in.writeUTF("12345ABCD12345ABCD12345ABCD12345ABCD");
            in.seek(2);
            in.writeUTF("8888");    // sostituisce 'File' con 'abcd'
            System.out.println("\nfile di "+in.length()+" byte contiene:"); 
              String dat=" " ;
              while ((dat=in.readLine())!=null)     
                 System.out.println(dat);
              System.out.println("\nFine esecuzione.");
    Purtroppo l'output non è "18888ABCD12345ABCD12345ABCD12345ABCD" ma "BCD12345ABCD12345ABCD12345ABCD"
    Qualcuno sa aiutarmi?

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Dopo la seconda scrittura (dove scrivi "8888"), il puntatore è posizionato DOPO tale scrittura:

    codice:
    // Prima scrittura
    12345ABCD12345ABCD12345ABCD12345ABCD
                                        ^ (puntatore)
    
    // Seek
    12345ABCD12345ABCD12345ABCD12345ABCD
      ^ (puntatore)
    
    // Scrittura "8888"
    128888BCD12345ABCD12345ABCD12345ABCD
          ^ (puntatore)
    
    // Lettura
    ...

    Se vuoi leggere tutto dall'inizio, prima della readLine() devi fare una seek( 0 );


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    68
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Dopo la seconda scrittura (dove scrivi "8888"), il puntatore è posizionato DOPO tale scrittura:

    codice:
    // Prima scrittura
    12345ABCD12345ABCD12345ABCD12345ABCD
                                        ^ (puntatore)
    
    // Seek
    12345ABCD12345ABCD12345ABCD12345ABCD
      ^ (puntatore)
    
    // Scrittura "8888"
    128888BCD12345ABCD12345ABCD12345ABCD
          ^ (puntatore)
    
    // Lettura
    ...

    Se vuoi leggere tutto dall'inizio, prima della readLine() devi fare una seek( 0 );


    Ciao.
    Se inserisco un seek(0) prima delle readLine() mi risulta:
    " $ *8888BCD12345ABCD12345ABCD12345ABCD" al posto di '*' ho un simbolo strano, una specie di quadratino con un segno dentro

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Maxton Visualizza il messaggio
    Se inserisco un seek(0) prima delle readLine() mi risulta:
    " $ *8888BCD12345ABCD12345ABCD12345ABCD" al posto di '*' ho un simbolo strano, una specie di quadratino con un segno dentro
    writeUTF ha un formato ben preciso, prima della stringa (in encoding UTF-8 "modificato", vedi javadoc), scrive 2 byte che rappresentano un short che indica il numero di byte (non il numero di caratteri) che seguono.

    Il tuo approccio, in generale, non mi sembra comunque molto appropriato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    68
    Quote Originariamente inviata da andbin Visualizza il messaggio
    writeUTF ha un formato ben preciso, prima della stringa (in encoding UTF-8 "modificato", vedi javadoc), scrive 2 byte che rappresentano un short che indica il numero di byte (non il numero di caratteri) che seguono.

    Il tuo approccio, in generale, non mi sembra comunque molto appropriato.
    Cosa mi consigli?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Maxton Visualizza il messaggio
    Cosa mi consigli?
    Il punto è che se usi writeUTF, il file non è più considerabile un file di testo "puro" (per via del formato molto specifico scritto), quindi non sarebbe più appropriato leggerlo con altre API (es. readLine() di BufferedReader) e nemmeno editarlo "a mano" con un editor di testo puro.

    Quindi quale è l'obiettivo finale? In altre parole, come devi poter operare sul file?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.