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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 七宝 中级黑马   /  2013-8-16 01:45  /  2384 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 七宝 于 2013-8-17 19:46 编辑

前几天做了个题目,题目是:
1 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)
例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文

想问下,题目要考的是转换流嘛,先用字节流读取,然后转换成字符流,是这样的嘛。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

14 个回复

倒序浏览
其实呢你的问题描述的感觉怪怪的,按照GBK编码的话,一个中文字符是2个字节,假如你直接用字节流去读取的话,你最好是定一个2的倍数的byte数组去缓冲装这些读出来的字节,然后使用new String(byte[] b, int offset, int length )将他专程字符。

那如果你用转换流的话,读取出来的就是字符了,因为底层已经为你做铺垫了。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
兜兜转转 发表于 2013-8-16 09:20
其实呢你的问题描述的感觉怪怪的,按照GBK编码的话,一个中文字符是2个字节,假如你直接用字节流去读取的话 ...

问题以举例写全
回复 使用道具 举报
七宝 发表于 2013-8-16 09:43
问题以举例写全

能截取一个字节吗?
回复 使用道具 举报
兜兜转转 发表于 2013-8-16 10:10
能截取一个字节吗?

题目就是这样的,这是黑马给我的基础测试最后一题,我就是这个不怎么清楚
回复 使用道具 举报
本帖最后由 兜兜转转 于 2013-8-16 10:48 编辑



import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class IODemo
{


        public static void main(String[] args) throws Exception
        {
                 String str = cutout("D:\\javaTest\\1.txt", 18);
                 System.out.println(str);

        }
        public static String cutout(String file, int length) throws Exception
        {
                FileInputStream fis = new FileInputStream(file);
                   if(length != 1 && (length%2)!=0)
                   {
                              --length;
                   }
                   if(length == 1)
                   {
                           ++length;//为了防止请求读一个字节,又是中文子的话,造成的乱码,判断如果是一个字节就length加1,去截取两个。
                   }
                    byte[] b = new byte[length];
                    int count = fis.read(b);
                    String str = new String(b,0,count);
                    return str;
        }

}
是这个效果吗?
回复 使用道具 举报
俩大神继续讨论
回复 使用道具 举报

关键发题那哥们,也不看看我写的符不符合他的要求,别叫大神,你107的技术分,你才是大神,我离黑马还很远
回复 使用道具 举报
兜兜转转 发表于 2013-8-17 07:41
关键发题那哥们,也不看看我写的符不符合他的要求,别叫大神,你107的技术分,你才是大神,我离黑马还很 ...

技术分只要在论坛呆久了就有了,技术就不一定了
回复 使用道具 举报
我怎么感觉有点像是用回退流的意思呢?这里我也不明白啊,高手快来来回答啊,学习 顶起!!!!!!!!!!!!!!!!
回复 使用道具 举报
啥叫回退流?
回复 使用道具 举报
兜兜转转 发表于 2013-8-17 07:41
关键发题那哥们,也不看看我写的符不符合他的要求,别叫大神,你107的技术分,你才是大神,我离黑马还很 ...

我一般晚上在,白天在睡觉,我看了,主要是我也不是很确定
回复 使用道具 举报
兜兜转转 发表于 2013-8-16 10:43
import java.io.FileInputStream;
import java.io.FileNotFoundException;

应该是这样的吧
回复 使用道具 举报
基础测试题的题目你不独立完成,怎么到论坛来问了?虽然是已近解决了,但是我还是想把代码分享给你
  1. package com.itheima;
  2. /**
  3. * 10、 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)

  4. 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
  5. * @author Administrator
  6. */
  7. public class Test10 {
  8.         public static void main(String[] args){
  9.                 String oldStr = "HM程序员";
  10.                
  11.                 String newStr = mySplit(oldStr, 5); //调用自定义方法传入字符串和要截取的字节数
  12.                
  13.                 System.out.println(newStr); //打印取出的字符串
  14.                
  15.         }
  16.         public static String mySplit(String str,int len)
  17.         {
  18.                 StringBuilder sb = new StringBuilder(); //定义StringBuilder用于存储字符串
  19.                
  20.                 byte[] buf = str.getBytes(); //将传入的字符串转成字符数组
  21.                
  22.                 sb.append(new String(buf,0,len));//往StringBuilder中添加用户需要的部分
  23.                
  24.                 int count=0; //定义变量,用于记录存入StringBuilder小于0的字节个数
  25.                
  26.                 for(int i =0;i<len;i++)
  27.                 {
  28.                         if(buf[i]<0)
  29.                                 count++;
  30.                 }
  31.                
  32.                 if(count%2!=0) //如果是奇数
  33.                         sb.deleteCharAt(sb.length()-1);//删除最后一个字符
  34.                
  35.                 return sb.toString();// 将符合规则的字符串返回。
  36.         }
  37. }
复制代码
回复 使用道具 举报
好,学习了,感谢大神级别的你们
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马