Вывод двойной строки из цикла while - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь создать простой одноклассный код для копирования определенных файлов (фотографий) из одной папки в другую в соответствии со списком. Список хранится в отдельном текстовом файле.

Наконец-то у меня ошибка "файл не найден", поэтому я разделил весь код на части и протестировал каждый из них с выводом на консоль. И это то, что я нашел в цикле сканера: Итак, код:

import java.io.File;
import java.util.Scanner;
import java.io.FileNotFoundException;
public class Sandy2 {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        File f = new File("D:\\\\Javasorter\\List.txt");
        Scanner in;
        in = new Scanner(f).useDelimiter("[?! .,;:\t\r\n\f\'\"]");

        String word, pathbuf1, pathbuf2;

        while (in.hasNext()) {

            word = in.next().toLowerCase();
            System.out.println(word);
            Thread.sleep(1000);

            pathbuf1 = "\\IMG_" + word + ".CR2";
            pathbuf2 = "\\IMG_" + word + ".CR2";

            System.out.println(pathbuf1);
            System.out.println(pathbuf2);

        }
    }
}

Ожидаемый результат:

9452

\ IMG_9452.CR2

\ IMG_9452.CR2

9475

\ IMG_9475.CR2

\ IMG_9475.CR2

и т. Д., Пока в списке нет следующего, но

Выход:

9452

\ IMG_9452.CR2

\ IMG_9452.CR2

\ IMG_.CR2

\ IMG_.CR2

9475 \ IMG_9475.CR2

\ IMG_9475.CR2

\ IMG_.CR2

\ IMG_.CR2

и т. Д. /// Команда копирования добавляется в тот же цикл в полной версии программы, где "\ IMG_9452.CR2" присоединен к пути пути

Итак, после того, как первый файл скопирован, я получил ошибку, потому что, конечно, нет файла "IMG_.CR2".

Кто-нибудь знает, почему \ IMG_.CR2 удваивается в каждой итерации цикла? Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Ваша проблема в .useDelimiter("[?! .,;:\t\r\n\f\'\"]"), потому что Scanner будет читать пробелы между строками как строковый объект, поэтому вы должны удалить или изменить его, если вам все еще нужно использовать Delimiter.

Кроме того, вы можете записать путь к файлу с косой чертой /, тогда он станет более читабельным и независимым от ОС, и попытайтесь использовать try-with-resource для предотвращения утечки из источника.

Рассмотрим этот код:

public static void main(String[] args) throws Exception {
    try (Scanner in = new Scanner(new File("D:/Javasorter/List.txt"))) {
        // in.useDelimiter("[?! .,;:\t\r\n\f\'\"]");

        String word, pathbuf1, pathbuf2;
        while (in.hasNext()) {
            word = in.next().toLowerCase();
            System.out.println(word);

            Thread.sleep(1000);

            pathbuf1 = "\\IMG_" + word + ".CR2";
            pathbuf2 = "\\IMG_" + word + ".CR2";
            System.out.println(pathbuf1);
            System.out.println(pathbuf2);
        }
    }
}

Если вы хотите использовать Delimiter для некоторых случаев, вы можете использовать обрезку строки, а затем проверить, является ли строка пустой, например:

public static void main(String[] args) throws Exception {
    try (Scanner in = new Scanner(new File("D:/Javasorter/List.txt"))) {
        in.useDelimiter("[?! .,;:\t\r\n\f\'\"]");

        String word, pathbuf1, pathbuf2;
        while (in.hasNext()) {
            word = in.next().trim().toLowerCase();
            if (!word.isEmpty()) {
                System.out.println(word);

                Thread.sleep(1000);

                pathbuf1 = "\\IMG_" + word + ".CR2";
                pathbuf2 = "\\IMG_" + word + ".CR2";
                System.out.println(pathbuf1);
                System.out.println(pathbuf2);
            }
        }
    }
}
0 голосов
/ 05 сентября 2018

удалите переменную pathbuf2 полностью, и у вас больше не будет дубликатов

...