首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ByteStream读取UTF-8字符

使用ByteStream读取UTF-8字符
EN

Stack Overflow用户
提问于 2017-09-20 07:22:04
回答 1查看 582关注 0票数 1

我使用FileInputStream和FileOutputStream从UTF-8中的文本文件中读取字符,并将数据写入另一个文件(实质上是复制内容)。

FileInputStream串行读取1字节,FileOutputStream将一个字节串行写入文本文件。

我第一次这样做是为了正常输入英文内容的.txt文件。起作用了,这是应该的。然后,我修改了我的输入文本文件,并在其中写了一些日语字符(使用谷歌翻译)。每个字符为3个字节。

我再次对新的文本文件进行了同样的处理,这也非常有效。因为一次只读取一个字节,所以信息不应该被破坏(因为每个日文字符是3个字节)。我想问一下,为什么FileInputStream也使用3字节字符。这是密码。

代码语言:javascript
复制
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),然后输出文件都被破坏了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-20 07:28:41

当您使用UTF-8编码将日语字符写入文件时,您实际上是在向它写入三个字节。

您声明的循环不关心字符,而是关心字节。

代码语言:javascript
复制
while((c=in.read())!=-1){
    out.write(c);
    if(c=='r'){
        break;
    }
}

因为输入文件包含三个字节,所以它只循环三次。

编辑:您在out.write(c)之后直接执行out.write(97)后破坏一切的原因是,表示单个日语字符的三个字节不再是连续的。这破坏了UTF-8的编码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46315657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档