Tomcat临时目录及java.io.tmpdir对应的目录
最近客户现场的技术支持接连反馈了一个问题:导入数据的时候,上传的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对应的目录的更多相关文章
- java.io.tmpdir在哪里?
查找所在目录的方式如下: System.out.println(System.getProperty(“java.io.tmpdir”)); System.getProperty(),还可以获取更多其 ...
- Java System.getProperty("java.io.tmpdir") 获取系统临时目录
System.getProperty("java.io.tmpdir") 是获取操作系统的缓存临时目录 在windows7中的目录是: C:\Users\登录用户~1\AppDat ...
- 关于System.getProperty("java.io.tmpdir");的输出,及System.getProperty();参数
1,首先来介绍下System.getProperty("java.io.tmpdir")输出因为这个输出有点特殊. 理论介绍:他是获取系统临时目录.可以是window的temp,l ...
- java.io.tmpdir指定的路径在哪?
Java.io.tmpdir介绍 System.getproperty(“java.io.tmpdir”)是获取操作系统缓存的临时目录,不同操作系统的缓存临时目录不一样, 在Windows的缓存目录为 ...
- Java.io.tmpdir介绍
System.getproperty(“java.io.tmpdir”)是获取操作系统缓存的临时目录,不同操作系统的缓存临时目录不一样, 在Windows的缓存目录为:C:\Users\登录用户~1\ ...
- 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 ...
- java io系列01之 "目录"
java io 系列目录如下: 01. java io系列01之 "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括 ...
- hive-相关报错处理${system:java.io.tmpdir}
在使用hive的时候启动成功 [root@localhost bin]# ./hive which: no hbase in (/usr/local/hive/apache-hive-2.1.1-bi ...
- hive启动报错:system:java.io.tmpdir等
解决方法:在hive-site.xml中添加 <property> <name>system:java.io.tmpdir</name> <val ...
随机推荐
- JWT和OAuth2
JWT是一种认证协议 JWT提供了一种用于发布接入令牌(Access Token),并对发布的签名接入令牌进行验证的方法.令牌(Token)本身包含了一系列声明,应用程序可以根据这些声明 ...
- 初识JavaScript变量
一.什么是变量? 变量即变化的量,在JS中变量是松散类型的,可以用来保存任何数据类型.把数据取个名字,放在内存中,就称之为变量! 通过变量名可以取到对应数据 二.为什么使用变量? 程序:代码的集合,一 ...
- [C]郝斌C语言课程大纲及笔记
本笔记整理于郝斌老师C语言课程,做学习参考之用. 1.[编程笔记]第一章 C语言概述 2.[编程笔记]第二章 C语言预备知识 3.[编程笔记]第三章 运算符与表达式 4.[编程笔记]第四章 流程控制 ...
- 【jvm】06-new一个对象到底占了多少内存?
[jvm]06-new一个对象到底占了多少内存? 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺 ...
- Java高级程序设计笔记 • 【目录】
持续更新中- 我的大学笔记>>> 章节 内容 实践练习 Java高级程序设计作业目录(作业笔记) 第1章 Java高级程序设计笔记 • [第1章 IO流] 第2章 Java高级程序设 ...
- Java练习习题,百钱买百鸡问题,用100文钱买鸡,公鸡5文钱一只,母鸡3文钱一只,小鸡3只1文钱
需求说明: 用100文钱买鸡,公鸡5文钱一只,母鸡3文钱一只,小鸡3只1文钱,要求公鸡.母鸡.小鸡都必须要有,刚好用完100文钱,公鸡.母鸡.小鸡的数量之和也是100. public class te ...
- Dapper的封装、二次封装、官方扩展包封装,以及ADO.NET原生封装
前几天偶然看到了dapper,由于以前没有用过,只用过ef core,稍微看了一下,然后写了一些简单的可复用的封装. Dapper的用法比较接近ADO.NET所以性能也是比较快.所以我们先来看看使用A ...
- Selenium_获取界面handle、title和url(7)
from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(" ...
- js 调用同级的 iframe 方法
有两个 iframe <iframe id="a"> <script> function food(a){ return a+1; } </scrip ...
- Go语言系列之标准库fmt
fmt包实现了类似C语言printf和scanf的格式化I/O.主要分为向外输出内容和获取输入内容两大部分. 向外输出 标准库fmt提供了以下几种输出相关函数. Print Print系列函数会将内容 ...