如何(在java中)从掩码字符串轻松生成文件名?

如何(在java中)从掩码字符串轻松生成文件名?,java,filenames,Java,Filenames,我想从Java中的掩码生成文件名 类似于“Data-${YY}-${MM}-${DD}-${var1}.xml”的掩码中的“Data-12-08-29-xxx.xml”之类的内容。我不想生成随机文件名,而是根据运行时提供的模式生成文件名 我可以想象我需要创建一个好的泛型类来处理各种情况,但是我不想重新发明轮子,如果存在一些我可以重新设计和扩展的东西 有什么建议吗?该类(String.format()背后的功能)具有非常强大的格式语法(比MessageFormat强大得多)。它可以处理变量替换以及

我想从Java中的掩码生成文件名

类似于“Data-${YY}-${MM}-${DD}-${var1}.xml”的掩码中的“Data-12-08-29-xxx.xml”之类的内容。我不想生成随机文件名,而是根据运行时提供的模式生成文件名

我可以想象我需要创建一个好的泛型类来处理各种情况,但是我不想重新发明轮子,如果存在一些我可以重新设计和扩展的东西

有什么建议吗?

该类(String.format()背后的功能)具有非常强大的格式语法(比MessageFormat强大得多)。它可以处理变量替换以及日期格式

 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";
这将为您提供类似Data-12-12-2012-14.55.32.xml的内容

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);
输出:

Data-2012-8-29-555.xml


String.format()的问题是,您将被迫在格式字符串中使用变量的索引,类似于
%1$ty-%1$tm-%1$td-%2$03d的模式可能会对用户造成问题:

Calendar time = Calendar.getInstance();
int number = 7;
String msg = String.format("Data-%1$ty-%1$tm-%1$td-%2$03d.xml", time, number);
在我的一个项目中,我决定使用ApacheVelocity(这里给出了一个示例:)。对于这类任务,它是一个非常强大的工具,但是它提供了一种可能性,可以在您的格式
Date-${year}-${month}-${day}-${number}.xml
中使用有意义的变量名。首先,您必须向velocity上下文添加适当的变量:

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

但是,用户可以更容易地指定格式字符串。

您可以使用一个名为的小型库,它允许您使用“命名”参数

例如:

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


System.out.println(result);
输出:

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

检查log4j实现。他们已经解决了接受文件模式的问题。@sundar这不是一个解决方案,我实际上在使用它。这与将某些数据暴露于格式或模板字符串并对其进行评估有什么不同?可以通过将字符串解析为标记、构建格式字符串、,然后替换标记值并重新组装字符串。但是,我想这已经做了好几次了。我喜欢log4j实现建议。它只处理日期格式,而不处理任意变量(例如OP示例中的
var1
)。添加任何您想要的字符串fileName=“Data-”+f.format(new date()).toString()+一些_VAR+“.xml”都很容易;其中一些变量可以是int、string或其他任何形式,可以连接到StringTime-saving建议中。非常感谢。我会再坚持一些好主意。+1我在这里没有看到任何不能通过简单调用String.format()来处理的东西