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;
}
我的问题是:
关于从JavaDoc中读取文件,有两件事需要注意- 返回: 数据的下一个字节,如果到达文件末尾,则为-1
-1
将是有效的字节
值。但是通过使用int
他们可以将其保留为特殊的eof
值。该值恰好是-1
,但这就是它们返回int
的原因李>
char
将映射到代码单位int
值表示所有Unicode代码点,包括补充代码点。int的低(最低有效)21位用于表示Unicode代码点,高(最高有效)11位必须为零。除非另有规定,有关补充字符和代理字符值的行为如下:
而
utf-8
符合该值范围,前24位为0,后8位为字节asint
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代码点重叠。