2016-12-13 2 views
0

Я пытаюсь написать код для игры с угадыванием слов, и она хорошо работает, когда я использую bufferedreader и inputstream вместе. Но когда я пытаюсь использовать его с помощью сканера, он не может найти файл, хотя в обоих случаях файл находится в одной папке. Он находится в папке с именем res в папке src в моей папке проекта (я кодирую в eclipse).Сканер бросает FileNotFoundException, но с использованием буферизованного считывателя и входного потока нет?

import java.util.ArrayList; 
import java.util.Scanner; 
import java.io.File; 

public class WordGen { 

    private final String filename = "/res/words.txt"; 
    File file = new File(filename); 
    Scanner input = null; 
    private ArrayList<String> list = new ArrayList<>(); 

    public WordGen() { 
     try { 
      input = new Scanner(file); 

      while (input.hasNextLine()) { 
       String w = input.nextLine(); 
       list.add(w); 
      } 
     } catch (Exception ex) { 
      System.out.println("File not found."); 
     } 
    } 

    public String getword() { 
     if (list.isEmpty()) { 
      return "NOTHING"; 
     } 
     return list.get((int) (Math.random() * list.size())); 
    } 
} 

public class test { 

    public static void main(String[] args) { 
     WordGen wordgen = new WordGen(); 
     System.out.println(wordgen.getword()); 
    } 

} 

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

EDIT: Вот другой код, который работал (все остальное же, как и раньше):

public WordGenerator() 
{ 
    try(InputStream input = getClass().getResourceAsStream(fileName); 
      BufferedReader bfreader = new BufferedReader(new InputStreamReader(input))) 
    { 
     String line = ""; 
     while ((line = bfreader.readLine()) != null) 
      words.add(line); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Couldn't find file"); 
    } 
} 
+0

Вы не показали код, который предположительно работает с использованием 'BufferedReader' и' InputStream'. Обратите внимание, что в настоящее время вы пытаетесь найти файл в директории 'res' в корневом каталоге вашего компьютера, и вам нужно будет использовать« InputStreamReader ». –

+1

. вот что означает '/ res/words.txt'. Это * не * то же, что и «под вашей папкой src». –

+0

@Jon Skeet добавил другой код. Это работает, но я хочу знать, почему сканер не работает. – Masquerade007

ответ

3

Scanner пытается загрузить файл - и вы предоставляете абсолютное имя файла, /res/words.txt.

Для того, чтобы создать InputStream, вы загружаете ресурс, придавая ей абсолютную ресурс имя, даже если вы назвали переменную fileName:

getClass().getResourceAsStream(fileName) 

Это работает потому, что он может загрузить ресурс под названием /res/words.txt из пути к классам, но он не загружает файл с filename из /res/words.txt.

Вы можете использовать имя файла из res/words.txt, если вы запустите код из каталога src ... или вы могли бы просто придерживаться использования getResourceAsStream, что, вероятно, лучше, поскольку это не зависит от вашего рабочего каталога, и будет продолжать работать, даже если ваш код и ресурсы будут упакованы в файл jar.

Если вы действительно хотите использовать Scanner, вы всегда можете использовать new Scanner(input) - есть Scanner конструктор принимать в InputStream.

Смежные вопросы