当前位置:  技术问答>java相关

高手请指教:为什么不行!!!!!

    来源: 互联网  发布时间:2014-12-28

    本文导语:  我编写了一小段代码:用于分割文件。 但是我用FileReader读写word文档时居然读少了若干字节(而读写txt型文件没有问题)。 后来发现,FileReader在读16进制FE AA FF 11时居然读出了65533 65533,然后写入文件就写成了3F 3F...

我编写了一小段代码:用于分割文件。
但是我用FileReader读写word文档时居然读少了若干字节(而读写txt型文件没有问题)。
后来发现,FileReader在读16进制FE AA FF 11时居然读出了65533 65533,然后写入文件就写成了3F 3F.
按照Thinking in java的说法,FileReader是为了取代FileInputStream而产生的,为什么会出错,还是我的代码有问题?
------------------------------------------------
高手请指教!

|
首先,Java 1.2以上版本引入Reader,Writer 目的不是为了让你用它来读一个字节流的文件!:) 它的目的是为了让你可以使用它来读MBCS(Multi-Bytes Code System)的“文本”文件,因为新引入的Reader,Writer可以读入Unicode的Character! 也就是说,如果你使用了任何一种有效的编码(汉字,阿拉伯,等等)来写一个“文本”文件,用Reader和Writer都可以正确地使用,不会象InputStream, OutputStream处理“文本”时可能会在字符中间中断从而产生错误,因为它们Stream设计是来处理字节流的。同样,这也解释了为什么你用InputStream可以正确地处理任何面向字节的处理。

接着解释为什么你的FE AA 或 FF 11会转换成 65533 65533 => 3f 3f,因为Java试图将你的DOC文件当作一个Unicode文本文件来处理,但是,FE AA与 FF 11在UTF-8标准中是不存在的字符(Character),而Unicode规定在这种情况下将它转成"?",也即 3F。在Java中,内部是使用Unicode标准的。

UTF-8标准就是Java在任何缺省平台上使用的Unicode标准,你可以去http://www.unicode.org 参考详细的标准,我简单介绍UTF-8如下:
在Unicode中编码为 0000 - 007F 的 UTF 中编码形式为: 0xxxxxxx 
在Unicode中编码为 0080 - 07FF 的 UTF 中编码形式为: 110xxxxx 10xxxxxx
在Unicode中编码为 0000 - 007F 的 UTF 中编码形式为: 1110xxxx 10xxxxxx 10xxxxxx

简单地可见,不存在以FF或FE开头的任何UTF-8字符编码!

也许有人想问,照这么说,GB2313或GBK之类的文本文件似乎也有编码不符合UTF-8标准,为什么可以转换呢?但请仔细看看JavaDOC中对FileReader的说明:"这是一个读字符文件的类!这个类的构造方法假定默认的字符编码和字节缓冲区容量是正确的,如果你需要改变这些值,要通过FileInputStream构造一个InputStreamReader!"
在GB2312平台上,它默认的字符编码是GB2312,这是正确的,在此情况下,JAVA会作GB2312=》UTF-8的转换,结果也是正确的!但你的DOC文件的默认编码未指定时,是会采用UTF-8的。

所以,要处理象DOC或XLS之类的二进制文件时,还是要使用Stream!而不是什么Reader,Writer!

|
用BufferedReader+FileInputStream

    
 
 

您可能感兴趣的文章:

  • 逻辑地址、物理地址、线性空间、全局段、局部段 问题请教,高手指教了!!!!在线等,高手指教了!!!在线等!!!!!!!!
  • 各位高手:光盘安装Linux9出现问题,请指教!
  • 怎么设置在Linux上面设置WEB服务器?请各位高手指教!!!
  • 高手指教:solaris硬盘分区问题
  • JMF中如何实现多路音频的混合输出?期待高手指教!
  • turbolinux 的安装问题,请高手指教!!!!!!!
  • LINUX 安装进不去图形模式!请高手指教!
  • crontab的问题,希望高手指教!谢谢!
  • 请教高手,如何在VMware下安装suse10.0??请指教,谢谢。
  • kppp拨号上网的问题,请高手指教
  • 386的保护机制为何与这个有点冲突,高手请指教
  • 望高手指教
  • 请高手指教
  • linux ftp 配置 望高手指教,感激不尽
  • linux 下,doxygen生成的html文件中文注释为乱码,请高手指教!
  • cacti监控不到磁盘数据,请高手指教!
  • !!!java 中如何执行FTP命令?请高手指教。100分相赠
  • 高手指教:怎样在LINUX下运行WIN98程序?
  • 那位高手能指教在java里string类如何转化成date型?
  • jsp中找不到表的错误,急!!!请高手指教。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高手,高手,高高手请进!
  • 有熟悉EXIM的高手高手么??
  • to 高手:学java应该怎样一步步学习,从菜鸟到高手.
  • 高分请高手,高手定能解决
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 有高手研究Agent++麽?里面有个thread.h,蛮难读的,请高手指点
  • 难道高手区里的人就是高手?
  • 在dos下用bc31挑战高手******开发mssql程序,连接时报link err:undefined symbol GETNOTE in module DBEXTERN?(挑战高手)
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • 难道这没有高手吗?难道这没有乐于助人的高手?(高分酬谢62+50+50)
  • 关于我对linux高手用yum,非高手用源码的理由
  • 高手救命,很急——ORACLE817安装在UNIXWARE711上,手工启动数据库后在netasst中连接错误,高手帮我看看?
  • 请教高手lvs的奇怪问题,我挺着急,希望高手别潜水,就就我,先谢谢了
  • 各个高手看看这个问题!本人第一次学习java所以要各位高手的帮助。。
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 我是新手,高手,高手,快来救我
  • EJB问题,请教高手(非高手莫进)
  • 请各位JAVA高手,网业高手看过来,我把能给的分都送出!!!只能给37分,哎!!
  • eWEEK沙龙征集高手座谈


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3