#java #string #file #fileinputstream
#java #строка #файл #fileinputstream
Вопрос:
Я ищу количество подстрок в файле Короче говоря, файл содержит определенное количество статей, и мне нужно знать, сколько. Каждая статья начинается с: @ARTICLE{ или с @ARTICLE{(серия целых чисел)
Полезная информация: — У меня есть 10 файлов для поиска — Ни один файл не пуст — Этот код выдает мне исключение StringIndexOutOfBounds
Вот код, который у меня есть на данный момент:
//To read through all files
for(int i=1; i<=10; i )
{
try
{
//To look through all the bib files
reader = new Scanner(new FileInputStream("C:/Assg_3-Needed-Files/Latex" i ".bib"));
System.out.println("Reading Latex" i ".bib->");
//To read through the whole file
while(reader.hasNextLine())
{
String line = reader.nextLine();
String articles = line.substring(1, 7);
if(line.equals("ARTICLE"))
count =1;
}
}
catch(FileNotFoundException e)
{
System.err.println("Error opening the file Latex" i ".bib");
}
}
System.out.print("n" count);
Ответ №1:
Попробуйте просто использовать String#contains
в каждой строке:
while(reader.hasNextLine()) {
String line = reader.nextLine();
if (line.contains("ARTICLE")) {
count = 1;
}
}
Это, по крайней мере, позволило бы обойти проблему с необходимостью брать подстроку в первую очередь. Проблема в том, что, хотя совпадающие строки не должны содержать исключения out of bounds, а также строки длиной более 7 символов, которые не совпадают, строки, содержащие менее 7 символов, могут вызвать проблему.
Вы также могли бы использовать шаблон регулярных выражений, чтобы убедиться, что вы соответствуете ARTICLE
как отдельное слово:
while(reader.hasNextLine()) {
String line = reader.nextLine();
if (line.matches("\bARTICLE\b")) {
count = 1;
}
}
Это гарантирует, что вы не будете считать строку, содержащую что-то вроде articles
в ней, что не является вашей точной целью.
Ответ №2:
Вы можете проверить, начинается ли строка с необходимой последовательности:
if (line.startsWith("ARTICLE")) {
count = 1;
}
Ответ №3:
Вы получаете StringIndexOutOfBounds из этой строки кода:
String articles = line.substring(1, 7);
Прочитанная строка может быть пустой или содержать менее 7 символов. Чтобы избежать получения StringIndexOutOfBounds, у вас должна быть условная проверка, чтобы увидеть, является ли
строка.длина > 7
Помимо этого, тогда лучше использовать ответы, рекомендованные выше (т.Е. .contains или .StartsWith)
Ответ №4:
Поскольку вы читаете построчно, string.contains является хорошим выбором вместо substring , с другой стороны, все статьи начинаются с «@ARTICLE», поэтому используйте «@ARTICLE» в условии. Для тестирования кода, пожалуйста, попробуйте это —
public class test {
public static void main(String[] args) {
int count = 0;
for (int i = 1; i <= 10; i ) {
try {
//To look through all the bib files
Scanner reader = new Scanner(new FileInputStream("C:/Assg_3-Needed-Files/Latex" i ".bib"));
System.out.println("Reading Latex" i ".bib->");
//To read through the whole file
while (reader.hasNextLine()) {
String line = reader.nextLine();
if (line.contains("@ARTICLE")) {
count = 1;
}
}
} catch (FileNotFoundException e) {
System.err.println("Error opening the file Latex" i ".bib");
}
}
System.out.print("n" count);
} }