看到别人的文档有句话一直不能理解于是手动在实践中总结答案
文档是这样说的:
/**
* 在某些情况设置URLStreamHandlerFactory的方式不一定会生效.
* 在这种情况下,需要用FileSystem来打开一个文件的输入流,
* 文件的位置是用Hadoop Path呈现在Hadoop中的,与java.io中的不一样
* */
文件位置的呈现怎么就不一样呢?
代码一:
public class URLCat {
static{
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
/**
* IOUtil是个工具类,可以用来在finally从句中关闭流,
* 也可以用来拷贝数据到输出流中.
* copyByte方法的四个参数代表的含义分别是:
* 拷贝的来源,去处,刀背的字节数以及在拷贝完成之后是否关闭流
* */
public static void main(String[] args) {
InputStream in = null;
try {
in = new URL(args[0]).openStream();
//
IOUtils.copyBytes(in, System.out, 4096, false);
} catch (IOException e) {
IOUtils.closeStream(in);
}
}
}
代码二:
public class FileSystemCat {
/**
* 在某些情况设置URLStreamHandlerFactory的方式不一定会生效.
* 在这种情况下,需要用FileSystem来打开一个文件的输入流,
* 文件的位置是用Hadoop Path呈现在Hadoop中的,与java.io中的不一样
* */
public static void main(String[] args) throws IOException {
String uri = args[0];
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
InputStream in = null;
in = fs.open(new Path(uri));
IOUtils.copyBytes(in, System.out, 4090, true);
}
}
我开始尝试给他们都输入相同的路径: hdfs://localhost:9000/user/admin/test.txt //这个是给main函数设参的路径(怎么设置不用我说了吧)
结果都能运行出来.
然后我又把路径修改了下,/user/admin/test.txt ,这个形式在URI中报错,在Path中却依旧可以运行.这样可以理解成Path自动完成了hadoop的协议.