经过这些天的学习,文件路径这个问题经常让人头疼,下面我就总结了我用过的方法:
1.自己手动输入绝对路径地址(代码块里面有详细注释)
在主函数里面测试代码如下:
BufferedImage bufImg; // 实例化BufferedImage类,检测图片是否读取成功
/**
* 读取的第一种方式,自己手写绝对路径 检测图片是在java编译后的文件夹,所以文件路径为 C:\Program
* Files\workspace\SecurityCodeRecognition\bin\image
*/
/*
* 注意事项:1.盘符大小写都是可以的 2.反斜杠必须要使用转义字符,也就是\\ 3.路径字符有空格也是可以的
* 4.正斜杠不需要转义字符,并且用正斜杠写的时候,地址字符串开始的那个"/"可加可不加
*/
bufImg = ImageIO.read(new File("C:\\Program Files\\workspace\\SecurityCodeRecognition\\bin\\image\\0.gif"));
System.out.println("第一种方式的读取(反斜杠):图片的宽度为" + bufImg.getWidth());
// 输出结果为: 第一种方式的读取(反斜杠):图片的宽度为9
bufImg = ImageIO.read(new File("/C:/Program Files/workspace/SecurityCodeRecognition/bin/image/0.gif"));
System.out.println("第一种方式的读取(正斜杠):图片的宽度为" + bufImg.getWidth());
// 输出结果为:第一种方式的读取(正斜杠):图片的宽度为9
2.手写相对路径
/**
* 读取的第二种方式,自己手写相对路径 检测图片为本项目的文件夹下(未编译),文件路径为:C:\Program
* Files\workspace\SecurityCodeRecognition\source\image
*/
/*
* 注意事项:1.一个"."表示当前工程项目的文件目录 2.反斜杠必须要使用转义字符,也就是\\ 3.同样,正斜杠反斜杠都是可以的
* 4.SecurityCodeRecognition为本项目的名称
*/
bufImg = ImageIO.read(new File(".\\source\\image\\0.gif"));
System.out.println("第二种方式的读取(反斜杠):图片的宽度为" + bufImg.getWidth());
// 输出结果为:第二种方式的读取(反斜杠):图片的宽度为9
bufImg = ImageIO.read(new File("./source/image/0.gif"));
System.out.println("第二种方式的读取(正斜杠):图片的宽度为" + bufImg.getWidth());
// 输出结果为:第二种方式的读取(正斜杠):图片的宽度为9
3.自动获取绝对路径
/**
* 读取的第三种方式,自动获取绝对路径 这种方法针对的是编译好的bin文件夹的文件,也就是打包后图片路径
* 检测图片是在java编译后的文件夹,所以文件路径为 C:\Program
* Files\workspace\SecurityCodeRecognition\bin\image
*/
String path = "/image/0.gif"; // 自己输入资源文件相对于bin文件夹的路径,"/"表示bin根目录,也就是打包后的根目录
String p1 = PathTest.class.getResource(path).getFile(); // 获取根据相对路径得到的绝对路径的地址
System.out.println("直接获取绝对路径:" + p1);// 获取并输出"0.gif"文件的绝对地址
// 输出结果为:直接获取绝对路径:/C:/Program%20Files/workspace/SecurityCodeRecognition/bin/image/0.gif
// 可以看出结果为正斜杠,和我们手写的差距不大,但是这个地址还不能用,下面再说
File f = new File(PathTest.class.getResource(path).getFile()); // 获取改路径的文件
String p2 = f.getAbsolutePath(); // 获取它的绝对路径
System.out.println("间接获取的结果为:" + p2); // 输出它的绝对路径
// 结果为:间接获取的结果为:C:\Program%20Files\workspace\SecurityCodeRecognition\bin\image\0.gif
// 这时候获取的路径为反斜杠
// 下面测试上面获取的路径
// bufImg= ImageIO.read(new
// File(p));直接这样读取是不可以的,会报错,原因在于获取的路径有%20,也就是空格字符串,要去掉他
// 所以还要对字符串处理一下,因为编码方式的原因
p1 = URLDecoder.decode(p1, "UTF-8"); // 对字符串进行重新编码(这一步很关键)
System.out.println("处理后的结果为:" + p1);
// 输出结果为:处理后的结果为:/C:/Program
// Files/workspace/SecurityCodeRecognition/bin/image/0.gif
bufImg = ImageIO.read(new File(p1));
System.out.println("字符串处理后的结果(正斜杠):图片的宽度为:" + bufImg.getWidth());
// 这时候可以正常读取,结果为:字符串处理后的结果(正斜杠):图片的宽度为:9
p2 = URLDecoder.decode(p2, "UTF-8"); // 对字符串进行重新编码
System.out.println("处理后的结果为(反斜杠):" + p2);
// 输出结果为:处理后的结果为(反斜杠):C:\Program
// Files\workspace\SecurityCodeRecognition\bin\image\0.gif
bufImg = ImageIO.read(new File(p2));
System.out.println("字符串处理后的结果:图片的宽度为:" + bufImg.getWidth());
// 这时候可以正常读取,结果为:字符串处理后的结果:图片的宽度为:9
4.通过ClassLoader类来获取,和上一种方法大同小异
/**
* 读取的第四中方法,通过ClassLoader类来获取,和上一种方法大同小异
*/
// 使用ClassLoader类
PathTest p=new PathTest();
URL fileURL =p.getClass().getResource("/image/0.gif");
System.out.println("获取的地址为:"+fileURL.getFile());
//输出结果为:获取的地址为:/C:/Program%20Files/workspace/SecurityCodeRecognition/bin/image/0.gif
5.通过流文件来读取
/**
* 读取文件的第五种方法(这是读取文件),针对于打包好的jar文件的一种操作
*/
InputStream is = p.getClass().getResourceAsStream("/image/0.gif"); //通过该方法可以得到0.gif的文件流,
//下面是利用is文件流将该流保存为文件的操作,自己可定义路径
byte[] bs = new byte[1024]; //设置1k的流缓冲
int len;// 读取到的数据长度
OutputStream os = new FileOutputStream("d:/0.gif"); // 新建输出文件,文件路径自己设置,为绝对路径
while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len); // 将输出流写到文件
}
以上代码均在主函数里面测试通过,文件路径可自己更改