A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 yangxin540 于 2013-9-16 10:39 编辑

现在情况如下:
需要用文件输入流的read(byte[] b)方法文件中数据并打印关键的关键byte数组大小是奇数例如大小为3,这样的话读取出来的文字就会有半个文字的情况。求教这种怎么解决呢?

大家都说我说得晦涩,那好吧看下面:
byte[] buf = new byte[5]
while ((len = fileInputStream.read(buf)) != -1)
System.out.println(new String(buf, 0, len));
简单代码描述如上,这样从文件中读取到的汉字,打印出来就是乱码,因为出现了半个汉字的情况

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

14 个回复

倒序浏览
你的语文是体育老师教的嘿嘿     没看懂 {:soso_e120:}
回复 使用道具 举报 1 0
{:soso_e117:}
回复 使用道具 举报
袁梦希 发表于 2013-9-15 17:46
你的语文是体育老师教的嘿嘿     没看懂

就是我要用文件输入流的read(byte[] b)且byte数组大小是奇数,如5.这样当我把汉字从文件中读取出来在装进数组的时候就会出现半个汉字的情况
回复 使用道具 举报
真的看不懂你说的什么
回复 使用道具 举报
read(byte[] b)方法的返回值是个int型是数据类型,返回值表示读入缓冲区的总字节数。这个或许可以解决byte数组实际读入数据大小为奇数的情况。
回复 使用道具 举报
额   他的意思是 在字符编码中 使用GBK  是两个字节是一个汉字,然后他在文本输入流中  偏偏不用Reader的子类 而使用字节流,问这个问题怎么办.  恩如果真这么做的我告诉你个方法, 你查查第三个汉字的编码表,把最后1个字节 补上,然后再进行字符串解析.........有的处理字符流的流不用  偏偏用字节流  这......哎,要不就用 iso-8859-1 解析着看看,或者变成其他单字节编码试试  能蹦出几个字的.
回复 使用道具 举报
zhou5852 发表于 2013-9-15 18:24
额   他的意思是 在字符编码中 使用GBK  是两个字节是一个汉字,然后他在文本输入流中  偏偏不用Reader的子 ...

恩,我明白你的意思了,我确实也是想你说的那么做。可能我对下面问题的理解有误吧,你看看:定义一个文件输入流,调用read(byte[] b)方法将文件中的所有内容打印出来(byte数组的大小限制为5)。
回复 使用道具 举报

老尹   你们安好     团长就放心了    嘴一个  {:soso_e165:}
回复 使用道具 举报
yangxin540 发表于 2013-9-15 18:39
恩,我明白你的意思了,我确实也是想你说的那么做。可能我对下面问题的理解有误吧,你看看:定义一个文件 ...

额 限制为5的话 就用4啊...........晕  这道题就是误解人的...呵呵..........真无耻的题~~~~~~

回复 使用道具 举报
zhou5852 发表于 2013-9-15 18:58
额 限制为5的话 就用4啊...........晕  这道题就是误解人的...呵呵..........真无耻的题~~~~~~

...

但是说的是限制为5,不就是说字节数组大小为5么?又不是限制在5以内呀,不解...
回复 使用道具 举报
kmter 中级黑马 2013-9-15 19:05:34
12#
首先我想要吐槽一下出题者.
考察的应该就是中文字符占用两个字节, 用流读取需要注意选择缓冲流.
  1. import java.io.*;

  2. class ReadTest {
  3.         public static void main(String[] args) throws Exception {
  4.                 byte buff[] = new byte[5];
  5.                
  6.                 BufferedInputStream bufIn = new BufferedInputStream(new FileInputStream(new File("半个字符.txt")));
  7.                 BufferedOutputStream bufOut = new BufferedOutputStream(System.out);
  8.                 int len;
  9.                 while((len=bufIn.read(buff)) != -1) {        //这里设置最大写入字符数为buff.length-1也就是4刚好是两个中文字符就能保证不破坏字符的二进制流
  10.                         String str = new String(buff, 0, buff.length);
  11.                         System.out.print(str);
  12.                        
  13.                         bufOut.write(buff, 0, buff.length);
  14.                         // bufOut.flush();                //这里取消注释刷新缓冲区得出的结果就和上面的一样了
  15.                 }
  16.                
  17.                 System.out.println();
  18.                 bufOut.flush();
  19.                
  20.                 bufOut.close();
  21.                 bufIn.close();
  22.         }
  23. }
复制代码
回复 使用道具 举报
kmter 中级黑马 2013-9-15 19:13:45
13#
下面是输出结果, 我们可以看到?初无法显示就是因为其只有一个字节无法显示, 而后面输出了异样字符正是因为上次未被读取的一半字节与后面读取的字节连在一次正好是其他汉字的二进制编码.
C:\Users\苏诚\javadoc\Test>javac ReadTest.java

C:\Users\苏诚\javadoc\Test>java ReadTest
半个?椅沂?你的?话氚?半个?椅沂?你的?话氚?半啊?
半个我我是你的一半半半个我我是你的一半半半啊
回复 使用道具 举报
xscn 来自手机 高级黑马 2013-9-15 19:19:58
14#
这是入学测试题呦,提示一下还要考虑编码问题的
回复 使用道具 举报
本帖最后由 胡智 于 2013-9-15 20:13 编辑

可以这样吗,你数组的长度一定要定义成5。那你第一次将数据装入数组中的时候,打印只打印前4个字节的数据。这样就显式2个字。然后将第5个数据放在数组的首位。再往数组中添加数据,这次从角标为1的位置装,然后再打印前4个字节的数据。上代码。
  1. public static void main(String[] args)throws Exception {
  2.                 FileInputStream fis = new FileInputStream("C:\\Documents and Settings\\Administrator\\桌面\\code\\测试.txt");
  3.                 int len = 0;
  4.                 byte[] arr = new byte[5];
  5.                 if((len=fis.read(arr))!=-1){
  6.                         System.out.print(new String(arr,0,arr.length-1));
  7.                         arr[0] = arr[4];
  8.                         }
  9.                  while((len=fis.read(arr,1,4))!=-1)
  10.          {
  11.             System.out.print(new String(arr,0,arr.length-1));
  12.             arr[0] = arr[4];  
  13.             Arrays.fill(arr, 1, 5, (byte)0);//这里还要清空一下数组,我刚才的例子刚好是偶数个字,奇数个的话会多打印出数据。
  14.          }
  15.                 fis.close();
  16.         }
复制代码

jietu.png (10.39 KB, 下载次数: 53)

读取的文件

读取的文件

jietu2.png (2.83 KB, 下载次数: 70)

jietu2.png

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马