我正在使用BufferedReader逐行读取文本文件。然后,我使用一种方法来规范化每行文本。但是我的规范化方法有问题,在调用它之后,BufferedReader对象停止读取文件。有人可以帮我吗?
这是我的代码:
public static void main(String[] args) {
String string = "";
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = br.readLine()) != null) {
string += normalize(line);
}
} catch (Exception e) {
}
System.out.println(string);
}
public static String normalize(String string) {
StringBuilder text = new StringBuilder(string.trim());
for(int i = 0; i < text.length(); i++) {
if(text.charAt(i) == ' ') {
removeWhiteSpaces(i + 1, text);
}
}
if(text.charAt(text.length() - 1) != '.') {
text.append('.');
}
text.append("\n");
return text.toString();
}
public static void removeWhiteSpaces(int index, StringBuilder text) {
int j = index;
while(text.charAt(j) == ' ') {
text.deleteCharAt(j);
}
}
这是我使用的文本文件:
abc .
asd.
dasd.
答案 0 :(得分:3)
我认为您在removeWhiteSpaces(i + 1, text);
中遇到问题,如果您在字符串处理过程中遇到问题,读者将无法阅读下一行。
您不检查空字符串,而是致电text.charAt(text.length()-1)
,这也是一个问题。
打印异常,更改您的catch块以写出异常:
} catch (Exception e) {
e.printStackTrace();
}
原因是在您的while(text.charAt(j) == ' ') {
中,您没有检查StringBuilder的长度,但是将其删除了...
答案 1 :(得分:1)
尝试一下:
while ((line = br.readLine()) != null) {
if(line.trim().isEmpty()) {
continue;
}
string += normalize(line);
}
答案 2 :(得分:1)
尝试使用ScanReader
Scanner scan = new Scanner(is);
int rowCount = 0;
while (scan.hasNextLine()) {
String temp = scan.nextLine();
if(temp.trim().length()==0){
continue;
}
}
//您的逻辑其余部分
答案 3 :(得分:1)
归一化功能导致了此问题。 对其进行以下调整可以解决此问题:
public static String normalize(String string) {
if(string.length() < 1) {
return "";
}
StringBuilder text = new StringBuilder(string.trim());
if(text.length() < 1){
return "";
}
for(int i = 0; i < text.length(); i++) {
if(text.charAt(i) == ' ') {
removeWhiteSpaces(i + 1, text);
}
}
if(text.charAt(text.length() - 1) != '.') {
text.append('.');
}
text.append("\n");
return text.toString();
}
答案 4 :(得分:1)
问题不在于您的代码,而在于对readLine()
方法的理解。在文档中指出:
读取一行文本。一行被认为由换行符('\ n'),回车符('\ r')或回车符后紧跟换行符之一终止。
https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine()
因此,这意味着如果该方法找到空行,它将停止读取并返回null
。
@ tijn167建议的代码将使用BufferedReader
来解决。如果您对BufferedReader
不拘一格,请按照@Abhishek Soni的建议使用ScanReader
。
此外,您的方法removeWhiteSpaces()
正在检查空白,而空行不是空白,而是进位返回\r
或换行符\n
或两者都检查。因此,您的条件text.charAt(j) == ' '
永远不会满足。
答案 5 :(得分:-1)
文件第二行为空,因此while循环停止