- 通过io操作实现一个网站计数器,如果一个网站要记录从开站开始到今天的访问人数
- 该技术有以下注意问题
- 该计数器必须在网站宕机之后可以将数据保存下来
- 考虑到计数器的访问量可能很大,所以不应该使用int类型,可以使用long或者Biginteger
- 如果要进行访问肯定是一个用户第一次打开才会开始计数
- 如果要进行数据的修改处理操作,那么一定会牵扯到一个同步的问题
- 现在web项目的根目录处建立一个count.txt文件,这个文件描述的就是初期的访问量数,可以设置为0
image.png
- 建立一个访问技术的程序文件:count_info.jsp
<%@ page pageEncoding="utf-8"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%
request.setCharacterEncoding("utf-8");
%>
<%!
//定义读取文件的名称
public static final String COUNT_FILE = "/count.txt";
//定义读取文件的方法
public long read()throws Exception{
long count = 0;
File file = new File(this.getServletContext().getRealPath(COUNT_FILE));
Scanner scanner = new Scanner(file);
if(scanner.hasNext()){
count = Long.parseLong(scanner.next());
}
scanner.close();
return count;
}
//定义写入文件的方法
//考虑到多个用户同时访问的问题,所以使用synchronized同步方法,以保证数据的准确性
//考虑到网站的读取速度,在写入文件的同时返回读取文件的内容
public long save()throws Exception{
//先获取到原文件中的数据
long orgCount = read();
orgCount++;
PrintStream ps = new PrintStream(new File(this.getServletContext().getRealPath(COUNT_FILE)));
ps.print(orgCount);
//一定要关闭文件流
ps.close();
return orgCount;
}
%>
<%
long count = 0;
//判断本次是否是一个新的用户访问,或者是新的一个页面访问
if(session.isNew()){
//如果是一个新的用户则进行计数更新
count = save();
}else{
//如果不是新用户,则得到原有的访问数
count = read();
}
%>
<h1><%=count%></h1>
- 以上的程序却是考虑到了同步问题,但是过多的同步会导致页面浏览数速度变慢,所以在实际开发会使用更高级的技术完成网站计数器的功能
网友评论