hdfs 复制文件 java.io.FileNotFoundException(文件名、目录名或卷标语法不正确)

Exception in thread "main" java.io.FileNotFoundException: hdfs:\192.168.73.16:8020\user\9003547\text.txt (文件名、目录名或卷标语法不正确。)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)
    at org.chinaskin.hadoop.FileCopy.main(FileCopy.java:29)

在win上使用Myeclipse链接hadoop时出现如上错误,注意看打印的错误信息,传入的是 hdfs://192.xxxx,变成了hdfs:\192xxxxx,将传入的两个参数打印出来发现并无异常并且文件在hdfs上是存在的。
代码如下:

import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class aa {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(args[1]), conf);
        InputStream in = new BufferedInputStream(new FileInputStream(args[0]));
        OutputStream out = fs.create(new Path(args[1]));
        IOUtils.copyBytes(in, out, 4096, true);
    }
}

解决方法
因为是从windows上访问hadoop集群,可以认为是远程,所以考虑使用url去读,资料如下
http://www.tuicool.com/articles/aeAVJ3
修改代码

public class aa {
        static  {// 静态块,设置hdfs协议
            URL. setURLStreamHandlerFactory ( new  FsUrlStreamHandlerFactory());
    }
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        URL url = new URL(args[0]);
        InputStream in = url.openStream();//引入相应的包使用url读取数据
        FileSystem fs = FileSystem.get(URI.create(args[1]), conf);
        OutputStream out = fs.create(new Path(args[1]));
        IOUtils.copyBytes(in, out, 4096, true);
    }
}
另一种解决方法,其实找不到文件名的错误是因为,在将一个文件读取转换为字节流的时候,没有经过hadoop 的FileSystem,即
```java
InputStream in = new BufferedInputStream(new FileInputStream(args[0]));
```

修改为InputStream in = new BufferedInputStream(fs.open(new Path(args[0])));
读取hdfs的文件使用 fs.open(enw Path(args[0]))

### 回答1: "java.io.filenotfoundexception" 是 Java 编程语言中的一种异常,表示在程序中找不到指定的文件。当程序尝试打开一个不存在的文件或访问一个不存在的文件路径时,会抛出这个异常。 ### 回答2: java.io.FileNotFoundExceptionJava中的一个异常类,表示在尝试打开或读取文件时,找不到指定的文件。通常在使用文件操作的时候会经常遇到这个异常。 当程序遇到FileNotFoundException时,通常会报出相应的信息,指出哪个文件找不到,以及具体的原因。通常是文件名拼写错误、文件路径错误、文件被删除或移动了、权限问题等等。 为了解决FileNotFoundException,需要仔细检查代码中文件路径是否正确,并确认文件是否存在。在使用绝对路径时,需要保证路径的正确性;在使用相对路径时,需要注意当前工作目录的问题。如果程序运行时没有足够的权限读取文件,需要修改文件权限或在代码中使用管理员权限来操作文件。 在处理FileNotFoundException时,还需要注意程序的异常处理机制。对于这种IO异常,通常应该使用try...catch语句来捕捉并处理异常,以避免程序终止或出现异常信息。同时,也应该输出合适的错误信息,以便调试和修复问题。 总之,处理FileNotFoundException需要仔细检查程序的文件路径和权限,并使用合适的异常处理机制来保证程序的稳定和正确性。 ### 回答3: Java中的FileNotFoundException文件未找到异常)是一个运行时异常,它表示在尝试访问不存在的文件时发生了问题。 当Java程序无找到指定的文件时,就会发生这个异常。在尝试使用Java IO库读取或写入文件时,如果指定的文件路径无效或文件不存在,则会抛出FileNotFoundException。 在Java中,可以使用File类来表示一个文件或目录,并使用FileInputStream和FileOutputStream来读取和写入文件的内容。但是在进行这些操作之前,必须确保文件路径是正确的,否则就会导致FileNotFoundException错误。 这个异常通常是由以下几种情况引起的: 1.文件名或路径错误:这可能是由于指定的文件名或路径不正确而引起的。在读取或写入文件时,请确保文件路径和文件名正确。 2.文件不存在:当尝试访问不存在的文件时,就会抛出FileNotFoundException。如果文件存在,但另一个应用程序正在使用该文件,则可能需要等待一段时间。 3.权限问题:文件系统中的文件或目录可能受到保护,需要特殊权限才能访问它们。如果您尝试访问没有权限的文件,则会出现FileNotFoundException错误。 为了避免出现FileNotFoundException错误,您应该始终检查文件是否存在,并确保指定的文件名和路径是正确的。如果您不确定文件路径或文件名,请使用Java File类中的exists()方来检查文件是否存在。如果文件存在,则可以安全地读取或写入它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值