编程检查d:\test.txt文件是否存在,若在则显示该文件的名称和内容。

下面放两种方法

老师写的:

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileNotFoundException;
 4 
 5 //1、编程检查d:\test.txt文件是否存在,若在则显示该文件的名称和内容。
 6 //老师写的,可以读取汉字
 7 
 8 public class SY61 {
 9     public static void main(String[] args) throws Exception {
10         File f= new File("d:\\test.txt");
11         if(f.exists()){
12             System.out.println("文件存在 " + f.getAbsolutePath() );//显示文件路径
13             FileInputStream fis = new FileInputStream(f);
14             byte[] b = new byte[1024];//以字节数组存放
15             int len = 0;
16             while(( len = fis.read(b)) != -1 ){
17                 System.out.println(new String(b,0,len));
18             }
19             fis.close();
20             
21         }
22         else
23         {
24             System.out.println("文件不存在");
25         }
26     }
27 
28 }

这种可以读取汉字.下面是我自己写的,不能读取汉字,原本该是汉字的地方是问号.

 1 /*编程检查C:\WINDOWS\setuplog.txt文件是否存在,
 2  * 若在则显示该文件的名称和内容。*/
 3 //自己写的,读取不了汉字
 4 import java.io.File;
 5 import java.io.FileInputStream;
 6 
 7 public class Test6_1 {
 8 public static void main(String[] args) throws Exception{
 9     FileInputStream fin=null;
10     int c=0;
11     File f=new File("d:\\test4.txt");
12     if(f.exists()){
13         System.out.println("文件存在");
14         fin=new FileInputStream(f);
15         c=fin.read();
16         while(c!=-1){
17             System.out.print((char)c);
18             c=fin.read();
19         }
20         System.out.println();
21         System.out.println("File name:"+f.getName());
22     }
23     else
24         System.out.println("文件不存在");
25     fin.close();
26 }
27 }

那么问题来了,FileInputStream的read(byte[])和read()方法有什么异同??

read(byte[])返回的是一个整型的数,当到文件的尾时候返回-1,也就是说read一次读取的字节数为字节数组的长度。

read()方法一次读取一个字节并返回 那返回类型不应该是byte吗 为什么是int呢??

输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。

此处粘贴一位大神的回答:

如果因为已经到达流末尾而没有可用的字节,则返回值 -1。我们需要使用一个不可能在数据中出现的值来表示流末尾, Java中就是用-1来表示这个末尾的, 因为-1不会在数据中出现,如果返回byte, 同样无法表示流末尾., byte的取值范围是从-128到127,这个范围内所有的数据, 都有可能在数据中出现,read()方法需要返回一个特殊的值来表示流末尾, 这个值不能和流中的数据重复,read()方法内部将读取到的所有字节高位补0转为int返回, 这样做所有的数据都会是正数,这时就可以用-1表示流末尾了,而改变后的数据只要强转回byte, 就可以得到原有数据。也就是说把一个字节的数据和java中的byte类型的数据混淆了。

 

posted @ 2017-12-09 16:38  WETYUIOASHZXCVBNM  阅读(1473)  评论(0编辑  收藏  举报