zoukankan      html  css  js  c++  java
  • 项目打包成jar包发布,程序中无法读取静态文件

    在war包中可以通过以下方式来获取文件,如下:

    public class FilePathTest {
    
        public static void main (String[] args) {
            FileReader reader = null;
            try {
                // 方法一:通过文件全路径获取文件
                String path = Thread.currentThread().getContextClassLoader().getResource("static/test.txt").getFile();
    //            String path = ResourceUtils.getURL(ResourceUtils.CLASSPATH_URL_PREFIX +"static/test.txt").getPath();
    //            String path = ResourceUtils.getURL("classpath:static/test.txt").getPath();
    //          // 输出结果  /C:/projects/practice/target/classes/static/test.txt
                System.out.println(path);
    //            File file = new File(path);
                //  方法二:通过相对路径直接获取文件
    //            File file = ResourceUtils.getFile("classpath:static/test.txt");
                ClassPathResource resource = new ClassPathResource("static/test.txt");
                File file = resource.getFile();
                reader = new FileReader(file);
                char[] bytes = new char[21704];
                reader.read(bytes);
                StringBuffer sb = new StringBuffer();
                sb.append(bytes);
                // 输出结果  哈哈,这是一个测试文件 
                System.out.println(sb.toString());
    //            String content = new String(bytes);
    //            // 输出结果  哈哈,这是一个测试文件
    //            System.out.println(content);
            }catch (Exception e) {
                e.printStackTrace();
            }finally {
                if (reader != null) {
                    try {
                        reader.close();
                    }catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    问题来了,上图的获取方式中有一个共同点:都是根据文件地址来获取文件对象。该文件地址都是编译之后的文件目录,在war包中可以根据该地址获取文件,但是,当打包成JAR包时,无法通过该地址查找到文件对象,那么在JAR包中,如何读取静态文件呢?

    在jar包中必须通过流的方式来读取文件

    解决方案一:

    OutputStream outputStream = null;
    InputStream inputStream = null;

    ClassPathResource resource = new ClassPathResource("static/test.xls");
    File test= new File("D://test.txt"); 

    int len;

    byte[] buf = new byte[1024];

    try {
      outputStream = new FileOutputStream(test);

      inputStream =
    new FileInputStream(resource.getInputStream());
      while ((len = inputStream.read(buf))>0) { 
        outputStream.write(buf,0,len);
      }
    }catch (IOException io) {
       e.printStackTrace(); 
     } finally { 
        try {
          outputStream.close();
          inputStream.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
     }

    不获取 java.io.File 对象,而是直接获取输入流:
    
    Resource resource = new ClassPathResource("static/test.xls");
    BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream()));
    
    
    说明:构造得到 resource 对象之后直接获取其输入流 resource.getInputStream()。

    解决方案二:

    使用this.getClass().getClassLoader().getResourceAsStream();这种方式获取文件的流数据

    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("static/test.xls");

     

  • 相关阅读:
    C# 收集几条ToString()格式
    C# 使用Quartz简单实例以及备忘
    C# Linq 常用查询操作符
    .Net Core 创建和使用中间件
    .Net Core 学习依赖注入自定义Service
    .Net Core 学习路由和请求参数传递
    .Net Core 学习新建Core MVC 项目
    ExtJS笔记5 Components
    ExtJS笔记4 容器与布局(Layouts and Containers)
    ExtJS笔记3 MVC Architecture
  • 原文地址:https://www.cnblogs.com/zhlblogs/p/13592207.html
Copyright © 2011-2022 走看看