问题:在一个文件中写入若干行数据,然后对文件进行修改..方法是:先把文件中的所有数据放到一个字符串里,然后对字符串进行修改,修改后在把该字符串写进文件中..但是每修改后一次再写进文件后,文件中最前面就多了一个null...再读出的文件的时候就把null也给读出来了.....请问高手..这是怎么回事...?我的测试代码:package com.feng.io;import java.io.*;public class AccessFile {
 
 String name;//姓名
 String card;//卡号
 String password;//密码

public static void main(String[] args) {
// TODO Auto-generated method stub
AccessFile af=new AccessFile();
af.openAccount();
af.readFile();
System.out.println();
af.changeFile();
af.readFile();
}

AccessFile(){}

protected void openAccount() //开设新户
{
try {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
RandomAccessFile raf=new RandomAccessFile("E:/test.txt","rw");//bankdata.txt用来存储开户信息

System.out.println("请添加账户姓名:");
String name=br.readLine()+"\t\t";
raf.seek(raf.length());
raf.writeBytes(name);

System.out.println("请给账户开设卡号:");
String card=br.readLine()+"\t\t";
raf.seek(raf.length());
raf.writeBytes(card);

System.out.println("请给帐户开设密码:");
String password=br.readLine();
raf.seek(raf.length());
raf.writeBytes(password+"\n");

System.out.println("\n已开户成功!");
raf.close();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

protected void readFile(){//读取数据
File f=new File("E:/test.txt");
if(f.exists())
{
try {
BufferedReader br=new BufferedReader(new FileReader(f));
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
String str=br.readLine();

System.out.println("请稍等,两秒后将显示数据.......");
Thread.sleep(2000);
System.out.println();
System.out.println("数据如下:\n");
if(str==null){//这里为什么不可以用str.equals("")
System.out.println("还没有帐户信息,请开设帐户");
}else{
   System.out.println("姓名\t\t"+"账户卡号\t\t"+"帐户密码");
while(str!=null){
String[] info=str.split("\n");
//System.out.println(info[0]);

for(int i=0;i<info.length;i++) {
System.out.println(info[i]);
//System.out.println("test all view");

}
str=br.readLine();//读取下一行内容
}
}
br.close();

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
try {
f.createNewFile();
this.readFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

protected void changeFile()//修改数据
{
String changename=null;//修改后的姓名
String nameline=null;//找到包含姓名的行数据
boolean flag=false;
String allstr=null;//未修改前的全部字符串
String replacestr=null;//修改后的全部字符串
try{
File f=new File("E:/test.txt");
if(f.exists()){
BufferedReader br=new BufferedReader(new FileReader(f));
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
RandomAccessFile raf=new RandomAccessFile("E:/test.txt","rw");
String str=br.readLine();
System.out.println("请输入要修改的姓名:");
name=br1.readLine();
System.out.println("请修改姓名:");
changename=br1.readLine();
while(str!=null){
String[] info=str.split("\n");
for(int i=0;i<info.length;i++){
if(info[i].indexOf(name)!=-1){
nameline=info[i];
flag=true;
}
allstr+=info[i];
}
str=br.readLine();
}
if(flag==true){
replacestr=allstr.replaceFirst(nameline, nameline.replaceFirst(name, changename));
this.clearData();
raf.writeBytes(replacestr+"\n");
System.out.println("帐户已成功修改!");

}
}else{
try{
f.createNewFile();
this.changeFile();
}catch(Exception e){
e.printStackTrace();
}
}
}catch(Exception e){
e.printStackTrace();
}
}


protected void clearData(){//清除所有数据,写这个方法为了存取款用到的
File f=new File("E:/test.txt");//创建File实例
if(f.exists())
{
try {
PrintWriter pw=new PrintWriter(new BufferedWriter(new FileWriter(f)));
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
pw.write("");//向test.txt中写入一个空字符串即可
pw.close(); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}大家可以copy过去测试下.

解决方案 »

  1.   

    问题是估计是出在这(我想的...)
    pw.write("");//向test.txt中写入一个空字符串即可但是我又想不出清空文件的更好的办法...有别的办法吗?
      

  2.   

    答:错误原因很简单。不是楼主所想的是那个。而是楼主犯了个低级错误啊:
    将:
    String allstr=null;//未修改前的全部字符串
    改为:
    String allstr="";//未修改前的全部字符串运行结果就正确了
      

  3.   

     String allstr=null;//未修改前的全部字符串
     初始化的问题、 改为String allstr="";觉得程序写得不太容易理解,可以简化
      

  4.   

    哦,问题解决了....
    但是我想问下
    String allstr=null;

    String allstrt="";
    有什么区别呢?...为什么当allstr=null的时候,null会被赋值给allstr呢..
    那不是和这句allstr="null";一样的了..
      

  5.   

    null是值没有分配内存空间给这个对象,都没有内存空间肯定是没有赋值,而""则是分配了内存空间,赋值了,但是只是空字符串而已,长度为0
      

  6.   

    简单的这么理解吧,null是没有值,""是有值的!
      

  7.   


    既然null没有分配内存空间,就没有赋值...那下面的代码怎么会输出null的结果呢?String str=null;
    System.out.println(str);
      

  8.   

    谢谢lz的提醒:
    应该主要是内存分配地址空间有无的区别.
    NULL代表没有分配内存空间;而""表示分配了内存空间
    null表示空对象,此时不能对该对象进行任何操作。 
    “”则表示这是一个字符串对象,其内容为空白
      

  9.   

    你们说的我也知道了但是还是不太明白。。这么说吧
    String str=null;
    String str1="";
    String str2="null";
    System.out.println(str)//语句一
    System.out.println(str1)
    System.out.println(str2)
    为什么语句一会输出null啊。也就是我发贴的问题。。如果先把allstr=nuul;的话,null就被写进文件中了
      

  10.   

               if(str==null){//这里为什么不可以用str.equals("")
                    System.out.println("还没有帐户信息,请开设帐户");
    字符比较用==,,引用的对比两者都可以吧.