Поэтому у меня есть следующий код:
import java.io.*;
public class Plagiarism {
public static void main(String[] args) {
Plagiarism myPlag = new Plagiarism();
if (args.length == 0) {
System.out.println("Error: No files input");
}
else if (args.length > 0) {
try {
for (int i = 0; i < args.length; i++) {
BufferedReader reader = new BufferedReader (new FileReader (args[i]));
simplify (reader);
reader.close();
}
}
catch (Exception e) {
System.err.println ("Error reading from file");
}
}
}
public static void simplify(BufferedReader input) throws IOException {
String line = null;
line = input.readLine();
while (line != null) {
line = line.replaceAll ("[^a-zA-Z0-9 ]", "");
line = line.toLowerCase();
}
}
}
Проблема с этим кодом заключается в том, что он компилируется, но когда я запускаю его и добавляю 2 аргумента в командной строке, например. Java Plagiarism text1.txt text2.txt. EDIT: Когда я запускаю это, он просто ничего не делает или даже не заканчивает, он как будто застрял где-то.
Спасибо за любую помощь.
Вы не читаете файлы сразу (для этого вам потребуется использовать потоки).
Проблема заключается в вашем simplify
методе.
line = input.readLine();
while (line != null) {
... должно стать:
while ((line = input.readLine()) != null)
Причина этого в том, что вы вызываете readLine
только один раз и итерации только по первому значению в противном случае.
С собственно в while
петля конвейеру значение readLine
вызова в non- null
состояние после назначения его на line
переменной.
После этого вы можете делать все, что вы хотите с line
String
вы манипулировали в вашем в while
цикла, такие как добавление его в array
или Collection
, как Вы предложили в своем комментарии.
Например:
public static List<String> simplify(BufferedReader input) throws IOException {
String line = null;
List<String> result = new ArrayList<String>();
while ((line = input.readLine()) != null) {
result.add(line.replaceAll ("[^a-zA-Z0-9 ]", "").toLowerCase());
}
return result;
}
... тогда в вашем main
методе...
List<String> foo = simplify(reader);
EDIT: Когда я запускаю это, он просто ничего не делает или даже не заканчивает, он как будто застрял где-то.
Это совершенно нормально. Посмотрите на свой в while
цикла:
while (line != null) {
line = line.replaceAll ("[^a-zA-Z0-9 ]", "");
line = line.toLowerCase();
}
line
никогда не будет равна нулю. Вам следует:
while ((line = input.readLine()) != null)
// etc
У вас есть более фундаментальная проблема: ваша программа никогда не будет работать правильно, если ваша цель - заменить строки во входных файлах...
Попробуйте это вместо этого:
private static final Pattern PATTERN = Pattern.compile("[^a-zA-Z0-9 ]+");
private static void simplify(final String fileName)
throws IOException
{
final Path path = Paths.get(fileName);
final Path tempfile = Files.createTempFile(fileName.getFileName(), "tmp");
try (
final BufferedReader reader = Files.newBufferedReader(path);
final BufferedWriter writer = Files.newBufferedWriter(tempfile);
) {
String line;
while ((line = reader.readLine()) != null) {
line = PATTERN.matcher(line).replaceAll("").toLowerCase();
writer.write(line);
writer.newLine();
}
writer.flush();
}
Files.move(tempfile, path, StandardCopyOption.REPLACE_EXISTING);
}
Files.readAllLines()
вы можете найти Files.readAllLines()
интересным