将多个文件的内容连接成一个文件的Java程序......?

时间:2015-11-21 17:46:58

标签: java

我正在编写一个我在CMD线上运行的java程序,它将多个.txt文件复制到一个文件中。例如,我创建了三个.txt文件。 Chapter1.txt,chapter2.txt Chapter3.txt。这些文件的所有内容都需要复制到book.txt。我运行了代码,它运行正常,直到我输入命令。

java CatFiles chapter1.txt chapter2.txt chapter3.txt book.txt

创建了book.txt文件,但只复制了一个文件的内容,我收到此错误代码

java.land.illeglStateException: Scanner 
      at java.util.Scanner.ensureOpen(unknown Source)
      at java.util.Scanner.findWithinHorizon(unknown Source)
      at java.util.Scanner.hasNextLine(unknown Source)
      at CatFiles.main(CatFiles.java)

这是我的代码

public class CatFiles {
    public static void main(String[] args) throws IOException {
        if (args.length < 2) {
            System.out.println("Usage: CatFiles sourcefile1 sourcefile2 . . . targetfile");
            return;
        }
        String target = args[args.length - 1];
        FileReader reader = null;
        PrintWriter out = new PrintWriter(target);
        for (int i = 0; i < args.length - 1; i++) {
            String source = args[i];
            reader = new FileReader(source);
        }
        Scanner in = new Scanner(reader);
        while ( in .hasNextLine()) {
            try {
                String line = in .nextLine();
                out.println(line);
            } finally { in .close();
                out.close();
            }
        }
    }
}

3 个答案:

答案 0 :(得分:2)

使用此(注意:关于参数的检查留作练习):

public static void main(final String... args)
{
    final List<String> list = new ArrayList<>();
    Collections.addAll(list, args);

    final Path dstFile = Paths.get(list.remove(list.size() - 1));

    try (
        final OutputStream out = Files.newOutputStream(dstFile);
    ) {
        for (final String s: list)
            Files.copy(Paths.get(s), out);
    }
}

答案 1 :(得分:0)

您应该将while循环放在try block内,而不是相反。否则,您将在第一个循环处关闭Scanner并且您不能再使用它了。一旦你再也不用它,请关闭Scanner

老实说,我认为正确的缩进会对此有所帮助。

的JavaDoc

  

抛出:NoSuchElementException如果没有找到线路   如果此扫描仪已关闭,则 java.lang.IllegalStateException

解决方案

Scanner in = new Scanner(reader);
try{
    while (in.hasNextLine()) {
      String line = in.nextLine();
      out.println(line);
    }
} finally {
    in.close();
    out.close();
}

答案 2 :(得分:0)

使用番石榴的惯用解决方案:

这包括对有效参数数量的基本错误检查。对于简洁和范围控制,这不会进行强大的惯用异常处理。

该解决方案还使用Immutable数据,使其免受逻辑错误的影响,因为副作用和状态突变。

Q33846584.java

导入语句可在上面的链接中找到。

public class Q33846584
{
    public static void main(final String[] args) throws Exception
    {
        checkArgument(args.length > 2, "You must supply at least 3 file paths as arguments dest, src, src, ...");
        final List<Path> paths = Lists.transform(Arrays.asList(args), new Function<String, Path>()
        {
            @Nullable @Override public Path apply(@Nullable String input)
            {
                return Paths.get(checkNotNull(input));
            }
        });

        final Path destination = paths.get(0);
        try (final OutputStream fos = new FileOutputStream(destination.toFile()))
        {
            for (final Path p : paths.subList(1, paths.size()))
            {
                if (p.toFile().exists())
                {
                    System.out.format("Reading %s and writing to %s", p.toAbsolutePath(), destination.toAbsolutePath());
                    final FileInputStream fis = new FileInputStream(p.toFile());
                    ByteStreams.copy(fis, fos);
                    System.out.println();
                }
                else
                {
                    System.err.format("%s does not exist skipping!", p.toAbsolutePath());
                    System.err.println();
                }
            }
        }
    }
}

没有番石榴:

  1. 你必须在一个简单的命令循环中实现String[]自己的转换。

  2. 您必须实现将InputStream复制到OutputStream,这通常在互联网上有详细记录,但基本上是样板代码。你最终会得到一个可能有虫子或低效的Guava版本。它最多只能用作学习练习。

  3. 这些活动很容易在Stackoverflow上找到,并留作读者练习。