2012-08-29 15 views
7

Quiero generar nombres de archivo desde una máscara en Java.¿Cómo puedo fácilmente (en java) generar nombres de archivo a partir de una cadena de máscara?

Algo como 'Data-12-08-29-xxx.xml' de una máscara como 'Datos - $ {YY} - $ {MM} - $ {DD} - $ {var1} .xml'. No quiero generar nombres de archivo aleatorios, sino que los nombres de los archivos se compilarán según un patrón proporcionado en tiempo de ejecución.

Puedo imaginar lo que necesito para crear una clase agradable y genérica que se encargue de esto para todo tipo de casos, pero no quiero reinventar la rueda, si hay algo que pueda reutilizar y tal vez ampliar.

¿Alguna sugerencia?

+1

aplicación cheque log4j. Ya han resuelto el problema de aceptar el patrón de archivo. – sundar

+0

@sundar que no es una solución, en realidad lo estoy usando – CosminO

+0

¿Cómo es esto diferente de exponer algunos datos a un formato o cadena de plantilla y evaluarlo? –

Respuesta

0

Se puede utilizar una pequeña biblioteca llamada AlephFormatter que le permite tener parámetros "nombrados".

Por ejemplo:

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


System.out.println(result); 

Salida:

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

La clase Formatter (la funcionalidad detrás de String.format()) tiene una sintaxis de formateo muy poderosa (mucho más poderosa que MessageFormat). Puede manejar la sustitución de variables y el formato de fecha.

+0

Sugerencia de ahorro de tiempo. ¡Gracias! Voy a esperar algunas mejores ideas. – cmdematos

+0

+1 No veo nada aquí que no se pueda manejar con una simple llamada 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"; 

Esto le dará algo así como datos-12-12-2012-14.55.32.xml

+0

que solo maneja el formato de fecha, no variables arbitrarias (por ejemplo 'var1' en el ejemplo de OP). – jtahlborn

+0

es fácil agregar lo que quieras String fileName = "Data -" + f.format (new Date()) .toString() + SOME_VAR + ". Xml"; donde SOME_VAR puede ser int, cadena o lo que sea, se puede concatenar en una String – CosminO

+1

segura, pero esa no es una sintaxis de formato general. – 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); 

SALIDA:

Data-08/29/2012 -555.xml

0

El problema con String.format() es que se verá obligado a utilizar índices de las variables en la cadena de formato y un patrón similar a %1$ty-%1$tm-%1$td-%2$03d pueden ser problemáticas para que el usuario se ocupa de:

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

En uno de mis proyectos decidí usar Apache Velocity (se da un ejemplo aquí: http://www.javaworld.com/javaworld/jw-12-2001/jw-1228-velocity.html) Es una herramienta bastante poderosa para este tipo de tareas, pero ofrece la posibilidad de utilizar nombres de variables significativos en su formato Date-${year}-${month}-${day}-${number}.xml. En primer lugar, habría que añadir las variables apropiadas para el contexto de velocidad:

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

pero luego, será mucho más fácil para el usuario para especificar la cadena de formato ..

+0

Esto se ajustará muy bien a los requisitos, ¡gracias! – cmdematos

Cuestiones relacionadas