2012-08-29 12 views
7

Voglio generare nomi di file da una maschera in Java.Come posso facilmente (in java) generare nomi di file da una stringa di maschera?

Qualcosa come 'Data-12-08-29-xxx.xml' da una maschera come 'Dati - $ {YY} - $ {MM} - $ {DD} - $ {var1} .xml'. Non voglio generare nomi di file casuali, ma i nomi dei file dovrebbero essere costruiti secondo uno schema fornito in fase di esecuzione.

Posso immaginare solo quello che mi serve per creare una classe generica e piacevole che gestirà questo per tutti i tipi di casi, ma non voglio reinventare la ruota, se qualcosa là fuori che posso riutilizzare e forse estendere.

Qualche suggerimento?

+1

attuazione controllo log4j. Hanno già risolto il problema dell'accettazione del modello di file. – sundar

+0

@sundar che non è una soluzione, in realtà lo sto usando – CosminO

+0

Come è diverso dall'esporre alcuni dati a un formato o stringa di modello e valutarlo? –

risposta

0

È possibile utilizzare una piccola libreria chiamata AlephFormatter che consente di avere parametri "nominati".

Ad esempio:

String result = template("#{errNo} -> #{c.simpleName} -> #{c.package.name}") 
       .arg("errNo", 101) 
       .arg("c", String.class) 
       .fmt(); 


System.out.println(result); 

uscita:

Error number: 101 -> String -> java.lang 
3

la classe Formatter (la funzionalità dietro String.format()) ha una sintassi di formattazione molto potente (molto più potente di MessageFormat). Può gestire la sostituzione variabile e la formattazione della data.

+0

Suggerimento per il risparmio di tempo. Grazie! Terrò qualche altra buona idea. – cmdematos

+0

+1 Non vedo nulla qui che non possa essere gestito con una semplice chiamata a String.format() – Alex

2
Format f=new SimpleDateFormat("dd-MM-yyyy-HH.mm.ss"); 
String fileName="Data-"+f.format(new Date() /*or a Date object which you saved previously*/).toString()+".xml"; 

Questo vi darà qualcosa di simile a Data-12-12-2012-14.55.32.xml

+0

che gestisce solo la formattazione della data, non variabili arbitrarie (ad esempio 'var1' nell'esempio dell'OP). – jtahlborn

+0

è facile aggiungere quello che vuoi String fileName = "Data -" + f.format (new Date()) .toString() + SOME_VAR + ". Xml"; dove SOME_VAR può essere int, string o qualsiasi altra cosa può essere concatenata in una stringa, – CosminO

+1

, ma questa non è una sintassi di formattazione generale. – jtahlborn

1
MessageFormat messageFormat = new MessageFormat("Data-{0,number,#}-{1}-{2}-{3,number,#}.xml"); 
Calendar cal = Calendar.getInstance(); 
int variable = 555; 
Integer[] args = {cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH), variable}; 
String result = messageFormat.format(args); 
System.out.println(result); 

USCITA:

Data-2012/08/29 -555.xml

0

Il problema con String.format() è che si sarà costretti a utilizzare indici delle variabili nella stringa di formato e un modello simile a %1$ty-%1$tm-%1$td-%2$03d può essere problematico per l'utente di trattare con:

Calendar time = Calendar.getInstance(); 
int number = 7; 
String msg = String.format("Data-%1$ty-%1$tm-%1$td-%2$03d.xml", time, number); 

In uno dei miei progetti ho deciso di utilizzare Apache Velocity (un esempio è dato qui: http://www.javaworld.com/javaworld/jw-12-2001/jw-1228-velocity.html). È uno strumento abbastanza potente per questo tipo di attività ma offre la possibilità di utilizzare nomi di variabili significativi nel formato Date-${year}-${month}-${day}-${number}.xml. In primo luogo, si dovrà aggiungere le variabili appropriate al contesto di velocità:

VelocityContext context = new VelocityContext(); 
context.put("number", "007"); 
context.put("year", ...); 

ma poi, sarà molto più facile per l'utente di specificare la stringa di formato ..

+0

Questo si adatta molto bene ai requisiti - grazie! – cmdematos

Problemi correlati