Почему моя Java программа отлично работает в windows, а в linux это катастрофа? - PullRequest
0 голосов
/ 26 марта 2020

Я написал программу, которая читает текстовый файл, удаляет запрошенную строку и переписывает ее без строки. Эта программа принимает три аргумента от терминала: 1) входной файл 2) строка 3) выходной файл.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

class wordfilter {
    public static void main(String[] args) {
        Scanner scanner = new Scanner("");
        Scanner conteggio = new Scanner("");
        int numel = 0;
        File file = new File(args[0]); // Argomento 0: il file
        try {
            conteggio = new Scanner(file);
        }
        catch (FileNotFoundException e) {
            System.out.println("File non trovato");
        }

        while (conteggio.hasNext()) {
            numel++;
            conteggio.next();
        }
        conteggio.close();
        String[] lettura = new String[numel];
        int i = 0;
        try {
            scanner = new Scanner(file);
        }
        catch (FileNotFoundException e) {
            System.out.println("File non trovato");
        }
        while (scanner.hasNextLine()) {
            lettura[i] = scanner.next();
            i++;
        }
        System.out.println("Contarighe -> " + numel);
        for (i = 0; i < lettura.length; i++) {
            System.out.println("Elemento " + i + " - > " + lettura[i]);
        }
        scanner.close();
        String escludi = args[1]; // Argomento 1: il filtro
        String[] filtrato = rimuovi(escludi, lettura);
        if (args.length == 3) stampaSuFile(filtrato, args[2]);
    }
    public static String[] rimuovi(String esclusione, String[] input) {
        String[] nuovoV;
        String escludi = esclusione;
        int dim = 0;
        for (int i = 0; i < input.length; i++) {
            if (!input[i].equals(escludi))
                dim++;
        }
        nuovoV = new String[dim];

        int j = 0;
        for (int i = 0; i < input.length; i++) {
            if (!input[i].equals(escludi)) {
                nuovoV[j] = input[i];
                j++;
            }
            ;
        }
        return nuovoV;
    }

    public static void stampaSuFile(String[] out, String path) {
        String closingstring = "";
        File destinazione = new File(path);
        try {
            destinazione.createNewFile();
        } catch (IOException e) {
            System.out.println("Errore creazione file");
        }
        try {   
            FileWriter writer = new FileWriter(destinazione);
            for (int i = 0; i < out.length; i++)
                writer.write(out[i] + (i == (out.length-1) ? closingstring : " "));
            writer.close();
            System.out.println("Scrittura eseguita correttamente");
        } catch (IOException e) {
            System.out.println("Errore scrittura file");
        }
    }
}

Вкл. Windows без проблем, работает отлично.

На Linux вместо этого, когда я пишу что-то вроде java wordfilter in.txt word out.txt

, я получаю

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:937)
    at java.base/java.util.Scanner.next(Scanner.java:1478)
    at wordfilter.main(wordfilter.java:42)

В чем проблема? Это из-за разницы в linux?

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Вы смешиваете функции на основе строки и токена: hasNextLine () и next (). Если ввод заканчивается переводом строки (типично для Linux), hasNextLine возвращает true в конце файла, но следующего «элемента» нет.

    while (scanner.hasNextLine()) {
        lettura[i] = scanner.next();
        i++;
    }

Вы должны использовать hasNext со следующим или hasNextLine с nextLine, смешивание их сбивает с толку.

    while (scanner.hasNext()) {
        lettura[i] = scanner.next();
        i++;
    }
1 голос
/ 26 марта 2020

Входной файл заканчивается новой строкой Linux. Поэтому есть другая строка, но она пуста. Если вы удалите последний символ новой строки из ввода, программа начнет работать нормально.

Или импортируйте исключение

import java.util.NoSuchElementException;

и проигнорируйте его в коде

    while (scanner.hasNextLine()) {
        System.out.println("" + i);
        try {
            lettura[i] = scanner.next();
        } catch (NoSuchElementException e) {}
        i++;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...