A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙浩 中级黑马   /  2012-6-17 16:02  /  2149 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请帮我分析一下文件读取这两种写法,为何第二种有误:
注: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();
                }
        }
}


评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 鼓励一下

查看全部评分

6 个回复

倒序浏览
本帖最后由 李盼 于 2012-6-17 16:06 编辑

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

int num=0;

while ( (num=fileReader.read() ) != -1) {
                                System.out.print((char)num);
                        }

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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:11
public class FileRead {
        public static void main(String[] args) {
                try {

而且你在 while 循环体里面 也进行了 read() 操作,

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
谢谢各位!
回复 使用道具 举报
楼主,这里我主要跟你解析第二种的结果为什么跟第一种的结果不一样,你看下面的解析就明白了


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();
                                  }
                  }
        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马