Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个演员是如何工作的?_Java_Casting - Fatal编程技术网

Java 这个演员是如何工作的?

Java 这个演员是如何工作的?,java,casting,Java,Casting,我正在修改类FileInputStream,我看到一些读取文件的示例,这让我想知道这些示例中的强制转换实际上是如何工作的。这是其中一个例子: public String read() { String content = ""; try { input = new FileInputStream(file); int chr = 1; // reads a byte and returns it as a integer.

我正在修改类
FileInputStream
,我看到一些读取文件的示例,这让我想知道这些示例中的强制转换实际上是如何工作的。这是其中一个例子:

public String read()
{
    String content = "";
    try
    {
        input = new FileInputStream(file);
        int chr = 1;

        // reads a byte and returns it as a integer. 
        // Returns -1, if there's no more bytes to read.
        while ((chr = input.read()) != -1)
            content += (char) chr;//CAST

        input.close();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }

    return content;
}
我的问题是:

  • 为什么read返回整数而不是字节?有什么好处

  • 从整数到字符的转换是如何工作的


  • 关于从JavaDoc中读取文件,有两件事需要注意-

    返回: 数据的下一个字节,如果到达文件末尾,则为-1

  • -1
    将是有效的
    字节
    值。但是通过使用
    int
    他们可以将其保留为特殊的
    eof
    值。该值恰好是
    -1
    ,但这就是它们返回
    int
    的原因
  • 对于所有其他值,转换为
    char
    将映射到代码单位
  • int
    值表示所有Unicode代码点,包括补充代码点。int的低(最低有效)21位用于表示Unicode代码点,高(最高有效)11位必须为零。除非另有规定,有关补充字符和代理字符值的行为如下:


    utf-8
    符合该值范围,前24位为0,后8位为字节
    as
    int
    0-255。因此,cast使用ISO-8859-1编码将
    字节流
    (s)转换为
    字符串
    ,因为它与前256(0-255)个Unicode代码点重叠,因此它成为人类可读的文本。

    问题涉及InputStream API,但这个答案与Reader API有关。前者使用字节,后者使用字符。@MartinEllis+1非常感谢(我欢迎建设性的批评)!编辑。我相信这样更好?答案仍然是指字符和代码点。我认为它们与输入流无关。或者更确切地说,如果它们相关,InputStream可能会被一个读取器包装。@MartinEllis您如何定义Java如何将8位字节扩展为Unicode字符?好的,忽略我之前的评论。我感到困惑的是,重复的问题问了一些稍微不同的问题。值得一提的是,代码使用ISO-8859-1将流解析为字符串,因为它与前256个Unicode代码点重叠。