黑马程序员技术交流社区

标题: 求助:关于文件读取 [打印本页]

作者: 孙浩    时间: 2012-6-17 16:02
标题: 求助:关于文件读取
请帮我分析一下文件读取这两种写法,为何第二种有误:
注:G:/a.txt 文件内容为:abcdef          第一种打印的是 :abcdef    但第二种打印的是:bdf
1 .import java.io.FileNotFoundException;    import java.io.FileReader;
import java.io.IOException;

public class FileRead {
        public static void main(String[] args) {
                try {
                        //创建一个文件读取流,和已知文件相关联
                        //要保证文件是必须存在的,如果不存在会报:java.io.FileNotFoundException:(系统找不到指定的文件。)
                        FileReader fileReader = new FileReader("G:/a.txt");
                        //调用读取流的read()方法,每次读取一个字符
                        int ch = 0;
                        while ((ch = fileReader.read())  != -1) {
                                System.out.print((char)ch);
                        }
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
}

2.import java.io.FileNotFoundException;import java.io.FileReader;
import java.io.IOException;


public class FileRead {
        public static void main(String[] args) {
                try {
                        //创建一个文件读取流,和已知文件相关联
                        //要保证文件是必须存在的,如果不存在会报:java.io.FileNotFoundException:(系统找不到指定的文件。)
                        FileReader fileReader = new FileReader("G:/a.txt");
                        //调用读取流的read()方法,每次读取一个字符
                        while ( fileReader.read()  != -1) {
                                System.out.print((char)fileReader.read());
                        }
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
}



作者: 李盼    时间: 2012-6-17 16:05
本帖最后由 李盼 于 2012-6-17 16:06 编辑

while ( fileReader.read()  != -1) {
                                 System.out.print((char)fileReader.read());
你这一个循环读了两次啊,第一次读了一个字符,用于和-1比较,第二次又读了一个字符,用于打印,所以输出是每隔一个字符输出一次!
read()方法在两次调用中,值打印了其中一次的返回值!

作者: 李海晓    时间: 2012-6-17 16:08
while ( fileReader.read()  != -1) {读取了
                                System.out.print((char)fileReader.read());  为什么还要再次读取
                        }

int num=0;

while ( (num=fileReader.read() ) != -1) {
                                System.out.print((char)num);
                        }
作者: 李元峰    时间: 2012-6-17 16:11
public class FileRead {
        public static void main(String[] args) {
                try {
                        //创建一个文件读取流,和已知文件相关联
                        //要保证文件是必须存在的,如果不存在会报:java.io.FileNotFoundException系统找不到指定的文件。)
                        FileReader fileReader = new FileReader("G:/a.txt");
                        //调用读取流的read()方法,每次读取一个字符
                        int ch = 0;
                        while ((ch = fileReader.read())  != -1) {
                                System.out.print((char)ch);
                        }
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
}

2.import java.io.FileNotFoundException;import java.io.FileReader;
import java.io.IOException;


public class FileRead {
        public static void main(String[] args) {
                try {
                        //创建一个文件读取流,和已知文件相关联
                        //要保证文件是必须存在的,如果不存在会报:java.io.FileNotFoundException系统找不到指定的文件。)
                        FileReader fileReader = new FileReader("G:/a.txt");
                        //调用读取流的read()方法,每次读取一个字符
                        while ( fileReader.read()  != -1) {
                                System.out.print((char)fileReader.read());
                        }
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
}
楼主看 我标注红色的部分 ,你这两处的代码不一致,所以结果不一致是必然的,这里的read()方法会一次 读取一个字符 并返回 accii 码
你在上一个程序中 用 ch 来接收了 read() 方法的返回值,但是 下面的却没有,也就是说,在while( fileReader.read()  != -1)里面 你已经读取了 文件的一个字符了
但是却没有打印,这样没读取一次,指针就向后移动一下,你只是对下一次的读取打印了System.out.print((char)fileReader.read()); 就是这里

作者: 李元峰    时间: 2012-6-17 16:12
李元峰 发表于 2012-6-17 16:11
public class FileRead {
        public static void main(String[] args) {
                try {

而且你在 while 循环体里面 也进行了 read() 操作,
作者: 孙浩    时间: 2012-6-17 16:22
谢谢各位!
作者: 郑传庆    时间: 2012-6-17 16:28
楼主,这里我主要跟你解析第二种的结果为什么跟第一种的结果不一样,你看下面的解析就明白了


2.import java.io.FileNotFoundException;import java.io.FileReader;
import java.io.IOException;


       public class FileRead {
                      public static void main(String[] args) {
                                    try {
                        
                              FileReader fileReader = new FileReader("G:/a.txt");
                        
                              while ( fileReader.read()  != -1) {
/*
  * 这里为什么打印出来的结果不一样,因为你while循环读取了一个字符,到打印的时候又再去读取了第二个
  * 字符,所在打印语句的时候就输出了第二个字符出来。
  * 道理其实很简单,就是你读取一个字符后在继续读取一个字符。
  */
                             System.out.print((char)fileReader.read());
                                                     }
                                   } catch (FileNotFoundException e) {
                                                   e.printStackTrace();
                                   } catch (IOException e) {
                                                  e.printStackTrace();
                                  }
                  }
        }





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2