我正在尝试使用字节流读取包含普通Text数据的文件。我理解在字节流中,每个字节将被逐个读取。因此,如果我通过字节流读取文本文件中的数据Hi How are you!!!!!!
,那么它应该给我相应的每个字符的Unicode,但它给我一个不同的输出,不映射到utf或ascii等价物
以下是我的计划
package files;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileBaiscs {
public static void main(String[] args) throws IOException {
String strPath = "D:\\Files\\New.txt";
File objSrcFile = new File (strPath);
if (objSrcFile.exists()==false)
{
System.out.println("The Source File is not Present");
System.exit(0);
}
FileInputStream objIpStream = new FileInputStream(objSrcFile);
while ((objIpStream.read())!=-1)
{
System.out.println(objIpStream.read());
}
objIpStream.close();
}
}
我的控制台中的输出是:
105
72
119
97
101
121
117
33
33
33
新文本文件中的数据为 - Hi How are you!!!!!!
我希望输出是整数,它们相当于每个字符的上限。如果我的理解是错误的,请告诉我。
答案 0 :(得分:1)
下面
while ((objIpStream.read())!=-1)
{
System.out.println(objIpStream.read());
}
您正在阅读2个字节而不是1个字节。第一个是在条件中读取,第二个是在循环体中读取。 你应该做的是
byte b;
while ((b=objIpStream.read())!=-1)
{
System.out.println(b);
}
答案 1 :(得分:0)
你的误解来自你认为字节是字符的事实;他们不是。
为了读取字符,您必须首先将字节转换为字符,这是使用称为字符编码的过程完成的。 InputStream
不会执行此操作,但会Reader
。
因此,请尝试:
final Path path = Paths.get("F:\\Files\\New.txt");
try (
final BufferedReader reader = Files.newBufferedReader(path,
StandardCharsets.UTF_8);
) {
int c;
while ((c = reader.read()) != -1)
System.out.println(c);
}
此外,在原始代码中,每个循环读取两个字节。