网站上有一些类似的问题,但都在不同的场景中使用过。所以,我在这里问:
package Assign6B;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOpsDemo {
public static void main(String[] args) throws IOException
{
FileInputStream inputFile = null;
FileOutputStream outputFile = null;
try
{
inputFile = new FileInputStream("s:/inputFile.txt");
outputFile = new FileOutputStream("s:/outputFile.txt");
char c;
while(( c = (char) inputFile.read()) != -1)
{
System.out.println((char)c);
outputFile.write(c);
}
System.out.println("File transfer complete!");
}
finally
{
if (inputFile != null)
inputFile.close();
if (outputFile != null)
outputFile.close();
}
}
}
这是我的代码。在 while 循环条件中,首先我将其设置为将 read() 输出的 int 类型转换为 char。结果是它进入了无限循环,所有字符都被转换为“?” (ASCII:63)。然后我意识到我的char转换错误并更改了它。
但是当我将 while 条件更改为“=-2”(没有字符转换)时(这种情况永远不会发生,因此将其放入无限循环)。在这里,即使没有字符转换,文件的前(例如 10)个有效字符仍然会被转换为“?”。 (到达 EOF 后,所有无效字符都变成“?” - 我假设这是给定的)。
为什么会发生这种情况?至少应该正确读取文件的有效字符,直到遇到 EOF 并开始输入无效字符!
为什么会发生这种情况?
问题出在这一行:
while(( c = (char) inputFile.read()) != -1)
您正在执行以下操作:
-
从文件中读取一个字节。这给你一个int
它可以是 0 到 255 范围内的字节,也可以是 -1。
-
您正在将该值转换为char
。对于字节,这给出了char
值范围为 0 到 255。对于-1
演员会给你'\uffff'
.
-
您将该值分配给c
.
-
然后您可以测试该值-1
。这就是出错的地方。在这种情况下read
回-1
,您现在将评估这个'\uffff' == -1
。 LHS 转换为int
价值 ...0x0000ffff
...相比之下0xffffffff
。他们是不同的。
然后你打印'uffff'
...正在转换为'?'
当输出为默认字符集中的字符时。
代码中有两个主要错误。一、转换int
-> char
-> int
不会起作用;往上看。
其次,也是更重要的一点:
根据您实际想要实现的目标,您应该:
(还有一些关于缓冲、选择备用字符集等的其他观点,但这个答案已经太长了。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)