求助如何读取一个文本的char数?

Jobernowl 2012-05-18 02:43:03
最近写了一个读取文本的类 由于是把文件以字符串的形式读取出来 所以我选择了以char为单位读取而非通常的以byte为单位读取 根据需求 我必须要知道这个文件一共有多少char 看了很多java的api 没发现有这个功能的 所以想让大家来帮助我一下
...全文
184 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jobernowl 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

引用 15 楼 的回复:
ok 解决了 终于发现了java自带有方法了 用带有reader的类的skip方法 实际上我
skip(Long.MAX_VALUE) 这样就可以返回文件的char数了 各位看看这样做合理不 实际上我也无从验证 但是通过使用来看感觉没什么不正常的地方
简单验证了一下跟read=br.read()用计数器算出来的一样,但是楼主忽略个问题,为什么不采用上面的方法,是……
[/Quote]

这个是skip的方法源码:
while (read < amount) {
if (fillBuf() == -1) {
return read;
}
if (end - pos >= amount - read) {
pos += amount - read;
return amount;
}
// Couldn't get all the characters, skip what we read
read += (end - pos);
pos = end;
}


这个是read的方法源码:
synchronized (lock) {
checkNotClosed();
/* Are there buffered characters available? */
if (pos < end || fillBuf() != -1) {
return buf[pos++];
}
return -1;
}


看上去都是调用了fillBuf的方法 感觉都差不多 所以我还是用skip方法好了 因为看起来更符合鄙人的行为习惯 代码量看上去也比较少 还能减少程序体积 何乐不为呢
sffx123 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
ok 解决了 终于发现了java自带有方法了 用带有reader的类的skip方法 实际上我
skip(Long.MAX_VALUE) 这样就可以返回文件的char数了 各位看看这样做合理不 实际上我也无从验证 但是通过使用来看感觉没什么不正常的地方
[/Quote]简单验证了一下跟read=br.read()用计数器算出来的一样,但是楼主忽略个问题,为什么不采用上面的方法,是因为你要提高效率吧,但是实际简单的几个测试发现还是一个个读取速度更快,快一半左右,用个4M左右的文件测试的,楼主可以用大文件继续比较一下两个的效率问题。也许后面更高,等待楼主结果。
Jobernowl 2012-05-22
  • 打赏
  • 举报
回复
ok 解决了 终于发现了java自带有方法了 用带有reader的类的skip方法 实际上我
skip(Long.MAX_VALUE) 这样就可以返回文件的char数了 各位看看这样做合理不 实际上我也无从验证 但是通过使用来看感觉没什么不正常的地方
Jobernowl 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 12 楼 的回复:

引用 3 楼 的回复:

java中一个char是两个字节

读入的时候统计下byte,是不是就可以得到char数

我试了一下 用 文件长度/2 得到的char数是不正确的

引用 10 楼 的回复:

1个字母:1 byte
1个汉字(gbk):2 byte
1个汉字(utf-8):3 byte

读一行,取得String的长……
[/Quote]

你这样岂不要要读完几百M的文本然后才能知道么 不能这样的
FFF9527 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 3 楼 的回复:

java中一个char是两个字节

读入的时候统计下byte,是不是就可以得到char数

我试了一下 用 文件长度/2 得到的char数是不正确的

引用 10 楼 的回复:

1个字母:1 byte
1个汉字(gbk):2 byte
1个汉字(utf-8):3 byte

读一行,取得String的长度,进行累加。如果是要含回车符则加……
[/Quote]

大哥,问题是你的题目本身具有两种意义。
简单取得java的char(字母:1byte,汉字:2、3byte)类型有多少个,str.length()就可以了。
sffx123 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
引用 16 楼 的回复:

引用 15 楼 的回复:
ok 解决了 终于发现了java自带有方法了 用带有reader的类的skip方法 实际上我
skip(Long.MAX_VALUE) 这样就可以返回文件的char数了 各位看看这样做合理不 实际上我也无从验证 但是通过使用来看感觉没什么不正常的地方
简单验证了一下跟read=br.read()用计数器算出来的一样,但是楼主忽略个问题……
[/Quote]测试了一下大文件200多M的,skip快很多。
Jobernowl 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

java中一个char是两个字节

读入的时候统计下byte,是不是就可以得到char数
[/Quote]
我试了一下 用 文件长度/2 得到的char数是不正确的

[Quote=引用 10 楼 的回复:]

1个字母:1 byte
1个汉字(gbk):2 byte
1个汉字(utf-8):3 byte

读一行,取得String的长度,进行累加。如果是要含回车符则加1,不含则不加。
制取字母的话,char转换为byte的长度为1就是,否则不是。

这看你的具体要求是什么?char只是只字母还是可以包含汉字。[/Quote]

一方面你给的编码太少了 另一方面不仅要统计字母数量还要统计汉字数量 明显比楼上的方法慢多了
Jobernowl 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

java中一个char是两个字节

读入的时候统计下byte,是不是就可以得到char数
[/Quote]

我试了一下 用文件长度/2得到的char数是不正确的

[Quote=引用 10 楼 的回复:]

1个字母:1 byte
1个汉字(gbk):2 byte
1个汉字(utf-8):3 byte

读一行,取得String的长度,进行累加。如果是要含回车符则加1,不含则不加。
制取字母的话,char转换为byte的长度为1就是,否则不是。

这看你的具体要求是什么?char只是只字母还是可以包含汉字。[/Quote]

这个一方面你给的编码太少 另一方面还要统计汉字有多少和字母有多少岂不是更更慢了
FFF9527 2012-05-18
  • 打赏
  • 举报
回复
1个字母:1 byte
1个汉字(gbk):2 byte
1个汉字(utf-8):3 byte

读一行,取得String的长度,进行累加。如果是要含回车符则加1,不含则不加。
制取字母的话,char转换为byte的长度为1就是,否则不是。

这看你的具体要求是什么?char只是只字母还是可以包含汉字。
Jobernowl 2012-05-18
  • 打赏
  • 举报
回复
有没有根据文件大小来确定的呢 考虑到任何文本
Jobernowl 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

自己统计一下就可以了
for example
Java code
BufferedReader br = new BufferedReader(new FileReader("xxx"));
int count = 0, read = 0;
while ((read=br.read()) != -1) {
count++;
}
br.close();
System.out.prin……
[/Quote]

难道没有更好的方法了么 我的超大文本考虑到几百M的 那么char数量是亿万级别的 光写一个for循环都要很久吧 那么这样打开这个文件虽说分段读取依然会卡很久 求各位再帮忙想一下吧
qybao 2012-05-18
  • 打赏
  • 举报
回复
自己统计一下就可以了
for example
BufferedReader br = new BufferedReader(new FileReader("xxx"));
int count = 0, read = 0;
while ((read=br.read()) != -1) {
count++;
}
br.close();
System.out.printf("char count = %d\n", count);
yuchensuifeng 2012-05-18
  • 打赏
  • 举报
回复
中文会不会读出乱码???
sffx123 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 2 楼 的回复:

Java code

String fileName = "D:" + File.separator + "hello.txt";
File file = new File(fileName);
Reader reader = new InputStreamReader(new FileInputStream(file));
int temp =……

……
[/Quote]就是简单演示一下过程,字符串都不用拼接,直接整个计数器变量就行了,这样只是看着直观一点。朋友不要太执着了。
yuppy 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

Java code

String fileName = "D:" + File.separator + "hello.txt";
File file = new File(fileName);
Reader reader = new InputStreamReader(new FileInputStream(file));
int temp =……
[/Quote]
这样你还不如用StringBuffer...
话说文件要是很大,你这不是会挂掉。。。
yuppy 2012-05-18
  • 打赏
  • 举报
回复
java中一个char是两个字节

读入的时候统计下byte,是不是就可以得到char数
sffx123 2012-05-18
  • 打赏
  • 举报
回复

String fileName = "D:" + File.separator + "hello.txt";
File file = new File(fileName);
Reader reader = new InputStreamReader(new FileInputStream(file));
int temp = 0;
String s = "";
while ((temp = reader.read()) != -1) {
s += (char)temp;
}
reader.close();
System.out.println(s.length());//char长度
System.out.println(s);
tomcatlee 2012-05-18
  • 打赏
  • 举报
回复

统计字符串str中小写字母,大写字母,数字的个数

Matcher match = Pattern.compile("[a-z]").matcher(str);
while (match.find())
lCount++;
match = Pattern.compile("[A-Z]").matcher(str);
while (match.find())
uCount++;
match = Pattern.compile("\\d").matcher(str);
while (match.find())
nCount++;

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧