复制JAR包中的文件到磁盘

来源:互联网 发布:有域名了怎么注册邮箱 编辑:程序博客网 时间:2024/04/27 21:49
        最近写一个将DB2中数据备份到磁盘上ACCESS的备份工具,其中需要在开始备份的时候将一个模板ACCESS文件从项目资源路径中复制到用户选定的磁盘路径。

        用MyEclipse写的代码,并在MyEclipse中运行成功后,用MyEclipse中的Export将项目打成自动运行的JAR包,但在运行JAR包时出现了问题,无法找到模板ACCESS文件,复制失败。

        究其原因,在Eclipse中项目是以有组织的文件夹形式存放在磁盘上,我们不管是通过绝对路径还是相对路径可以找到相应文件并完成读取,发布成JAR包后,JAR包是一个单独的文件而非文件夹,绝对不可能通过"E:/.../backup.jar/resource/Archive.mdb"这种形式的文件URL来定位文件,即使是相对路径,也无法定位到JAR文件内的资源文件。

       首先,需要解决的是:无论JAR包文件放在系统中的什么位置,通过程序都能定位到JAR包中资源文件。

       我们可以用类装载器(ClassLoader)来做到这一点:ClassLoader 是类加载器的抽象类。它可以在运行时动态的获取加载类的运行信息。 可以这样说,当我们调用JAR中的某个类时,JVM加载进这个类,并记录下类运行时信息(包括所在jar包的路径信息)。幸运的是ClassLoader类中的两个静态方法可以帮助我们获取这些信息:

       ● public static URL getSystemResource(String name);

            查找具有给定名称的资源。资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等)。并返回资源的URL对象。

       ●  public static InputStream getResourceAsStream(String name);

            返回读取指定资源的输入流。

        这两个方法中的参数都是相对于CLASSPATH的路径,其中第二个方法getResourceAsStream(name),可以让我们直接读取到JAR包中文件的内容。接下来就用它来读取资源文件。

        资源定位问题解决了,接下来只需要解决将读取出来的InputStream输入流写入文件就可以了。

        完整代码如下: 

/** * 从JAR中复制文件到磁盘 * @param srcFilePath:源路径,既JAR包中的资源文件,路径相对于CLASSPATH * @param destFilePath:目标路径,磁盘上的任意路径,绝对路径(一般为用户选择的文件夹路径) * @return int:返回执行后的状态;0:失败;1:成功;(可以扩充其它状态) */public static int fileCopy(String srcFilePath, String destFilePath){int flag = 0;File destFile = new File(destFilePath);try {BufferedInputStream fis = new BufferedInputStream(ClassLoader.getSystemResourceAsStream(srcFilePath));FileOutputStream fos = new FileOutputStream(destFile);byte[] buf = new byte[1024];int c = 0;while ((c = fis.read(buf)) != -1) {fos.write(buf, 0, c);}fis.close();fos.close();flag = 1;} catch (IOException e) {e.printStackTrace();}return flag;}

原创粉丝点击