我正在使用FileInputStream和FileOutputStream从UTF-8中的文本文件中读取字符并将数据写入另一个(基本上是复制内容)。
FileInputStream以串行方式读取1个字节,FileOutputStream将一个字节串行写入文本文件。
我首先使用英文内容输入普通输入.txt文件。工作,应该。然后我修改了我的输入文本文件,并在其中写了一些日文字符(使用谷歌翻译)。每个字符都是3个字节。
我使用新的文本文件再次执行相同的过程,这也很有效。由于一次只读取1个字节,因此信息不应该被破坏(因为每个日文字符都是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();
}
}
}
}
编辑 - 将文本文件视为私人の名前はアンソニーです(我的名字是安东尼)一个39字节的文件。我得到了相同的输出,即我输出文本文件中的私の名前はアンソニーです。
另外,我还在out.write(97) //97 as ascii of a
之后写了out.write(c)
,然后输出文件全部坏了
答案 0 :(得分:1)
当您使用UTF-8编码将日文字符写入文件时,您实际上是在写三个字节。
你声明的循环并不关心字符,它关心字节。
out.write(97)
因为输入文件包含三个字节,所以它只循环三次。
编辑:在out.write(c)
之后直接执行<key>CFBundleVersion</key>
<string>1</string>
后损坏所有内容的原因是因为代表单个日文字符的三个字节不再是连续的。这打破了UTF-8编码。