Сканирование ввода файла в HashMap в Java - PullRequest
1 голос
/ 05 июля 2011

Поэтому я пытаюсь пройти по каталогу и найти все экземпляры файла с именем «rels.txt», и для каждого экземпляра я хочу зайти в файл и загрузить отдельные значения из файла в HashMap на Яве. Ниже приведено содержимое одного из файлов «rels.txt», с которыми я работаю:

Текстовый файл:

rId8,image2
rId13,image5
rId7,image1
rId12,image4
rId17,image8
rId15,image7
rId9,image3
rId14,image6

Вот код Java, который у меня есть, который должен пройти через каталог и сохранить каждое из значений в HashMap, распечатать HashMap, а затем очистить его (чтобы новый набор значений можно было сохранить из другого файл rels.txt в каталоге).

Java-код:

private void traverse(File directory) throws FileNotFoundException
    {
        //Get all files in directory
        File[] files = directory.listFiles();
        for (File file : files)
        {
            if (file.getName().equals("rels.txt"))
            {
                Scanner scan = new Scanner(file).useDelimiter(",");
                while (scan.hasNextLine())
                {
                    String id;
                    String image;

                    id = scan.next();
                    image = scan.next();
                    imageMap.put(id, image);
                }
                System.out.println(imageMap);
                imageMap.clear();
            }

            else if (file.isDirectory())
            {
                //It's a directory so (recursively) traverse it
                traverse(file);
            }
        }
    }

Это ошибка / вывод, который я получаю, и я не совсем уверен, где я иду не так.

Ошибка / выход

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at XMLTagParser.traverse(XMLTagParser.java:153)
    at XMLTagParser.traverse(XMLTagParser.java:198)
    at XMLTagParser.traverse(XMLTagParser.java:198)
    at XMLTagParser.<init>(XMLTagParser.java:27)
    at IPDriver.main(IPDriver.java:21)
{image26
rId19=image9
rId31, image15
rId33=image23
rId38, image29
rId21=image11
rId34, image12
rId27=image17
rId30, image28
rId16=image6
rId20, image14
rId32=image22
rId37, image2
rId17=image7
rId25, rId13=image3
rId18, image20
rId35=image25
, image8
rId26=image16
rId39, image24
rId7=image1
rId12, image21
rId14=image4
rId22, image10
rId29=image19
rId24, image13
rId28=image18
rId36, image27
rId15=image5
rId23}

С этим кодом я, по сути, просто хочу иметь возможность вызывать HashMap для другой части моего проекта, и когда я ссылаюсь на одно из значений rId, я могу получить соответствующее значение изображения. У кого-нибудь есть идеи относительно того, что я могу делать неправильно или, может быть, даже более эффективного решения? Заранее спасибо.

Рабочий код Java Благодаря Фридрику:

private void traverse(File directory) throws FileNotFoundException
        {
            //Get all files in directory
            File[] files = directory.listFiles();
            for (File file : files)
            {
                if (file.getName().equals("rels.txt"))
                {
                    Scanner scan = new Scanner(file);
                    while (scan.hasNextLine())
                    {
                        String[] line = scan.nextLine().split(",");
                       imageMap.put(line[0], line[1]);

                    }
                    System.out.println(imageMap);
                      imageMap.clear();
                }

                else if (file.isDirectory())
                {
                    //It's a directory so (recursively) traverse it
                    traverse(file);
                }
            }
        }

Ответы [ 2 ]

3 голосов
/ 05 июля 2011

Поскольку разделителем является "," scan.next () читает "image2 \ nrId13" вместе.Возвращение рассматривается как символ, а не как разделитель.

Еще один способ сделать это - удалить «useDelimiter (», «)» Сканера и использовать этот цикл:

            Scanner scan = new Scanner(file);
            while (scan.hasNextLine())
            {
                String[] line = scan.nextLine().split(",");
                imageMap.put(line[0], line[1]);
            }
            System.out.println(imageMap)

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

1 голос
/ 05 июля 2011

Предполагая, что ваш файл именно то, что вы сказали, вы можете попробовать изменить hasNextLine на hasNext

...