将多个文件的内容连接成一个文件的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程序。。。?,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.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上都很容易找到,留给读者作为练习。atry
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();
}
}
}
}
}