-------------------
读文件输出到终端范例代码:
import java.io.*;class readfile{
public static void main(String[] args)throws IOException,ArrayIndexOutOfBoundsException{


File f=new File(args[0]);
if(f.exists()){
FileReader Rfile=new FileReader(f);
BufferedReader r=new BufferedReader(Rfile);
String value=r.readLine();
while(true){
System.out.println(value);
if(value==null) break;
value=r.readLine();
}
Rfile.close();
}
}
}
-------------------
因为初学,所以想参照以上代码我打算写个复制文件的代码加深理解应用
以下代码是昨天初贴完全没修改的
后来求教csdn各位以后终于完成了目的
但是后来细细研究这个错误代码的时候,两个>>>>>>输出语句中间抛出的空引用异常是怎么抛出的一直都不明白line是因为引用了R1.我在//read file1里面还有异常语句前用输出语句调试,输出的果然都是null 这是为什么啊?读文件部分明明是照示范代码写的.示范代码也调试过了,没错..
只关于此异常不探讨其他错误     求解!
------------------------------------------
初始代码:
import java.io.*;public class filetest{
public static void main(String[] args) throws IOException{

try{
File f1=new File(args[0]);
File f2=new File(args[1]);

//new file1 
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));

FileWriter writef1=new FileWriter(f1);
BufferedWriter w1=new BufferedWriter(writef1);

//read file1
System.out.println(f1);
FileReader r1=new FileReader(f1);
BufferedReader R1=new BufferedReader(r1);
System.out.println(R1.readLine());


//write file2
FileWriter writef2=new FileWriter(f2);
BufferedWriter w2=new BufferedWriter(writef2);

//这里f1.exists()的值也是1
if(!f1.exists()) {
f1.createNewFile();
System.out.println("文件"+args[0]+"不存在!新建..\n请输入文件内容:\n");

while(true){
System.out.print(">");
String line =stdin.readLine();
if(line!=null&&line.equals("quit")){
break;
}else w1.write(line);
 }

}else{
System.out.println("文件 "+args[0]+" 已存在,复制到文件 "+args[1]+" 中.. ");
}
f2.createNewFile();
while(true){
System.out.println(R1.readLine());
String line=R1.readLine();
System.out.println(">>>>");
line=line.toUpperCase();
System.out.println(">>>>");
if(line!=null){
break;
}else w2.write(line);
}

w2.flush();
w2.close();
w1.flush();
w1.close();
writef2.close();
writef1.close();

 }catch(ArrayIndexOutOfBoundsException e){
 System.out.println("没有输入参数,或参数不匹配");
 }
}
}
----------------------------------------------------

解决方案 »

  1.   

    //我的代码,呵呵,关于文件移动的代码!
    //呵呵
    package cn.cncn.file;import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;class SmartFile{
    SmartFile(){

    }
    public static void main(String [] args){//这个用于测试
    SmartFile sf = new SmartFile();
    Util.print(Util.pre());
    sf.type(Util.dir()+Util.pre()+"test.txt");
    sf.move("D:\\text.txt", "test.txt");
    sf.move("C:", "test.txt","mytest");
    //sf.copy("D:\\text.txt", "test.txt");
    }
    public void makedir(String file){
    File y = new File (file);
    y.mkdir();
    Util.print(file);
    }
    public void move(String dest ,String src,String name){
    String filename=dest+name;
    try {
    FileInputStream fis = new FileInputStream(src);
    FileOutputStream fot = new FileOutputStream(filename);
    byte buffer[ ] = new byte[1024];
    fis.read(buffer);
    fot.write(buffer);
    Util.print("File"+src+"Move To->"+dest);
    fis.close();
    fot.close();
    } catch (IOException e) {
    Util.print("Failed To Move The File"+src);
    Util.print("The Reason Is");
    e.printStackTrace();
    }
    }
    public void move(String dest ,String src){
    move(dest,src,"");
    }
    public void del(String dest){
    File file = new File(dest);
    file.delete();
    }
    public void copy(String dest ,String filename){
    move(dest,filename);
    del(filename);
    Util.print("Copy Completed");
    }
    public void type(String filename){
    try {
    BufferedReader BRin = new BufferedReader(new InputStreamReader(
    new FileInputStream(filename)));
    String str;
    while ((str = BRin.readLine()) != null) {
    System.out.println(">>" + str);
    }
    BRin.close();
    } catch (IOException e) {
    Util.print();
    Util.print("IO-ExCeption");
    e.printStackTrace();
    }
    }
    }
      

  2.   

    //这个是为了方便,写的一个util呵呵,欢迎交流
    package cn.cncn.file;public class Util {
    public static String pre(){
    String prefix =System.getProperty("file.separator");
    return prefix;
    }
    public static String dir(){
    String dir =System.getProperty("user.dir");
    return dir;
    }
    public static void print(String str){
    System.out.println(str);
    }
    public static void print(){
    System.out.println("------------------------");
    }
    }
      

  3.   

    若f1存在,FileWriter writef1=new FileWriter(f1);会清空f1的内容,如果想以追加方式打开f1则需要这样:FileWriter writef1=new FileWriter(f1, true);。f1为空则R1.readLine();返回null
    若f1不存在,在调用w1.flush();之前要写入的数据都保存在缓冲区中并没有真正写入文件,此时f1是个空文件,R1.readLine();返回null
      

  4.   

    he he!又是你啊..太感谢了1.若f1存在,FileWriter writef1=new FileWriter(f1);会清空f1的内容,如果想以追加方式打开f1则需要这样:FileWriter writef1=new FileWriter(f1, true);。
    //这个我倒是知道2.f1为空则R1.readLine();返回null
    //这我也清楚,调试时候也输出了null3.若f1不存在,在调用w1.flush();之前要写入的数据都保存在缓冲区中并没有真正写入文件,此时f1是个空文件,R1.readLine();返回null
    //但是在调试前自己建了文件并输入了东西保存以后也会有这个异常,而且程序执行后两个文件都会被清成0字节,真怪问:请问你的意思是说在读前要完成前面定义的写流吗?调用flush();什么的
    不能同时创建输入输出流?应该不是这个意思吧,我乱了..
      

  5.   

    完全不知道你在弄什么那几个createNewFile是不必要的, 直接使用输出流写入即可给个小建议: 如果想试验自己的想法, 最好每次试验一个, 不然程序很难看得懂...
      

  6.   

    jk88811  我觉得这段代码还满清晰的而且我开始就说明了,关于这段程序的实现问题早就没问题了现在贴出这段旧代码,我要问的是抛出的空引用异常的原因是你自己要这么看下去的我试验过范例代码,没问题,但是我那么加进去就出问题了,这是我的疑问谢谢你的小建议,不过我也一直是那么做的createNewFile是文件不存在的时候才用的,有判断前面说过了,在GrazyGou前一贴的帮助都没问题了已经不讨论这样的细节了,麻烦好好看看我的话.我真的很郁闷..
      

  7.   

    CrazyGou() : 
       
    先判断f1是否存在,若存在就没必要创建对f1的输出流
    你可以对照正确的程序看一下
    ------------------------------
    喔,你是说要判断然后才写这个:
    //new file1 
    BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
    FileWriter writef1=new FileWriter(f1);
    BufferedWriter w1=new BufferedWriter(writef1);
    那个异常是因为这个引起的吗?问:不过,那个引用是读文件的,这两者有关系吗?  
     
      

  8.   

    异常是:
    line=line.toUpperCase();这句发出的
    因为
    String line=R1.readLine();
    又因为
    FileReader r1=newFileReader(f1);
    BufferedReader R1=new BufferedReader(r1);
    调试的时候知道r1的时候就是null
    我一直想问的就是这个,为什么我以为你说:
    先判断f1是否存在,若存在就没必要创建对f1的输出流
    是让我去掉
    //new file1 
    BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
    FileWriter writef1=new FileWriter(f1);
    BufferedWriter w1=new BufferedWriter(writef1);我刚才去掉了这个然后手动建立1.txt 2.txt试验的确没有那个异常了如下:
    -----------------------
    import java.io.*;public class test{
    public static void main(String[] args) throws IOException{

    try{
    File f1=new File(args[0]);
    File f2=new File(args[1]);



    //read file1
    System.out.println(f1);
    FileReader r1=new FileReader(f1);
    BufferedReader R1=new BufferedReader(r1);
    System.out.println(R1.readLine());


    //write file2
    FileWriter writef2=new FileWriter(f2);
    BufferedWriter w2=new BufferedWriter(writef2);




    while(true){
    System.out.println(R1.readLine());
    String line=R1.readLine();
    line=line.toUpperCase();
    if(line!=null){
    break;
    }else w2.write(line);
    }

    w2.flush();
    w2.close();

    writef2.close();

     }catch(ArrayIndexOutOfBoundsException e){
     System.out.println("没有输入参数,或参数不匹配");
     }
    }
    }----------------------
    这下子可以读f1然后输出到终端了,但是写不进f2
    诚心的菜菜的问两个问题1.很前面你好像说过,可是我不太明白
    FileWriter writef1=new FileWriter(f1);
    BufferedWriter w1=new BufferedWriter(writef1);
    一开始有了这两句为什么会让
    FileReader r1=newFileReader(f1);
    BufferedReader R1=new BufferedReader(r1);
    这两句拿到的引用是空?
    是不是打开文件写的同时不允许读?就是不能同时在一个文件上建立输入和输出流?我犯的是不是这个错误?2.改成后面那个程序以后可以把f1读到终端了但是为什么没办法可以把f1写进f2注:改了程序以后都是手动建了f1: 1.txt  f2: 2.txt来测试的.
      

  9.   

    while(true){
    System.out.println(R1.readLine());
    String line=R1.readLine();
    line=line.toUpperCase();
    if(line!=null){
    break;
    }else w2.write(line);
    }
    ================================================
    三个错误:
    1.System.out.println(R1.readLine());读出一行,R1指针移到下一行,String line=R1.readLine();读到的是下一行的内容了
    2.应该先判断line是否为null再line.toUpperCase()
    3.若line为null,则break。你写反了可以同时读写
      

  10.   

    TO tang2007java:很抱歉我草率地对你的程序说出自己的想法, 既然你认为它没有问题, 那就是好的...关于createNewFile(), 你用并没有错. 我是说它并不必要, 你打开输出流, 直接写入. 如果文件不存在会自动创建, 所以你file.exists()判断的部分逻辑不是必需的...
      

  11.   

    line是null,line.toUpperCase()当然会抛空引用异常了。
      

  12.   

    TO jk88811:
    我不是说程序没有问题,我是说那些问题都在昨天解决掉了
    我想知道的只是那个空引用的问题,谢谢你提出的想法,不过目下我真的是只想知道这是为什么
    -----------
    TO CrazyGou
    我当然知道啊
    如前:
    ***************
    异常是:
    line=line.toUpperCase();这句发出的
    因为
    String line=R1.readLine();
    又因为
    FileReader r1=newFileReader(f1);
    BufferedReader R1=new BufferedReader(r1);
    调试的时候知道r1的时候就是null
    我一直想问的就是这个,为什么我以为你说:
    先判断f1是否存在,若存在就没必要创建对f1的输出流
    是让我去掉
    //new file1 
    BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
    FileWriter writef1=new FileWriter(f1);
    BufferedWriter w1=new BufferedWriter(writef1);
    ...........
    ***************所以如果文件可以在同意时间使用输入和输出流的话这个异常是怎么发出来的?
      

  13.   

    最后一次回复:
    是可以同时读写。但是,BufferedWriter写的时候是先写到缓冲区,当调用其flush或close方法的时候才将缓冲区内容写入文件,同时清空缓冲区。你上面readLine在前,flush在后,所以readLine的时候f1里面并没有内容。具体可以查API