java io 字符_Java的IO及字符编码

package io;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.UnsupportedEncodingException;

import java.nio.charset.Charset;

public class CutString {

public static void main(String[] args) throws Exception {

// 原始字符串---------------------------------------

String s = "我love你";

System.out.println("原始字符串:" + s);

System.out.println("平台编码: " + Charset.defaultCharset()); // 平台编码: UTF-8

System.out.println("字符个数: " + s.length()); // 字符个数: 9

// UTF-8的汉字占3个字节

System.out.println("字节个数: " + s.getBytes().length); // 字节个数:13

// 输入流------------------------------------------

byte[] ba = s.getBytes();

// 抽象类字节输入流

InputStream in = new ByteArrayInputStream(ba);// 直接子类:字节数组输入流

InputStreamReader reader = new InputStreamReader(in, "UTF-8");// 字符输入流,这是一个转换流,可以指定字符编码

// 逐字符读取

while (reader.ready()) {

char c = (char) reader.read();

System.out.println(c);

}

// 输出流---------------------------------------------

ByteArrayOutputStream out = new ByteArrayOutputStream();// 字节数组输出流

OutputStreamWriter writer = new OutputStreamWriter(out, "GBK");// 字符输出流,转换流,指定字符编码

writer.write("我love你");

writer.flush(); // 刷新流

String newStr = out.toString("GBK");

System.out.println("以GBK编码后的新字符串:" + newStr);

System.out.println("新字符串字节个数:" + newStr.getBytes("GBK").length);// 以GBK编码后的新字符串字节个数:8

// ----------------------------------------------------

// 写一个算法,以字节数截取字符串,汉字必须截取完整,不能截半个

try {

System.out.println("截取前1位:" + CutString.substring(newStr, 1));

System.out.println("截取前2位:" + CutString.substring(s, 2));

System.out.println("截取前3位:" + CutString.substring(s, 3));

System.out.println("截取前4位:" + CutString.substring(s, 4));

System.out.println("截取前6位:" + CutString.substring(s, 6));

System.out.println("截取前7位:" + CutString.substring(newStr, 7));

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

/**

* 按字节截取字符串

*

* @param orignal

* 原始字符串

* @param count

* 截取位数

* @return 截取后的字符串

* @throws UnsupportedEncodingException

* 使用了JAVA不支持的编码格式

*/

public static String substring(String orignal, int count) throws UnsupportedEncodingException {

// 原始字符不为null,也不是空字符串

if (orignal != null && !"".equals(orignal)) {

// 将原始字符串转换为GBK编码格式

orignal = new String(orignal.getBytes("GBK"), "GBK");

// 要截取的字节数大于0,且小于原始字符串的字节数

if (count > 0 && count < orignal.getBytes("GBK").length) {

StringBuffer buff = new StringBuffer();

char c;

for (int i = 0; i < count; i++) {

// charAt(int index)也是按照字符来分解字符串的

c = orignal.charAt(i);

buff.append(c);

if (CutString.isChineseChar(c)) {

// 遇到中文汉字,截取字节总数减1

--count;

}

}

return buff.toString();

}

}

return orignal;

}

/**

* 判断是否是一个中文汉字

*

* @param c

* 字符

* @return true表示是中文汉字,false表示是英文字母

* @throws UnsupportedEncodingException

* 使用了JAVA不支持的编码格式

*/

public static boolean isChineseChar(char c) throws UnsupportedEncodingException {

// 如果字节数大于1,是汉字

// 以这种方式区别英文字母和中文汉字并不是十分严谨,但在这个题目中,这样判断已经足够了

return String.valueOf(c).getBytes("GBK").length > 1;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值