Salve ho un file .eml e devo sostituire una stringa in questo file. Qualcuno saprebbe aiutarmi su come fare ? non posso usare file txt , perchè altrimenti perdo la formattazione del file .eml ! Consigli?
grazie
Salve ho un file .eml e devo sostituire una stringa in questo file. Qualcuno saprebbe aiutarmi su come fare ? non posso usare file txt , perchè altrimenti perdo la formattazione del file .eml ! Consigli?
grazie
Un file EML (un file che rappresenta una mail), è un banalissimo file di testo in cui, per ragioni storiche, ciascuna riga non può superare i 76 caratteri. Se la riga li supera, va aggiunto un marcatore prima di portarla a capo.
Quindi, si tratta solo di tener conto di questo fatto nel momento in cui si va a scrivere la riga modificata:
codice:String strModificata = ...; // Ho la stringa modificata da scrivere nel file String daScrivere = normalizza( strModificata ); // Scrivo sul file la stringa "daScrivere" ... private String normalizza(String line) { StringBuilder ret = new StringBuilder(); while(line.length() > 75) { ret.append(line.substring(0, 75)).append('=').append( System.getProperty("line.separator") ); line = line.substring(75); } if (line.length() > 0) ret.append( line ); return ret.toString(); }
Ciao.![]()
Ultima modifica di LeleFT; 10-03-2014 a 15:46
"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
il fatto è che il mio file è gia scritto e formattato , devo sostituire solo una parola all'interno del testo, come una specie di find replace! Cioè devo cancellare una parola e inserirne un'altra! Non devo creare il file da 0!
Il file comunque lo devi riscrivere completamente. Puoi leggere tutto quanto, metterlo in memoria, fare la/e sostituzione/i in memoria e poi riscrivere tutto su file oppure leggere man mano (es. una riga o blocco di caratteri per volta) e "al volo" scrivere ciò che leggi eventualmente modificato.
Quale dei due approcci dipende da cosa/quanto devi cambiare, dal tipo e della struttura del file.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
quale stream mi consigli per leggere questo file ?
"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
cerco di leggere il file e di scriverlo in un altro file . Cosa sbaglio ? il nuovo file è praticamente vuoto !!codice:public void sendMail() throws MessagingException, FileNotFoundException, IOException { Properties prop=new Properties(); // Creazione di una mail session prop.load(new FileInputStream("mail.properties")); String mitt=Mail.getMitt(); String s; String pwd=Mail.getpwd(); String host=Mail.getHost(); StringBuilder s1=new StringBuilder(); Session session = Session.getDefaultInstance(prop, new MailAuthenticator(mitt, pwd)); session.setDebug(true); FileReader fr=new FileReader(Mail.mailFile); // Creazione del messaggio da inviare BufferedReader br=new BufferedReader(fr); File tmp=new File("emailtemp.eml"); FileWriter fw=new FileWriter(tmp); while((s=br.readLine())!=null){ s1.append(s); } String s2=s1.toString(); PrintWriter pw=new PrintWriter(fw); pw.print(s2); pw.close(); fw.close(); InputStream source=new FileInputStream(tmp); MimeMessage message = new MimeMessage(session,source); // message.setSubject(oggetto); // message.setText(testoEmail); // Aggiunta degli indirizzi del mittente e del destinatario InternetAddress fromAddress = new InternetAddress(mitt); InternetAddress toAddress = new InternetAddress(dest); message.setFrom(fromAddress); message.setRecipient(Message.RecipientType.TO, toAddress); // Invio del messaggio Transport transport = session.getTransport("smtps"); transport.connect(host, mitt, pwd); Transport.send(message); transport.close(); }
Senza entrare nel merito della gestione delle eccezioni e del corretto modo di gestire i files, non capisco perchè tu non stia facendo l'analisi della riga da scrivere (per vedere se supera i famosi 76 caratteri).
Ad ogni modo, riporto qui sotto il tuo codice con i commenti di ciò che fa, così puoi renderti conto di quali possano essere le problematiche:
codice:// Qui io presumo che "Mail.mailFile" sia una stringa contenente // il percorso completo al file da leggere. Se non è così o se // punta ad un file inesistente, ovviamente non farà nulla di tutto // ciò che si prevede nel codice FileReader fr=new FileReader(Mail.mailFile); // Ok BufferedReader br=new BufferedReader(fr); // Non è necessario, però OK // Il nuovo file verrà creato nella Working Directory! File tmp=new File("emailtemp.eml"); // OK FileWriter fw=new FileWriter(tmp); // In questo ciclo, scorri il file da leggere e concateni // tutte le righe in un'unica riga all'interno dello StringBuilder // (ricorda che readLine() butta via il carattere di newLine!) // Quindi, se il file originale è questo: // // Prima Riga // Seconda Riga // Terza Riga // // Nello StringBuilder avrai: // // Prima RigaSeconda RigaTerza Riga while((s=br.readLine())!=null){ s1.append(s); } // Qui ottieni il contenuto dello StringBuilder in una stringa String s2=s1.toString(); // OK PrintWriter pw=new PrintWriter(fw); // Scrivi nel file UNA SOLA RIGA contenente tutte le righe // del file originale, appiccicate una accanto all'altra pw.print(s2); // Chiudi il file senza aver effettuato alcun flush() // Quindi non c'è nessuna garanzia che i dati vengano effettivamente // scritti pw.close(); // Questo è del tutto inutile, lo stream è già stato chiuso // dall'istruzione precedente fw.close();
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
ok risolto però devo sostituire 5 trattini ----- che stanno all'interno del file con una nuova stringa : ma non viene
codice:s1.toString().replaceFirst("\\-{5}", this.score);
Il risultato di quell'operazione è assegnato a qualcosa?
SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
Di questo libro e degli altri (blog personale di recensioni libri) | NO M.P. TECNICI