编程检查d: est.txt文件是否存在,若在则显示该文件的名称和内容。
下面放两种方法
老师写的:
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 5 //1、编程检查d: est.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:WINDOWSsetuplog.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类型的数据混淆了。