我正在编写一个我在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();
}
}
}
}
答案 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
。
老实说,我认为正确的缩进会对此有所帮助。
抛出:
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
数据,使其免受逻辑错误的影响,因为副作用和状态突变。
导入语句可在上面的链接中找到。
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();
}
}
}
}
}
你必须在一个简单的命令循环中实现String[]
自己的转换。
您必须实现将InputStream
复制到OutputStream
,这通常在互联网上有详细记录,但基本上是样板代码。你最终会得到一个可能有虫子或低效的Guava版本。它最多只能用作学习练习。
这些活动很容易在Stackoverflow上找到,并留作读者练习。