2015-06-20 68 views
1

我是Java新手。我正在学习fileIO。我正在写一个小程序在txt文件中显示内容。我的代码如下:java读取文件----为什么我的代码工作

import java.io.*; 

public class Readf { 
    public static void main(String arg[]) throws IOException { 
      FileInputStream in = null ; 
      try { 
        in = new FileInputStream("input.txt"); 
        int c; 
        String cs=""; 
        while ((c=in.read())!=-1) { 
          cs = cs + (char)c; 
          if ((char)c=='\n') { 
            System.out.println(cs); 
            cs=""; 
          } 
        } 

      } finally { 
        if (in != null) { 
          in.close(); 
        } 
      } 
    } 
} 

我正在阅读在线教程。它告诉我用int变量读取文件。由于我想在char中显示内容,我将它们转换为char类型,并将它存储到一个sting中,并且它工作了!在Java中,int变量是32位,但是char变量是16位。每次我读32位整数时,我会将它们转换为16位字符。为什么结果不是混乱?

+0

如果你想混沌,在你的输入文件中使用BMP以外的字符,例如: – ninjalj

+1

实际上,任何不是ASCII的东西都是很好的反例。尝试一个有'é'或'ç'的文件。或者阿拉伯语,中文等东西,像猫 – RealSkeptic

回答

0

您可能会保留在您的文件中的所有字符将在java工作的16位unicode字符集范围内。因此,将char(16位)转换为int(32位)或反之亦然应该没有任何问题。

0

其实,我尊重你的坚持理解,而不是仅仅得到理想的输出。

问题是,您扫描的每个字符的ASCII值低于2^8,这使得它适合于32位的int,适合于16位的char。 你正在采取的混乱将出现在一个ASCII码值适合32位,但不是在16位,这将不存在ascii字符集,但在unicode的情况下。在的FileInputStream类

check the ascii table

1

检查read()方法的描述:

FileInputStream.read()

正如你可以在说明书中看到,读出方法“读取数据的一个字节从该输入流“这意味着你的程序中的所有整数(c变量)将始终小于或等于255并且大于或等于0.读取txt文件或pdf,png等并不重要。

您可以尝试打印的东西时,c是大于255,如:

if (c > 255) { 
    System.out.println("c>255"); 
} 

和“c> 255”将永远不会被打印检查。

因为int已签名,您还可以检查c是否小于零。

if (c < 0) { 
    System.out.println("c<0"); 
} 

并且再次“c < 0”也不会被打印。

当然,只有最后一个int值为-1。

因此,从范围< 0,255>的每个int都可以安全地转换为字符而不会丢失任何信息。

+0

检查此https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html – 2015-06-20 18:07:36

+0

我认为**字节**将介于-128和+127(包含)不是255,除非它是无符号的。 – 2015-06-20 18:13:11

+0

是的,Java中的字节是带符号的,范围是<-128, 127>。在read()方法的javadoc中,存在“一个数据字节”,我将其理解为“8位数据”,它不一定是Java字节原始类型。我认为这就是为什么read()方法不会返回字节而是int。 –

相关问题