下面是我写的一个简单的计数器,但是不起作用,我想实现的是这样的功能,每次执行这个程序的时候,它会从一个文件中读取文件里面的数据然后加1在把它写进去,这样就实现了一个类似于网站访问量的计数器。但为什么写不进去的呢,不知道是为什么,各位高手帮我看看吧。import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Serializable;
public class Count implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
static int i=0;
public void getNum() throws IOException{
try {
BufferedWriter writer=new BufferedWriter(new FileWriter("count.txt"));
BufferedReader reader=new BufferedReader(new FileReader("count.txt"));
if(reader.readLine()!=null){
i=Integer.parseInt(reader.readLine().trim());
i++;
reader.close();
writer.write(i);
writer.close();
System.out.println("写进去的是:"+i);
}else{
i=1;
reader.close();
writer.write(i);
writer.close();
System.out.println("第一次写进去的是:"+i);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
new Count().getNum(); }}它每次执行都是执行else后面的那段程序,这是为什么呢。
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Serializable;
public class Count implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
static int i=0;
public void getNum() throws IOException{
try {
BufferedWriter writer=new BufferedWriter(new FileWriter("count.txt"));
BufferedReader reader=new BufferedReader(new FileReader("count.txt"));
if(reader.readLine()!=null){
i=Integer.parseInt(reader.readLine().trim());
i++;
reader.close();
writer.write(i);
writer.close();
System.out.println("写进去的是:"+i);
}else{
i=1;
reader.close();
writer.write(i);
writer.close();
System.out.println("第一次写进去的是:"+i);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
new Count().getNum(); }}它每次执行都是执行else后面的那段程序,这是为什么呢。
还是有别的数据?
你的程序有这样三个大的问题
1.BufferedReader的readLine方法你没有搞懂,每次readLine之后读取文件的位置都会下移一行,而你的程序仅仅只是向文件写入了一个数字而已,所以第一次调用readLine之后下面的两次调用肯定不起作用,真正的文件第一行的数据没读出来
2.Writer的写操作也有问题,你直接将一个Int数写到文件里面,你打开文件看下,写入int 1其实显示的是r这个字符,因此应该是将int数转化为字符串写到文件
3.你程序的读写文件流混在了一起,上来就打开一个文件流,这样的结果就会让原来的count.txt文件内容“暂时”被清空而每次都是readLine返回null
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Serializable;
public class Count implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
static int i=0;
public void writeNum()throws IOException{
//下面这两行代码不能颠倒,否则就导致 writer将原来的文件内容暂时覆盖
//原来的内容无法读出
int num=readNum()+1;
BufferedWriter writer=new BufferedWriter(new FileWriter("count.txt"));
System.out.println("待写入的num="+num);
writer.write(new Integer(num).toString());
writer.close();
}
public int readNum() throws IOException{
BufferedReader reader=null;
try {
//
reader=new BufferedReader(new FileReader("count.txt"));
String numStr="0";
if((numStr=reader.readLine())!=null){
System.out.println(numStr);
i=Integer.parseInt(numStr.trim());
}else{
i=0;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
reader.close();
}
return i;
}
public static void main(String[] args) throws IOException {
new Count().writeNum(); }}
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Serializable;
public class Count implements Serializable{
private static final long serialVersionUID = 1L;
static int i=0;
public void getNum() throws IOException{
try {
BufferedReader reader=new BufferedReader(new FileReader("c:/count.txt"));
BufferedWriter writer=null;
String str=reader.readLine();
if(str!=null){
i=Integer.parseInt(str.trim());
i++;
reader.close();
writer=new BufferedWriter(new FileWriter("c:/count.txt"));
writer.write(String.valueOf(i));
writer.flush();
writer.close();
System.out.println("写进去的是:"+i);
}else{
i=1;
reader.close();
writer=new BufferedWriter(new FileWriter("c:/count.txt"));
writer.write(String.valueOf(i));
writer.flush();
writer.close();
System.out.println("第一次写进去的是:"+i);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
new Count().getNum(); }}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Serializable;
public class Count implements Serializable{
private static final long serialVersionUID = 1L;
static int i=0;
/**
*
* @param pathName 路径名
* @param fileName 文件名
* @return FileReader
*/
private FileReader getFileReader(String pathName,String fileName){
String fullName=pathName+File.separator+fileName;
File path=new File(pathName);
if(!path.exists()){
path.mkdirs();
}
File file=new File(fullName);
try {
if(!file.exists()){
file.createNewFile();
}
} catch (IOException e1) {
e1.printStackTrace();
}
FileReader fr=null;
try {
fr=new FileReader(fullName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return fr;
}
/**
*
* @param pathName 路径名
* @param fileName 文件名
* @return FileReader
*/
public void getNum(String pathName,String fileName) throws IOException{
try {
String fullName=pathName+File.separator+fileName;
BufferedReader reader=new BufferedReader(getFileReader(pathName,fileName));
BufferedWriter writer=null;
String str=reader.readLine();
if(str!=null){
i=Integer.parseInt(str.trim());
i++;
reader.close();
writer=new BufferedWriter(new FileWriter(fullName));
writer.write(String.valueOf(i));
writer.flush();
writer.close();
System.out.println("写进去的是:"+i);
}else{
i=1;
reader.close();
writer=new BufferedWriter(new FileWriter(fullName));
writer.write(String.valueOf(i));
writer.flush();
writer.close();
System.out.println("第一次写进去的是:"+i);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
new Count().getNum("c:/","count.txt");
new Count().getNum("c:/count","count.txt");
}}
是正确的,是从1开始。但new Count().getNum("c:/count","count.txt");
就不是从1开始的,它是接着上次的那个数开始的。不过,这位大哥已经帮我解决了所有的问题了,太感谢你了。这正是我想要的,谢谢你了哦。也该结贴了。呵呵