Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883

    (java) Problema lettura file di testo

    devo leggere un file di testo in java, su una riga di questo file c'e' scritto
    c:\pippo
    La lettura non da' errori ma se stampo i valori letti, trovo
    cippo
    mi sparisce la barra in fase di lettura, come mai?

    codice:
    package read;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Properties;
    
    public class ReadTextFile {
    
        private static Properties propertiesFile = new Properties();
        
    	public static final String USER_DIR  = System.getProperty("user.dir");
    	
    	public ReadTextFile() {
    		read();
    
    	}
        /**
         * Legge il file siai.properties.
         *
         */
        public static synchronized void read() {
            try {
                File f = new File(USER_DIR, "prova.txt");
                if (f.exists()) {
                    FileInputStream in = null;
                    in = new FileInputStream(f);
                    propertiesFile.load(in);
                    System.out.println("contenuto file: "+propertiesFile.toString());
                } 
                else 
                	System.err.println("file non trovato nella directory:\n"+USER_DIR);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        public static void main(String[] args) {
    		new ReadTextFile();
    	}
    }
    Il file da' leggere e' il seguente:

    isDatabaseCreatedOnStartup=false
    isDebugOn=true
    lastBackupDate=11-01-2006
    dirAbsPath=c:\pippo

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    dalla documentazione del metodo load:

    The method does not treat a backslash character, \, before a non-valid escape character as an error; the backslash is silently dropped. For example, in a Java string the sequence "\z" would cause a compile time error. In contrast, this method silently drops the backslash. Therefore, this method treats the two character sequence "\b" as equivalent to the single character 'b'.
    prova a scrivere nel file c:\\pippo

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    la soluzione ha funzionato
    adesso pero' ho il problema che quando vado a salvare il file sul harddisk, il metodo fout.write mi trasforma il path
    c:\\pippo
    in c:\pippo

    che non va bene

    codice:
    /**
         * Salva il file di properties nella directory di lavoro.
         */
        public static void save() {
            File f = new File(USER_DIR, "prova.txt");
              
    
                myProperties = filePropertiesHeader + LINE_SEPARATOR
                        + LINE_SEPARATOR + myProperties;
                FileWriter fout = null;
                try {
                    fout = new FileWriter(USER_DIR + File.separator
                            + "prova.txt");
                    fout.write(myProperties, 0, myProperties.length());
                    fout.close();
                } catch (IOException e) {
                	e.printStackTrace();
                }
            
        }
    Ho deuggato ed ho visto che dentro myProperties il path e' correttamente impostato a
    c:\\pippo
    mentre il metodo .write scrive
    c:\pippo

  4. #4
    per forza, perchè \\ è il carattere che equivale ad un solo backslash...se ne vuoi scrivere due dovrai mettere il doppio \\,

    codice:
    c:\\\\pippo
    Purtroppo bisogna imparare che il computer non sbaglia...fa solo quello che gli dici di fare

    www.netpolaris.it

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    ok ma io ho nel file propertiesFile come value la stringa
    c:\pippo
    allora ho pensato di fare
    replaceAll("\\","\\\\")
    ma da' il seguente errore

    codice:
    
    java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
    \
     ^
    	at java.util.regex.Pattern.error(Unknown Source)
    	at java.util.regex.Pattern.compile(Unknown Source)
    	at java.util.regex.Pattern.<init>(Unknown Source)
    	at java.util.regex.Pattern.compile(Unknown Source)
    	at java.lang.String.replaceFirst(Unknown Source)
    	at it.siai.util.PropertiesFile.sort(PropertiesFile.java:149)
    	at it.siai.util.PropertiesFile.save(PropertiesFile.java:165)
    	at it.siai.util.PropertiesFile.setProperty(PropertiesFile.java:223)
    	at it.siai.util.FileUtil.makeDbZipFile(FileUtil.java:133)
    	at it.siai.listener.SiaiFrameListener.backupDatabase(SiaiFrameListener.java:229)
    	at it.siai.listener.SiaiFrameListener.<init>(SiaiFrameListener.java:87)
    	at it.siai.main.Siai.createAndShowGUI(Siai.java:76)
    	at it.siai.main.Siai.access$1(Siai.java:67)
    	at it.siai.main.Siai$1.run(Siai.java:38)
    	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)

  6. #6
    hihihi...nelle regex valgono i caratteri di escape...quindi dovresti raddoppiare ancora tutto per fare una replaceAll di quel tipo, perchè uno serve per la stringa in se, l'altro per la regex
    Purtroppo bisogna imparare che il computer non sbaglia...fa solo quello che gli dici di fare

    www.netpolaris.it

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    ho scritto cosi' ed ha funzionato
    val = val.replaceFirst("\\\\", "\\\\\\\\");
    mi potresti spiegare perche' cosi' va bene?
    non capisco questo discorso
    perchè uno serve per la stringa in se, l'altro per la regex

  8. #8
    allora:

    il carattere "\" è un carattere speciale detto di escape

    quindi non puoi dichiarare una stringa così:

    codice:
    String pippo = "percorso\del\file";
    perchè il compilatore interpreta il gruppo "\d" e "\f" e, visto che non sono caratteri di escape validi, si arrabbia...

    per scrivere in una stringa il backslash lo devi raddoppiare...per il compilatre java "\\" vol dire "lì mettici il carattere backslash"

    Ora...se tu vai a dare un occhio a come comporre un pattern per le regex (cosa che a tutti gli effetti fa anche il metodo replaceAll, intatti è definito come replaceAll(str,regEx)) anche appunto questi pattern utilizzano i caratteri di escape (\s,\\,\n...) quindi il compilatore del pattern della regEx si aspetta di trovare dei caratteri di escape validi cosa che se tu metti solo una coppia di "\\" (nel tuo caso) non va bene in quanto al compilatore della regEx arriva come se fosse un singolo backslash...da qui la necessità di raddoppiarli...

    Spero di esser stato chiaro e di non aver detto troppe imprecisioni...

    Purtroppo bisogna imparare che il computer non sbaglia...fa solo quello che gli dici di fare

    www.netpolaris.it

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    Ho capito thx
    ancora una domande per curiosita':
    \n \r \f come mai vengono diniti con la parola escape? In pratica escape cosa significherebbe?

  10. #10
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    un escape è una sequenza di caratteri particolare ce serve a rappresentare un carattere; ad esempio \t in una stringa corrisponde al carattere tab, \n al carattere di fine linea, ecc..

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

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.