在Windows上使用java和jcifs读取文件。我需要确定文件的大小,其中包含多字节和ASCII字符。
如何有效地实现它或者在Java中的任何现有API?
谢谢,
答案 0 :(得分:2)
毫无疑问,要获得准确的字符数,您必须使用正确的编码来阅读它。 问题是如何有效地读取文件。 Java NIO是最知名的方法。
FileChannel fChannel = new FileInputStream(f).getChannel();
byte[] barray = new byte[(int) f.length()];
ByteBuffer bb = ByteBuffer.wrap(barray);
fChannel.read(bb);
然后
String str = new String(barray, charsetName);
str.length();
读取字节缓冲区的速度接近最大可用速度(对我而言,它是60 Mb /秒,而磁盘速度测试的速度约为70-75 Mb /秒)
答案 1 :(得分:1)
要获取字符数,您必须阅读该文件。通过指定正确的文件编码,可以确保Java正确读取文件中的每个字符。
BufferedReader.read()返回读取的Unicode字符(作为0到65535范围内的int)。所以这样做的简单方法就是这样:
int countCharsSimple(File f, String charsetName) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), charsetName));
int charCount = 0;
while(reader.read() > -1) {
charCount++;
}
reader.close();
return charCount;
}
可以提高性能
int countCharsBuffer(File f, String charsetName) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), charsetName));
int charCount = 0;
char[] cbuf = new char[1024];
int read = 0;
while((read = reader.read(cbuf)) > -1) {
charCount += read;
}
reader.close();
return charCount;
}
为了兴趣,我对这两个和安德烈答案中建议的nio版本进行了基准测试。我发现上面的第二个例子(countCharsBuffer)是最快的。
(请注意,所有这些示例都包含其计数中的行分隔符。)