黑马程序员技术交流社区
标题:
求助:关于文件读取
[打印本页]
作者:
孙浩
时间:
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