总访问人数每隔一段时间就变小,重新统计,是什么原因?代码见内

am2000 2008-11-21 09:05:51
package util;

import java.io.*;
import java.lang.*;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;

public class SessionCounter implements HttpSessionListener
{
private static int counterNow = 0; // 活动会话个数,即 当前在线人数。
private static int counterAll = 0; // 总访问人数。

/* Session创建事件 */
public void sessionCreated(HttpSessionEvent se)
{
counterNow++;

try
{
counterAll = 0; // 1 访问总人数
String strCountAll = "";

File fileCounter = new File("counter.txt");
if ( !fileCounter.exists() )
{
fileCounter.createNewFile();
}
else
{
BufferedReader bufReader = new BufferedReader(new FileReader("counter.txt"));

strCountAll = bufReader.readLine ();
counterAll = Integer.parseInt ( strCountAll );

bufReader.close ();
}

counterAll++;

PrintWriter pw = new PrintWriter ( new BufferedWriter(new FileWriter("counter.txt")) );

strCountAll = Integer.toString ( counterAll );
pw.println ( strCountAll );

pw.close ();
}
catch ( IOException e )
{
System.out.println ( e.toString() );
}
}

/* Session失效事件 */
public void sessionDestroyed(HttpSessionEvent se)
{
if ( counterNow > 0 )
counterNow--;
}

public static int getCounterNow()
{
return counterNow;
}

public static int getCounterAll()
{
try
{
String strCountAll = "";

File fileCounter = new File("counter.txt");
if ( !fileCounter.exists() )
{
fileCounter.createNewFile();
}
else
{
BufferedReader bufReader = new BufferedReader(new FileReader("counter.txt"));

strCountAll = bufReader.readLine ();
counterAll = Integer.parseInt ( strCountAll );

bufReader.close ();
}
}
catch ( IOException e )
{
System.out.println ( e.toString() );
}

return counterAll;
}
}
...全文
88 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
am2000 2008-12-10
  • 打赏
  • 举报
回复
locksun :我该怎么解决
am2000 2008-12-09
  • 打赏
  • 举报
回复
package util;

import java.io.*;
import java.lang.*;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;

public class SessionCounter implements HttpSessionListener
{
private static int counterNow = 0; // 活动会话个数,即 当前在线人数。
private static int counterAll = 0; // 总访问人数。

/* Session创建事件 */
public void sessionCreated(HttpSessionEvent se)
{
counterNow++;

try
{
counterAll = 0; // 1 访问总人数
String strCountAll = "";

File fileCounter = new File("counter.txt");
if ( !fileCounter.exists() )
{
fileCounter.createNewFile();
}
else
{
BufferedReader bufReader = new BufferedReader(new FileReader("counter.txt"));

strCountAll = bufReader.readLine ();
counterAll = Integer.parseInt ( strCountAll );

bufReader.close ();
}

counterAll++;

PrintWriter pw = new PrintWriter ( new BufferedWriter(new FileWriter("counter.txt")) );

strCountAll = Integer.toString ( counterAll );
pw.println ( strCountAll );

pw.close ();
}
catch ( IOException e )
{
System.out.println ( e.toString() );
}
}

/* Session失效事件 */
public void sessionDestroyed(HttpSessionEvent se)
{
if ( counterNow > 0 )
counterNow--;
}

public static int getCounterNow()
{
return counterNow;
}

public static int getCounterAll()
{
/*try
{
String strCountAll = "";

File fileCounter = new File("counter.txt");
if ( !fileCounter.exists() )
{
fileCounter.createNewFile();
}
else
{
BufferedReader bufReader = new BufferedReader(new FileReader("counter.txt"));

strCountAll = bufReader.readLine ();
counterAll = Integer.parseInt ( strCountAll );

bufReader.close ();
}

}
catch ( IOException e )
{
System.out.println ( e.toString() );
}
*/
return counterAll;
}
}
am2000 2008-12-08
  • 打赏
  • 举报
回复
locksun :我该怎么解决
locksun 2008-11-21
  • 打赏
  • 举报
回复
而且加入某个线程在读取到你的strCountAll 且出现等待资源等情况而搁置起来了,到某个时间(几小时?)后再+1写入你的记录文件,那你认为会不会数据"倒退"?
locksun 2008-11-21
  • 打赏
  • 举报
回复
不应该没看清楚就乱发言的,先道个歉
回归原题,归结来说应该是并发多线程和io读写文件间的矛盾产生的
假设有个线程正在改写你的记录文件的同时另外一个新线程(即新的session创建)去读取你的记录文件
此时会发生什么事情?
线程并发对io读写产生影响很正常
恒悦sunsite 2008-11-21
  • 打赏
  • 举报
回复
PrintWriter pw = new PrintWriter ( new BufferedWriter(new FileWriter("counter.txt")) );
strCountAll = Integer.toString ( counterAll );
pw.println ( strCountAll );

PrintWriter里面有直接打印整数的方法,为啥还要转换一下呢!

strCountAll = bufReader.readLine ();
counterAll = Integer.parseInt ( strCountAll );
你上面代码好像并没有往文件里面写入啊,你这个readLine()读出来的会不会是countNow啊,countNow可能为0咯!
locksun 2008-11-21
  • 打赏
  • 举报
回复
会不会超出你的int范围了啊?
kokobox 2008-11-21
  • 打赏
  • 举报
回复
/* Session失效事件 */
public void sessionDestroyed(HttpSessionEvent se)
{
if ( counterNow > 0 )
counterNow--;
}

public static int getCounterNow()
{
return counterNow;
}

public static int getCounterAll()
{
try
{
String strCountAll = "";

File fileCounter = new File("counter.txt");
if ( !fileCounter.exists() )
{
fileCounter.createNewFile();
}
else
{
BufferedReader bufReader = new BufferedReader(new FileReader("counter.txt"));

strCountAll = bufReader.readLine ();
counterAll = Integer.parseInt ( strCountAll );

bufReader.close ();
}

}
catch ( IOException e )
{
System.out.println ( e.toString() );
}

return counterAll;
}
}


红色字段就不用了,这个只要统计一下counterNow--就可以了。在访问关闭的时候不需要统计等访问人数。总访问人数是不断增加的

而且你在这个时候有可能又new了一个新的统计存储文件在原原文有可能丢失的情况下
am2000 2008-11-21
  • 打赏
  • 举报
回复
总访问人数好象每隔一个星期就重新统计,是什么原因?

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧