假设用户运行SomeProgram.java来计算一堆东西。他们想要跟踪的事情之一是该程序运行了多少次并输出当前的运行编号。这是我得到的距离,但每次重置。
public class SomeProgram
{
public volatile int counter = 1;
public int getNextRun()
{
return counter++;
}
//calculates a bunch of variable that get output to user
public static void main(String args[])
{
SomeProgram variable = new SomeProgram();
runNumber = variable.getNextRun();
System.out.println(runNumber + "Some bunch of calculations");
}
}
有人可以解释为什么这会被贬低?
答案 0 :(得分:1)
每当用户停止运行程序时,您将丢失存储在内存中的任何变量,因此您必须将该值存储在其他位置。最简单的解决方案是将其存储在本地文件中。
如果您的企业需要知道这个号码,您可以在每次启动时将程序调用到网络服务器的主页 - 这可以防止用户在其计算机上修改文件 - 但设置起来要复杂得多,并且一些用户可能不会意识到这种意外行为。
答案 1 :(得分:0)
将更新的计数器存储在文件中的完整实现,只要您希望计数器递增(即程序启动时),就会调用它。当文件不存在时,它就会被创建。此方法返回更新的计数器,如果有IOException
,则返回0。
public static int updateCounter() {
String counterFileName = "counter.txt";
int counter = 0;
File counterFile = new File(counterFileName);
if (counterFile.isFile()) {
try (BufferedReader reader = new BufferedReader(new FileReader(counterFileName))) {
counter = Integer.parseInt(reader.readLine());
} catch (IOException e) {
e.printStackTrace();
return 0;
}
}
try (FileWriter writer = new FileWriter(counterFileName)) {
writer.write(String.valueOf(++counter));
} catch (IOException e) {
e.printStackTrace();
return 0;
}
return counter;
}
答案 2 :(得分:0)
写入本地文件不是一个好主意。您必须在本地文件上实现锁定机制,否则在同时启动多个程序实例的情况下您将遇到竞争条件。
另一种想法是将每次运行记录到持久存储中。因此,如果您将每个运行的日期和时间写入数据库,您将能够计算任意时间间隔的运行次数。
实际实施取决于您的要求
答案 3 :(得分:0)
您可以使用属性文件:
public void loadProperties(String fileName)
{
Properties props = new Properties();
InputStream is = null;
// First try loading from the current directory
try {
File f = new File(fileName);
is = new FileInputStream( f );
}catch ( Exception e ) {
is = null;
e.printStackTrace();
}
try {
if ( is == null ) {
// Try loading from classpath
is = getClass().getResourceAsStream("example.properties");
}
// Try loading properties from the file (if found)
props.load( is );
String counter1 = props.getProperty("COUNTER_RUN");
String counter2 = props.getProperty("COUNTER_OUTPUT");
counterRun = Integer.parseInt(counter1);
counterOutput = = Integer.parseInt(counter2);
}catch ( Exception e ) {
e.printStackTrace();
}
}
public void saveProperties(String fileName) {
try {
Properties props = new Properties();
props.setProperty("COUNTER_RUN", ""+counterRun );
props.setProperty("COUNTER_OUTPUT", ""+counterOutput );
File f = new File(fileName);
OutputStream out = new FileOutputStream( f );
props.store(out, "Config params");
} catch (Exception e ) { e.printStackTrace(); }
}
counterRun和counterOutput是全局变量
文件example.properties
#Config paramns
#Tue May 03 14:17:35 COT 2016
COUNTER_RUN=241
COUNTER_OUTPUT=123