2014-11-12 2 views
-1

У меня возникли трудности при создании ArrayList файлов ...ArrayList файлов

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

Это то, что я пытаюсь ...

public class Main { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    System.out.println("Menu"); 
    System.out.println("Add - Adds a file"); 
    while (sc.next().equalsIgnoreCase("Add")) { 
     getDocs(); 
    } 
} 
    public static void getDocs() { 
    Scanner sc = new Scanner(System.in); 
    ArrayList<File> allFiles = new ArrayList<>(); 
    allFiles.add(new File(sc.nextLine())); 
    System.out.println(allFiles.toString()); 
} 

Println будет показывать только самый последний файл добавлен в ArrayList, и он также не показывает текст в файле, поэтому я полагаю, мой ArrayList не работает, как я хочу ...

значение выходной я ожидал бы ...

Menu 
Add- adds a file 

add 
C://somepath//file1 

This is the text in file 1 

add 

C://somepath//file2 

This is the text in file 1 
This is the text in file 2 

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

+0

Вы хотите добавить файлы также в коллекцию, в которую пользователь вводит? И нет места для диалогового окна или что-то в этом роде? Вам нужно проверить, является ли файл допустимым файлом или вы просто предполагаете, что пользователь дает вам, правильно? – DejaVuSansMono

+0

Хехе, прежде всего, toString() просто печатает шестнадцатеричный код вашего объекта. Если вы хотите, например, показывать содержимое файла, у вас должна быть своя версия toString() с переопределением, которая будет печатать содержимое файла. Таким образом, у вас должен быть класс-оболочка, который будет обертывать файл (один за другим) и просто иметь метод toString() для печати его значения. Вместо этого ArrayList должен содержать классы Wrapper. – energizer

+2

@energizer - нет, это не ... toString() печатает все, что хочет реализовать печать классов. _default_ 'Object.toString()' печатает адрес вашего объекта, но ArrayList переопределяет это и печатает список содержимого, разделенный запятыми. Вы не можете сделать (многие) общие утверждения о toString. –

ответ

0

allFiles должна быть переменная член класса, а не локальная переменная getDocs метода

Попробуйте это:

public class Main { 
    public static void main(String[] args) { 
     new Main().menu(); 
    } 

    ArrayList<File> allFiles = new ArrayList<>(); 

    public void menu() { 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Menu"); 
     System.out.println("Add - Adds a file"); 

     while (sc.next().equalsIgnoreCase("Add")) { 
      getDocs(); 
     } 
    } 

    public void getDocs() { 
     Scanner sc = new Scanner(System.in); 
     allFiles.add(new File(sc.nextLine())); 
     System.out.println(allFiles.toString()); 
    } 
} 

Кроме того, метод File#toString дает вам имя файла, а не содержимое файла. Вам действительно нужно будет сделать несколько дополнительных шагов для чтения и вывода файла, если это то, что вы хотите.

0

С allFiles.toString() вы печатаете строковое представление своего ArrayList.

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

4

Вы

ArrayList<File> allFiles = new ArrayList<>(); 

в getDocs() методом.

Это объявление делает его переменной local. Ваш список должен быть объявлен и инициализирован как class переменной (вне всех методов), а затем просто использовать в getDocs()

0

Вы можете сделать это простым способом.

public static void main(String[] args) { 
     List<File> allFiles = new ArrayList<>(); 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Menu"); 
     System.out.println("Add - Adds a file"); 
     while (sc.next().equalsIgnoreCase("Add")) { 
      getDocs(allFiles); 
     } 
     System.out.println(allFiles.toString()); 
    } 
    public static void getDocs(List<File> files) { 
     Scanner sc = new Scanner(System.in); 
     files.add(new File(sc.nextLine())); 
    } 
+0

Почему бы вам не создать новый объект 'Scanner' для * каждого * файла? –

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