最近客户现场的技术支持接连反馈了一个问题:导入数据的时候,上传的excel会在服务器上生成一个临时文件,而这个临时文件都在  tomcat 的安装目录下,如果上传次数比较多的话,就会导致tomcat安装目录下有多个临时的excel文件,很不合理也不美观,如下图:

接到这个问题,第一反应是  java.io.tmpdir 这个系统配置没指定好,因为做上传的时候,是通过

System.getProperty("java.io.tmpdir");

这种方式来获取临时目录,然后把文件放到临时目录里去的,按说这些临时文件都应该在 tomcat 安装目录下的 temp 文件夹里,因为这个是tomcat的临时目录,但现在却没有,所以怀疑是 java.io.tmpdir 这个系统变量没指定好。

之后就开始了各种查找资料,百度查完了查搜狗,搜狗查完了查Stack Overflow,但并没有得到想要的答案,所有的文件都是告诉你临时文件目录在哪,当然也查到了如果去设置这个 java.io.tmpdir ,通过下面的方式:

  java -Djava.io.tmpdir=/path/to/tmpdir

但实际在linux服务器上执行的时候,发现这个命令根本无法执行,查了 Stack Overflow 才知道,这个命令后面还需要跟一个有 main 方法的Java类才行,但这显然是行不通的,也跟我想象中的设置java.io.temdir属性的方式不一样,只能接着查资料。

查了半天,也没什么收获,问题始终没解决,最后,打印了一下程序执行时取到的  java.io.tmpdir 对应的目录,才知道问题在哪,代码如下:

先看一下打印结果:

可以看出来,程序运行时取到的  java.io.tmpdir 的值是完全正确的,对应的就是tomcat安装目录下的 temp 文件夹

再看日志打印下面的代码,原来我在拼接文件完整路径的时候,在临时目录和文件名之间没有加  /  ,导致拼接出来的临时文件是这样的地址:

  /iflytek/apache-tomcat-9155/tempff9d68f1-9548-437f-a3e1-0ed93647392c_test.xlsx

也就是临时目录的 temp 和文件名连一块了,结果自然而然的就是,临时文件被上传到了 /iflytek/apache-tomcat-9155/  这个tomcat的安装目录下,导致了最开始的问题。

问题到这是解决了,但在查资料的过程中,知道了很多新的知识。

在  tomcat 安装目录下的  bin/catalina.sh 这个命令里指定了 tomcat 的临时目录,而在程序中通过

System.getProperty("java.io.tmpdir");

取系统的临时目录的时候,取的就是 tomcat 的临时目录,也就是 tomcat  安装目录下的 temp 文件夹。指定 java.io.tmpdir 对应目录的地方也是在 bin/catalina.sh 命令里。

首先,tomcat 启动的时候,虽然用的启动命令是  bin/startup.sh ,但这只是一个入口,启动的过程都是在 bin/catalina.sh 这个命令里,这个 catalina.sh 才是主要的命令,你甚至可以通过catalina.sh 这个命令启动 tomcat 。

那么,回归主题,tomcat 是如何指定它的临时目录的呢?

用文本编辑器打开 bin/catalina.sh 命令文件,上面是一大段注释,从注释中可以看到:

CATALINA_TMPDIR  这个对应的是tomcat的临时目录,而 JVM 的 java.io.tmpdir 使用的就是 CATALINA_TMPDIR 对应的目录。

接着往下翻可以看到:

CATALINA_TMPDIR  对应的是  "$CATALINA_BASE" 下的 temp 文件夹,而 "$CATALINA_BASE" 就是 tomcat 的安装目录,

也就是说在这里,指定了 tomcat 的临时目录是tomcat安装目录下的 temp 文件夹

而 tomcat 又是如何指定 CATALINA_TMPDIR   作为 java.io.tmpdir 对应的目录的呢?

接着往下看,可以看到:

在执行的时候,通过 java -D 命令,指定了 JVM 的 java.io.tmpdir 系统属性的值为  CATALINA_TMPDIR   对应的值

可以看到,tomcat 在启动的时候就已经指定了 java.io.tmpdir 对应的属性值,并且指定的是它的临时目录,这样在程序中通过 java.io.tmpdir  获取临时目录的时候,取到的都是tomcat的临时目录地址

总结一下:

1、tomcat 的临时目录地址是在 bin/catalina.sh 命令里指定的,指定的默认值是  安装目录下的 temp 文件夹,当然也可以根据需要修改成自己想要设置的目录地址

2、以 tomcat 为容器的项目里,通过 System.getProperty("java.io.tmpdir")   取JVM的临时目录地址,取到的都是tomcat的临时目录,这是在tomcat启动时就指定的

3、拼接文件地址的时候,一定要注意目录之间的分隔符  /  ,没有分隔符 /  ,目录名就成了文件名的一部分

Tomcat临时目录及java.io.tmpdir对应的目录的更多相关文章

  1. java.io.tmpdir在哪里?

    查找所在目录的方式如下: System.out.println(System.getProperty(“java.io.tmpdir”)); System.getProperty(),还可以获取更多其 ...

  2. Java System.getProperty("java.io.tmpdir") 获取系统临时目录

    System.getProperty("java.io.tmpdir") 是获取操作系统的缓存临时目录 在windows7中的目录是: C:\Users\登录用户~1\AppDat ...

  3. 关于System.getProperty("java.io.tmpdir");的输出,及System.getProperty();参数

    1,首先来介绍下System.getProperty("java.io.tmpdir")输出因为这个输出有点特殊. 理论介绍:他是获取系统临时目录.可以是window的temp,l ...

  4. java.io.tmpdir指定的路径在哪?

    Java.io.tmpdir介绍 System.getproperty(“java.io.tmpdir”)是获取操作系统缓存的临时目录,不同操作系统的缓存临时目录不一样, 在Windows的缓存目录为 ...

  5. Java.io.tmpdir介绍

    System.getproperty(“java.io.tmpdir”)是获取操作系统缓存的临时目录,不同操作系统的缓存临时目录不一样, 在Windows的缓存目录为:C:\Users\登录用户~1\ ...

  6. hive启动时报错 java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D at org.apache.hadoop.fs.Path.initialize

    错误提示信息如下 错误信息如下 [root@node1 bin]# ./hive Logging initialized -bin/lib/hive-common-.jar!/hive-log4j.p ...

  7. java io系列01之 "目录"

    java io 系列目录如下: 01. java io系列01之  "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括 ...

  8. hive-相关报错处理${system:java.io.tmpdir}

    在使用hive的时候启动成功 [root@localhost bin]# ./hive which: no hbase in (/usr/local/hive/apache-hive-2.1.1-bi ...

  9. hive启动报错:system:java.io.tmpdir等

    解决方法:在hive-site.xml中添加 <property>    <name>system:java.io.tmpdir</name>    <val ...

随机推荐

  1. 深度探索 OpenStack Neutron:BGP(1) 【转载】

    3.4 BGP 原文地址:http://mp.weixin.qq.com/s?src=3&timestamp=1500043305&ver=1&signature=XwiIVV ...

  2. 13 个 C# 10 特性

    原文链接:https://blog.okyrylchuk.dev 原文作者:Oleg Kyrylchuk 译: 等天黑 常量的内插字符串 C# 10 允许使用在常量字符串初始化中使用插值, 如下 co ...

  3. IM2605说明书| InmicroIM2605|IM2605芯片

    IM2605描述 IM2605集成了一个同步4开关Buck-Boost变换器,在输入电压小于或大于输出电压时保持输出电压调节.当输入电压足够大于输出电压时,它作为Buck变换器工作,并随着输入电压接近 ...

  4. CS5202Capstone|CS5202芯片|CS5202芯片方案

    一.CS5202功能概述CS5202结合了DisplayPort输入接口和模拟RGB DAC输出接口.嵌入式单片机基于工业标准8051核心,适用于多个细分市场和显示器应用程序,如笔记本电脑.主板.台式 ...

  5. 基于Spring MVC + Spring + MyBatis的【图书资源管理系统】

    资源下载:https://download.csdn.net/download/weixin_44893902/45598347 练习点设计:模糊查询.删除.新增 一.语言和环境 实现语言:JAVA语 ...

  6. Eclipse远程调试Java代码的三种方法

    Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...

  7. [ python应用 ] python递归搜索文件,支持搜索多个文件,支持自定义处理动作

    写了一个PyQT界面的版本:https://github.com/LongchuanYu/pyqt_project PATH = r'E:\MyDocument\新しいフォルダー\' # 要搜索的目录 ...

  8. Spark本地环境实现wordCount单词计数

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6814778610788860424/ 编写类似MapReduce的案例-单词统计WordCount 要统计的文件为 ...

  9. iview 按需引入解决加载慢的问题

    如果出现加载2s以上的情况请先查看服务器是否对大文件进行过压缩优化处理. 按照官方文档把iview引入到vue的项目中,全部引入的时候没问题.当按官方文档显示的按需加载是借助插件babel-plugi ...

  10. atroot 的个人博客

    我的个人博客 左上角 MENU 打开导航菜单! 向下滚动查看内容! 为啥我要坚持更新博客 周围有很多小伙伴在问,你写博客会有人看嘛?如果没人看,那岂不是写的就没有意义了吗? 这个问题也一度让我陷入是否 ...