下面是我写的一个简单的计数器,但是不起作用,我想实现的是这样的功能,每次执行这个程序的时候,它会从一个文件中读取文件里面的数据然后加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后面的那段程序,这是为什么呢。

解决方案 »

  1.   

    我想问下你,在文件里面难道就只是存一个int数值么?
    还是有别的数据?
      

  2.   

    我就当你文件里面就存一个数据了(不过只是存一个Int数据何必大费周折写到文件中呢)
    你的程序有这样三个大的问题
    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();    }}
      

  3.   

    你的代码问题太多……package com.CSDN;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 {        
             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();    }}
      

  4.   

    恩,我按照你的说法,事先在c盘底下建立好count.txt文件再运行就没事,但如果不事先建立好就出事。我想实现的效果就是在运行的时候才创立这个文件夹,还有方法吗,我觉的应该是可以的啊。
      

  5.   

    那你可以看一下java.io.File的方法。
      

  6.   


    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");
        }}
      

  7.   

    太感谢你了,基本上已经实现了,就是还有一个小问题,不知道你有没有测试过了呢,就是运行几次后,我再把c盘下的count文件删了,new Count().getNum("c:/","count.txt");
    是正确的,是从1开始。但new Count().getNum("c:/count","count.txt");
    就不是从1开始的,它是接着上次的那个数开始的。不过,这位大哥已经帮我解决了所有的问题了,太感谢你了。这正是我想要的,谢谢你了哦。也该结贴了。呵呵