如果你的系统不支持 tar -z 命令
如果是古老的 Unix 系统, 可能并不认识 tar -z 命令, 因此如果你想要压缩或者解压 tar.gz 的文件, 就需要使用 gzip 或者 gunzip 以及 tar 命令了.
关于 tar.gz 可以这么理解, tar 结尾的压缩包, 其实只负责把文件打包, 并没有进行压缩; 而 gz 结尾的包, 则是进行压缩操作.
因此, tar.gz 的文件可以理解为, 先进行打包, 再进行压缩.
那么, 压缩的命令就可以这样写:
- tar -cvf abc.tar abc
- gzip -c abc.tar> abc.tar.gz
最终就会得出一个 abc.tar.gz 的文件. 同理如果想要进行解压, 可以这样:
gunzip abc.tar.gz
=> 该命令会首先得出一个 abc.tar 的文件
tar -xvf abc.tar
=> 该命令完成解压的步骤
执行完这两个命令, 当前文件夹就会出现一个 abc 的文件夹了.
如果你的系统支持 tar -z 命令
如果你的系统级别高一点, 就不用这么费事了, tar 命令直接可以对 gz 进行操作:
tar -zxvf 压缩文件名. tar.gz
=> 这个命令可以直接完成对压缩文件的解压
tar -zcvf 压缩文件名. tar.gz 被压缩文件名
=> 这个命令可以直接完成对 tar.gz 的压缩
文件句柄占用导致应用崩溃
在 Java 中如果执行过多的流操作或者开启过多未关闭的 Socket, 并且没有及时的关闭, 就可能会出现 too many open files 的错误. 这就是因为系统的文件句柄数不够了....
在 Linux 中可以使用命令查看文件句柄数:
ulimit -n
也可以使用这个命令, 进行修改:
ulimit -n 2048
但是修改这里, 是暂时的解决办法, 如果长时间不释放文件句柄, 仍然会报错.
所以还是应该回到程序中, 检查流操作:
- BufferedReader in = null;
- try{
- in = new BufferedReader(new FileReader(file));
- // 你的业务逻辑
- }catch(Exception e){
- }finally{
- if(in != null){
- try{
- in.close();// 及时的进行释放
- }catch(Exception e){
- }
- }
- }
如果是一些可以复用的流, 还可以把它提取出来多次使用.
Linux 系统下的乱码问题
乱码问题经常困扰着程序员的日常开发, 关于编码的问题就不详细说了. 有一个经常遇到的问题就是, 我们开发好的一个应用, 放在 Linux 下就会出现乱码, 仔细检查每个编码的配置, 都是 utf-8, 简直是百思不得其解.
其实这是 JVM 的问题, 因为 JVM 默认会按照系统的编码来执行, 如果 JVM 的编码不对, 内部进行的文件处理当然也就会出现乱码.
首先查看系统的默认编码:
- locale
- LANG=
- LC_CTYPE="C"
- LC_COLLATE="C"
- LC_MONETARY="C"
- LC_NUMERIC="C"
- LC_TIME="C"
- LC_MESSAGES="C"
- LC_ALL=
很多系统的编码都是这个 C, 在这边博客中说, C 是系统默认的 Locale, 默认由 ANSI C 来支持. 也就是说默认的编码是 ANSI C!
这样, 它与我们的 UTF-8 肯定是不一致了. 因此, 可以这样:
java -Dfile.encoding=UTF-8 xxxx
通过添加上面的参数来指定 JVM 使用的编码. 如果你是在 tomcat 中启动的可以修改其中的 java 相关的参数; 如果是其他的程序, 那么就依启动时的 jvm 参数为准, 修改对应的启动命令即可.
使用 javac 以及 java 执行 class
这个算是基础知识了, 但是一般的开发者可能只是用它试验过 helloworld. 比如:
javac HelloWorld.java
=> 编译出 HelloWorld.class
java HelloWorld
=> 执行该类
实际情况中可能远比这个复杂:
如何启动 eclipse 中编译出来的 jar 包
通过 Eclipse 进行打包, 比较简单:
右键工程名字 - Export
选择 Jar File
选择指定的工程, 以及编译出的 jar 包所在的目录
点击 finish 进行打包即可
这个时候, 如果你直接执行 java -jar xxx.jar, 可能会抛出一个异常:
java -jar target.jar
fileMonitor.jar 中没有主清单属性
这是因为这个 jar 中缺少了 Main 方法的定义. 此时你可以这么做, 通过解压工具进入到 jar 包中, 修改 META-INF 下的 MENIFEST.MF 文件.
Manifest-Version: 1.0
Main-Class: com.test. 类名
注意 Main-Class 后面的冒号后面要有空格, 并且最后一行要空着 (如果没有最后一行的的回车, 就会报找不到 Main-Class 这个属性的错误).
如果你使用 Javac 以及 java 编译类
如果你有一个类, 这个类依赖于其他的 jar 包, 比如: test.java 依赖 a.jar,b.jar.
那么可以执行 javac 进行编译:
javac -cp a.jar;b.jar test.java
=> 注意如果是 Linux, 分号要换成冒号
javac -cp a.jar:b.jar test.java
然后使用 java 执行:
java -cp .;a.jar;b.jar test
=> 如果是 Linux, 分号换成冒号
java -cp .:a.jar:b.jar test
编写 shell 脚本
经常有人会编写一些类似 tomcat 一键启动的脚本, 这里以 Linux 为例:
- #!/bin/sh
- PRG="$0"
- PRGDIR=dirname "$PRG"
- [ -z "$ROOT_PATH" ] && ROOT_PATH=cd "$PRGDIR/.." >/dev/null; pwd
- echo "设置 ROOT_PATH 为 $ROOT_PATH"
- [ -z "$JRE_HOME" ] && JRE_HOME=cd "$ROOT_PATH/jre" >/dev/null; pwd
- echo "设置 JRE_HOME 为 $JRE_HOME"
- "$JRE_HOME"/bin/java -Dfile.encoding=UTF-8 -jar "$AGENT_PATH"/lib/test.jar
有几个可以值得借鉴的地方:
第一点, 就是如何设置环境变量, 比如使用内置的 jre
- PRG="$0"
- PRGDIR=dirname "$PRG"
这两句话是为了获取启动脚本所在的目录.
[ -z "$ROOT_PATH" ] && ROOT_PATH=cd "$PRGDIR/.." >/dev/null; pwd
这句话是设置了该启动脚本所处的应用的根目录
[ -z "$JRE_HOME" ] && JRE_HOME=cd "$ROOT_PATH/lib/jre" >/dev/null; pwd
这句话是最终设置环境变量的命令. 粗俗 JRE_HOME 就指定为应用内置的 jre 了.
第二点, 是如何启动我们自己的类
"$JRE_HOME"/bin/java -Dfile.encoding=UTF-8 -jar "$AGENT_PATH"/lib/test.jar
上面这命令, 是执行内置的 jre 中的 java 命令, 使用 java 命令启动了一个可执行的 jar 包, 并且设置好了它的编码.
来源: http://www.bubuko.com/infodetail-2802161.html