Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将多个文件的内容连接成一个文件的Java程序。。。?_Java - Fatal编程技术网

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

将多个文件的内容连接成一个文件的Java程序。。。?,java,Java,我正在编写一个java程序,运行在CMD行上,它将几个.txt文件复制到一个文件中。例如,我创建了三个.txt文件。第1.txt章,第2.txt章,第3.txt章。这些文件的所有内容都需要复制到book.txt。我运行了代码,它运行良好,直到我输入命令 java CatFiles chapter1.txt chapter2.txt chapter3.txt book.txt 创建了book.txt文件,但只复制了一个文件的内容,我得到了这个错误代码 java.land.illeglStateEx

我正在编写一个java程序,运行在CMD行上,它将几个.txt文件复制到一个文件中。例如,我创建了三个.txt文件。第1.txt章,第2.txt章,第3.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();
            }
        }
    }
}
公共类CATFile{
公共静态void main(字符串[]args)引发IOException{
如果(参数长度<2){
System.out.println(“用法:CatFiles sourcefile1 sourcefile2…targetfile”);
返回;
}
字符串目标=args[args.length-1];
FileReader=null;
PrintWriter out=新的PrintWriter(目标);
对于(int i=0;i
您应该将
while
循环放在
try块的内部,而不是相反。否则,您将在第一个循环中关闭
扫描仪
,无法再使用它。一旦不再使用
扫描仪,请关闭它

我真的认为正确的缩进在这里会有所帮助


文档注释 抛出:
如果找不到行,则抛出NoTouchElementException

java.lang.IllegalStateException
如果此扫描仪关闭

解决方案 使用此选项(注意:关于参数的检查仅作为练习):

publicstaticvoidmain(最终字符串…args)
{
最终列表=新的ArrayList();
Collections.addAll(列表,参数);
最终路径dstFile=Path.get(list.remove(list.size()-1));
试一试(
final OutputStream out=Files.newOutputStream(dstFile);
) {
for(最终字符串s:列表)
文件。复制(path.get,out);
}
}
使用番石榴的惯用解决方案: 这包括对有效参数数的基本错误检查。这不会为简洁性和范围控制提供健壮的惯用异常处理

此解决方案还始终使用
不可变的
数据,使其不受由于副作用和状态突变而导致的逻辑错误的影响

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

公共类Q33846584
{
公共静态void main(最终字符串[]args)引发异常
{
checkArgument(args.length>2,“您必须提供至少3个文件路径作为参数dest、src、src,…);
最终列表路径=Lists.transform(Arrays.asList(args),新函数()
{
@Nullable@覆盖公共路径应用(@Nullable字符串输入)
{
get(checkNotNull(输入));
}
});
最终路径目标=路径。获取(0);
try(final OutputStream fos=新文件OutputStream(destination.toFile())
{
for(最终路径p:paths.subList(1,paths.size()))
{
如果(p.toFile().exists())
{
System.out.format(“读取%s并写入%s”,p.toAbsolutePath(),destination.toAbsolutePath());
final FileInputStream fis=新的FileInputStream(p.toFile());
ByTestStreams.副本(fis、fos);
System.out.println();
}
其他的
{
System.err.format(“%s不存在,正在跳过!”,p.ToAbsolutionPath());
System.err.println();
}
}
}
}
}
没有番石榴:
  • 您必须在命令式循环中自己实现
    字符串[]
    的转换,这非常简单

  • 您必须实现将
    InputStream
    复制到
    OutputStream
    ,这通常在internet上有很好的文档记录,但基本上是样板代码。你最终会得到一个可能有缺陷或效率低下的番石榴版本。它充其量只能作为一种学习练习


  • 这两种活动在Stackoverflow上都很容易找到,留给读者作为练习。

    a
    try
    catch
    是否也能起作用,或者您认为
    try
    在这种情况下效果更好?在这种情况下,您通常不需要捕捉一些东西。因此,您的try..finally块是可以的,因为您只需要finally就可以确定地关闭流。
    Scanner
    使用的是错误的,
    ByteStreams.copy()
    来自Guava的是一行解决方案。好吧,这似乎修复了错误,但没有复制所有三个文件('chapter1-chapter3'))在“book.txt”中,它只复制了第3章,而不复制其余部分。这是什么原因造成的?嗯,我本来只想修正我的错误(已经解决了),我不想只得到答案,所以我接受了这个答案。我是Java新手,所以我想学习修复错误和Yassin,年龄帮助我找到了错误的原因。不过我很感激你的回答。我学习Java是作为一种爱好,而不是作为一个业余爱好interview@fge,你能编辑我的代码让我看看它会是什么样子吗?我尝试了另一个答案,但它只复制了一个文件,而不是所有文件three@Noah就拿我写的代码来说吧;它应该可以正常工作。
    Arrays.asList(args)
    将一步从
    字符串[]
    创建一个
    列表。@JarrodRoberson但您不能从这样的列表中删除任何元素
    
    Scanner in = new Scanner(reader);
    try{
        while (in.hasNextLine()) {
          String line = in.nextLine();
          out.println(line);
        }
    } finally {
        in.close();
        out.close();
    }
    
    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);
        }
    }
    
    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();
                    }
                }
            }
        }
    }