Я работаю над проектом для класса и пытаюсь создать метод, который будет читать файл и заполнять массив. Внутри метода я также использую другой метод, вызываемый из созданного мной класса. Я предлагаю пользователю ввести файл для чтения, и независимо от того, что я делаю, я все время получаю сообщение об ошибке, что файл не существует.

Вот начальный код, с которым я работаю:

 public static void main(String[] args) throws Exception {
    Scanner input = new Scanner(System.in);
    System.out.print("Enter the file to read from:");
    String readFile = input.nextLine();
    System.out.print("Enter the number of accounts in the file: ");
    int size = input.nextInt();
    Account[] Accounts = readFile(readFile, size);
    Account[] invalidAccounts = new Account[34];
    for (int i = 0; i < Accounts.length; i++) {
        String password = Accounts[i].getPassword();
        if (isValidPassword(password) == false) {
            invalidAccounts[i] = Accounts[i];
        }
    }
    createDistributionList(invalidAccounts);
}
public static Account[] readFile(String readFile, int size) throws Exception {
    Account[] Accounts = new Account[size];
    File myFile = new File(readFile);
    Scanner fileInput = new Scanner(myFile);
    for (int i = 0; i < Accounts.length; i++) {
            int stuID = fileInput.nextInt();
            String name = fileInput.next();
            String username = fileInput.next();
            String password = fileInput.next();
            Accounts[i] = new Account(stuID, name, username, password);
    }
    return Accounts;
}

Вот след, который я получаю, если использую кавычки:

Enter the file to read from:"studentdata.txt"
Enter the number of accounts in the file: 34
Exception in thread "main" java.io.FileNotFoundException: "studentdata.txt" (The filename, directory name, or volume label syntax is incorrect)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)
    at java.util.Scanner.<init>(Scanner.java:656)
    at accountdriver.AccountDriver.readFile(AccountDriver.java:38)
    at accountdriver.AccountDriver.main(AccountDriver.java:25)
Java Result: 1

А вот след без кавычек:

Enter the file to read from:studentdata.txt
Enter the number of accounts in the file: 34
Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:909)
    at java.util.Scanner.next(Scanner.java:1530)
    at java.util.Scanner.nextInt(Scanner.java:2160)
    at java.util.Scanner.nextInt(Scanner.java:2119)
    at accountdriver.AccountDriver.readFile(AccountDriver.java:40)
    at accountdriver.AccountDriver.main(AccountDriver.java:25)
Java Result: 1
BUILD SUCCESSFUL (total time: 7 seconds)

А вот и исправно работающий код:

public static void main(String[] args) throws Exception {
    Scanner input = new Scanner(System.in);
    System.out.print("Enter the file to read from:");
    String readFile = input.nextLine();
    System.out.print("Enter the number of accounts in the file: ");
    int size = input.nextInt();
    Account[] Accounts = readFile(readFile, size);
    Account[] invalidAccounts = new Account[34];
    for (int i = 0; i < Accounts.length; i++) {
        String password = Accounts[i].getPassword();
        if (isValidPassword(password) == false) {
            invalidAccounts[i] = Accounts[i];
        }
    }
    createDistributionList(invalidAccounts);
}
public static Account[] readFile(String readFile, int size) throws Exception {
    Account[] Accounts = new Account[size];
    File myFile = new File(readFile);
    Scanner fileInput = new Scanner(myFile);
    for (int i = 0; i < Accounts.length; i++) {
            int stuID = fileInput.nextInt();
            String name = fileInput.nextLine();
            String username = fileInput.nextLine();
            String password = fileInput.nextLine();
            Accounts[i] = new Account(stuID, name, username, password);
    }
    return Accounts;
}

Мне просто нужно было добавить строку в конец каждого fileInput.next, когда я пытался читать строки.

1
COLEplusTEN 12 Мар 2014 в 06:16
Опубликуйте трассировку стека, чтобы помочь нам лучше диагностировать проблему. Также, пожалуйста, предоставьте нам то, что вы пытаетесь передать в качестве входных данных.
 – 
user695992
12 Мар 2014 в 06:17
2
Если он говорит, что файл не существует, то, вероятно, файл не существует. Вы должны попытаться жестко закодировать это: File f = new File("harcoded file name here"); System.out.println(f.exists());, чтобы сузить проблему.
 – 
assylias
12 Мар 2014 в 06:17
Вы уверены, что файл существует в этом месте?
 – 
Abimaran Kugathasan
12 Мар 2014 в 06:18
Попробуйте File myFile = new File(readFile.trim());
 – 
Elliott Frisch
12 Мар 2014 в 06:18
Где находится файл, откуда вызывается ваш исполняемый файл и что вы вводите на входе
 – 
Farlan
12 Мар 2014 в 06:18

3 ответа

Лучший ответ

Трассировка стека содержит

«Неправильное имя файла, имя каталога или синтаксис метки тома»

Предполагая, что в имени есть специальные символы. Похоже, вы заключили имя в кавычки.

Enter the file to read from:"studentdata.txt"

Вы бы использовали кавычки, если бы имя файла было строкой Java в исходном коде, но при вводе текста через консоль они не требуются.

1
slipperyseal 12 Мар 2014 в 06:39
Хорошо, это имеет смысл. Но я получаю другую ошибку, если не использую кавычки. Я добавлю это в свои вопросы.
 – 
COLEplusTEN
12 Мар 2014 в 06:40
Без использования кавычек сработало (файл открылся). затем вы просто получили последующие ошибки, потому что не смогли проанализировать файл :)
 – 
slipperyseal
12 Мар 2014 в 06:51
Так почему же файл не обрабатывается?
 – 
COLEplusTEN
12 Мар 2014 в 06:55
InputMismatchException предполагает, что когда он пытается прочитать int, int там нет. либо файл просто неправильный, либо он не обрабатывает новые строки (или что-то в этом роде), как вы ожидаете. я предлагаю внести некоторую отладку для печати каждого символа по мере его чтения (после каждого scan.next() - и посмотреть, где он ломается).
 – 
slipperyseal
12 Мар 2014 в 06:58
Вау как грустно. Там, где я пытался прочитать строки, у меня не было .nextLine(), у меня был только .next(), из-за которого файл не анализировался... Большое спасибо за помощь!
 – 
COLEplusTEN
12 Мар 2014 в 07:09

FileNotFoundException будет означать, что ваш файл (имя) не существует, или файл находится в неправильном месте.

Если вы собираетесь читать путь к файлу как "studentdata.txt", вам нужно понимать, что при работе из IDE обычно он пытается найти файл в текущем рабочем каталоге, который является корнем проекта. . Значит, ваш файл должен быть там.

Вместо этого вы можете просто использовать абсолютный путь, например C:/path/to/file.txt

В случаях, когда файл будет встроенными ресурсами, вы можете использовать MyClass.class.getResourceAsStream(fileName) там, где файл будет в пути к классу. Так ты мог бы сделать

InputStream is = MyClass.class.getResourceAsStream(fileName);
Scanner scanner = new Scanner(is);

Где ваш файл будет в том же пакете, что и ваш класс, если вы просто собираетесь использовать имя файла в качестве пути.

Итак, вам есть о чем подумать.

0
Paul Samsotha 12 Мар 2014 в 06:50
У меня есть файл в корне проекта. Я также пытался использовать абсолютный путь без успеха. Я попробую использовать InputStream, чтобы посмотреть, что я могу придумать. Я новичок в Java, поэтому я никогда не использовал InputStream. Он говорит мне, что класс не статичен, поэтому его нельзя использовать, а затем что-то говорит об URL-адресах.
 – 
COLEplusTEN
12 Мар 2014 в 06:48
Я даже не уловил +1
 – 
Paul Samsotha
12 Мар 2014 в 06:51

Вам необходимо скопировать и вставить текстовый файл «studentdata.txt» в файл проекта (перейдите к конкретному имени проекта) внутри расположения NetbeansProjects. t должно работать нормально!

0
Kipruto Barno 29 Дек 2014 в 13:05