我使用FileInputStream和FileOutputStream从UTF-8中的文本文件中读取字符,并将数据写入另一个文件(实质上是复制内容)。
FileInputStream串行读取1字节,FileOutputStream将一个字节串行写入文本文件。
我第一次这样做是为了正常输入英文内容的.txt文件。起作用了,这是应该的。然后,我修改了我的输入文本文件,并在其中写了一些日语字符(使用谷歌翻译)。每个字符为3个字节。
我再次对新的文本文件进行了同样的处理,这也非常有效。因为一次只读取一个字节,所以信息不应该被破坏(因为每个日文字符是3个字节)。我想问一下,为什么FileInputStream也使用3字节字符。这是密码。
public class Test {
public static void main(String[] args) throws IOException{
FileInputStream in=null;
FileOutputStream out=null;
try{
File f=new File("C:/Users/harsh/Desktop/xanadu.txt.txt");
in=new FileInputStream(f);
out=new FileOutputStream("C:/Users/harsh/Desktop/xanadu333.txt");
int c;
while((c=in.read())!=-1){
out.write(c);
}
}
finally{
if(in!=null){
in.close();
}
if(out!=null){
out.close();
}
}
}
}编辑-将文本文件看作是私の名前はアンソニーです(我的名字是Anthony),一个39字节的文件。我得到相同的输出,即输出文本文件中的私の名前はアンソニーです。此外,我还在out.write(97) //97 as ascii of a之后编写了out.write(c),然后输出文件都被破坏了。
发布于 2017-09-20 07:28:41
当您使用UTF-8编码将日语字符写入文件时,您实际上是在向它写入三个字节。
您声明的循环不关心字符,而是关心字节。
while((c=in.read())!=-1){
out.write(c);
if(c=='r'){
break;
}
}因为输入文件包含三个字节,所以它只循环三次。
编辑:您在out.write(c)之后直接执行out.write(97)后破坏一切的原因是,表示单个日语字符的三个字节不再是连续的。这破坏了UTF-8的编码。
https://stackoverflow.com/questions/46315657
复制相似问题