如何使用BufferedReader或其他方法读取固定长度字符?

时间:2013-03-20 08:55:47

标签: java string unicode byte

如果我使用BufferReader读取一行,我可以获得一行代码。 代码是这样的:

FileInputStream fs = new FileInputStream("E:\\tmp\\aaa.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fs));


String line = null;  
while ((line = br.readLine()) != null) { 
    System.out.println(line.length() + " " +line.substring(0, 2);
}

aaa.txt的内容是:

一二三四1234

如此。运行代码的结果是:

8 一二

从结果中,我知道String中的汉字长度是1,而不是2。

所以如果我使用line.substring(0,2),我会得到两个汉字“一二”。 但我希望line.substring(0,2)的结果是“一”。

我的意思是,在我看来,“一二三四1234”的长度是12,而不是8.我可以使用子串(0,2)来 提取固定长度字符。

提前致谢。

4 个答案:

答案 0 :(得分:1)

  

从结果中,我知道String中的汉字长度是1,而不是2。

这是正确的,所以每个标志都是一个字符,所以这些“一二三四1234”字符串的长度为8

为什么12?

  

我的意思是,在我看来,“一二三四1234”的长度是12,而不是8.我可以使用子串(0,2)来提取固定长度的字符。

如果你知道你想要的字符索引,你可以使用下面的代码:

String s = "一二三四1234";
char c = s.charAt(0);

因为方法subString从索引0到2

创建一个新的String

答案 1 :(得分:0)

  

如果我使用line.substring(0,2),我会得到两个汉字“一二”。

所以你有两个角色。这就是你要求的。索引0和1处的两个字符。

  

但我希望line.substring(0,2)的结果是“一”。

如果您只想要一个角色,请要求一个角色。索引为0. line.substring(0,1)的字符,例如。

答案 2 :(得分:0)

Java使用unicode作为内部字符集,因此任何char类型都是unicode.And.lang.String由chars组成。

当你从阅读器获取字符串时,文件的字节内容已经根据文件编码转换为字符。

line.substring(0,2)会返回一个新的字符串,其中包含要返回的的两个字符,这就是你已经得到的!

我猜“在我的眼中长度”意味着你可以在像UltraEdit这样的文本编辑器中看到它 编辑器只显示文件中字节的位置

答案 3 :(得分:0)

  1. 首先,您需要使用chinsese编码对文件进行解码,例如GBK,GB2312等。

  2. 将行读入字节数组,然后使用中文编码将该字节数组转换为字符串。

    FileInputStream fileStream=new FileInputStream(New  
    File("sometext.txt"));
    byte[] buf=new byte[12];
    byte[] line=reader.read(buf);
    byte[] byteRange=Arrays.copyOfRange(allBytes,0,2));
    String chineseString=new String(byteRange,Charset.forName("GBK")); 
    
  3. 这样你只会得到1个汉字。从GBK到UTF-8只有一步转换。

    哦,是的!与以前的方法相比有所改进。

相关问题