java - 缓冲 Reader 字符数
java - Buffered Reader character count
我对 Java 和一般编码还很陌生。在下面的程序中,设置为读取文件中的行数和字符数。
虽然它给出了正确的行数,但我得到的字符比 .txt 文件中的字符多,所以我假设它也在读取新行字符。
例如,在包含文本的测试文件中:
“你好
世界”
它将读取字符计数为 12 而不是 10。
关于如何让我的程序只读取字符而不读取换行符有什么建议吗?
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JOptionPane;
public class ReadFile
{
public static void main(String[] args)
{
try { /*define block of code to test for errors while it is being executed*/
String inName = JOptionPane.showInputDialog("Please enter the input file name here");
int linecount = 0, charcount = 0;
/*open the input file*/
BufferedReader inBuf = new BufferedReader (new FileReader (inName)); /*Initializes buffered reader*/
while ((inBuf.readLine()) !=null) { /*reads the contents of the file, line by line*/
linecount++; /*counts the number of lines read*/
}
inBuf.close(); /*closes input file*/
BufferedReader inBuf2 = new BufferedReader (new FileReader (inName));
while ((inBuf2.read()) != -1) {
charcount++; /*counts the number of characters read*/
}
/*closes input file*/
inBuf2.close();
/*Displays the number of lines and characters read*/
JOptionPane.showMessageDialog(null, "Number of lines in this file is: " + linecount);
JOptionPane.showMessageDialog(null, "Number of characters in this file is: " + charcount);
}
/*catch that allows code to be executed if error occurs*/
catch (FileNotFoundException f) {
JOptionPane.showMessageDialog(null, "File cannot be found! Details:\n" + f);
}
catch (IOException a) {
JOptionPane.showMessageDialog(null, "An error has occured when reading this file! Details:\n" + a);
}
System.exit(0); /*exits system*/
}
}
我在本地运行你的代码。
- "hello world" 有 11 个字符。你必须在 hello 和 world 之间包含白色 space。
- 我假设你在同一行的“world”后面有一个白色 space,这就是你看到 12 而不是 11 的原因。
- 您可能想要稍微重构一下您的代码编写方式。特别是不要打开同一个文件两次,因为它效率低下,您应该在 try/catch/finally or use try with resources 的 finally 块内关闭 BufferedReader。这是为了避免由于可能已抛出异常而未正确关闭流而导致的潜在内存泄漏。
如果您只想计算字母或字母数字字符,请查看 java.lang.Character#isLetterOrDigit(char ch)
tldr;这是简单的修复。读字符的时候加上这个if语句就可以了
while (( c= inBuf2.read()) != -1) {
if(Character.isLetter(c))
charcount++; /*counts the number of characters read*/
}
我对 Java 和一般编码还很陌生。在下面的程序中,设置为读取文件中的行数和字符数。
虽然它给出了正确的行数,但我得到的字符比 .txt 文件中的字符多,所以我假设它也在读取新行字符。 例如,在包含文本的测试文件中: “你好 世界” 它将读取字符计数为 12 而不是 10。
关于如何让我的程序只读取字符而不读取换行符有什么建议吗?
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JOptionPane;
public class ReadFile
{
public static void main(String[] args)
{
try { /*define block of code to test for errors while it is being executed*/
String inName = JOptionPane.showInputDialog("Please enter the input file name here");
int linecount = 0, charcount = 0;
/*open the input file*/
BufferedReader inBuf = new BufferedReader (new FileReader (inName)); /*Initializes buffered reader*/
while ((inBuf.readLine()) !=null) { /*reads the contents of the file, line by line*/
linecount++; /*counts the number of lines read*/
}
inBuf.close(); /*closes input file*/
BufferedReader inBuf2 = new BufferedReader (new FileReader (inName));
while ((inBuf2.read()) != -1) {
charcount++; /*counts the number of characters read*/
}
/*closes input file*/
inBuf2.close();
/*Displays the number of lines and characters read*/
JOptionPane.showMessageDialog(null, "Number of lines in this file is: " + linecount);
JOptionPane.showMessageDialog(null, "Number of characters in this file is: " + charcount);
}
/*catch that allows code to be executed if error occurs*/
catch (FileNotFoundException f) {
JOptionPane.showMessageDialog(null, "File cannot be found! Details:\n" + f);
}
catch (IOException a) {
JOptionPane.showMessageDialog(null, "An error has occured when reading this file! Details:\n" + a);
}
System.exit(0); /*exits system*/
}
}
我在本地运行你的代码。
- "hello world" 有 11 个字符。你必须在 hello 和 world 之间包含白色 space。
- 我假设你在同一行的“world”后面有一个白色 space,这就是你看到 12 而不是 11 的原因。
- 您可能想要稍微重构一下您的代码编写方式。特别是不要打开同一个文件两次,因为它效率低下,您应该在 try/catch/finally or use try with resources 的 finally 块内关闭 BufferedReader。这是为了避免由于可能已抛出异常而未正确关闭流而导致的潜在内存泄漏。
如果您只想计算字母或字母数字字符,请查看 java.lang.Character#isLetterOrDigit(char ch)
tldr;这是简单的修复。读字符的时候加上这个if语句就可以了
while (( c= inBuf2.read()) != -1) {
if(Character.isLetter(c))
charcount++; /*counts the number of characters read*/
}