首页 > 解决方案 > while循环的双字符串输出

问题描述

我正在尝试制作简单的一类代码,以根据列表将一些确定的文件(照片)从一个文件夹复制到另一个文件夹。该列表保存在单独的 txt 文件中。

最后我发现文件未找到错误,所以我将整个代码分成几部分,并用控制台输出测试它们中的每一个。这就是我在扫描仪while循环中发现的:所以代码:

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”附加到路径srting

所以,在复制第一个文件后我得到了错误,因为当然没有“IMG_.CR2”文件。

有谁知道为什么 \IMG_.CR2 在每次循环迭代中翻倍?非常感谢!

标签: javastringloopsfile-iojava-io

解决方案


您的问题出在.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某些情况下使用,你可以使用 string trim 然后检查 string 是否为空,比如:

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);
            }
        }
    }
}

推荐阅读