Java学习笔记(1)

Java程序设计概述

简单性

Java的使用就是尽可能的简单易用。

面向对象

面向对象是一种程序设计的技术,它将重点放在数据(对象)和对象的接口上。

网络技能

Java的扩展库中,用于处理HTTP FTP 这样TCP/IP的协议很方便。Java可以处理socket这种复杂的连接如此的简单。

健壮性

Java设计的目标就是让Java编写出可靠的程序。

安全性

从JAVA的发展历程来看,BUG修复非常不错。

体系结构中立

体系结构中立,将Java编译生成字节码后,只要有java环境,就可以执行。

可以移植性

可以执行主要体现在跨平台,不管是UNIX,Windows,etc

解释型

Java解释器可以在任何移植了解释器的机器上执行Java字节码。

高性能

字节码可以在运行时刻快速的翻译成运行这个应用程序的特定CPU的机器码。

多线程

多线程带来更好的交互性

动态性

Java能够适应不断发展的环境。

Java程序设计环境

安装JDK

如何配置Java环境变量。

Classpath

Path

JAVA_HOME

使用java 或者  java –version

Java基本的程序设计结构

注释

//开头的但行注释

/**

* 验证是否为邮箱

*

* @param arg

* @return

*/

多行注释/**/不能嵌套使用

数据类型

Java是一种强类型语言,意味着必须为每一个变量声明一种类型。

整型

类型

存储需求

取值范围

int

4字节

-2147483648到2147483647  2的31次方

Short

2字节

long

8字节

byte

1字节

-128~127

浮点型

类型

存储需求

取值范围

float

4字节

有效为6~7

double

8字节

Eg:34L,34D

char类型

使用unicode编码,可以存取一个汉字。

boolean 类型

只有两个值 true 或者 false

变量

Java中每一个变量属于一种类型(type)

Eg:

double dalary;

int day;

long money;

boolean done;

java变量赋值,使用=

常量,final 使用关键字 final 关键字修饰只能被初始化一次,赋值后不能被改变。

运算符

+ – × /

Eg:x+=4; 等价于x=x+4;

++  —

==  !=  >     >=  <     <=

&  |    &&   ||   ^     ~

exp:exp1?exp2;

>>  <<  >>>

枚举类型

Enmu size{big,small,large}

Size s = Size.MEDIUM;

字符串

String s = “s”;

String s = new String(“s”);

检查字符串是否相等使用 equals  或者 equalsIgnoreCase

输入输出

System.in

System.out.println();

格式化输出   %s     op

大数值

当float 或者 double 不能满足时, 使用对象 BigInteger

 

数组

一维数组,二维,三维……

一个简单的helloword

public class  helloword{

public static void main(String[] args) {

System.out.println(“Hello word !”);

}

}

log4j测试记录

CDR话单工具在变态的RIA多线程下无法实现日志记录,于是只能采用曲线救国日志工具来搞定,本来logback很好用,但是和log4j杂糅起来问题很大,于是干掉logback,采用log4j

历史原因:原来项目采用log4j,所以只好在log4j下搞定

目标,按照小时生成文件,同时按照需求写到不同文件

如此一下只是配置问题

首先查看log4j.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
log4j.rootLogger=INFO,R,stdout
 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%F:%L] %c{8}.%M() - %m%n
 
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=f:/logs/ria.log
log4j.appender.R.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%F:%L] %c{8}.%M() - %m%n
 
log4j.logger.S = info,S
log4j.appender.S=org.apache.log4j.DailyRollingFileAppender
log4j.appender.S.File=f:/log/client_uservisit
log4j.appender.S.DatePattern='_'yyyyMMddHH'_0000.log'
log4j.appender.S.layout=org.apache.log4j.PatternLayout
log4j.appender.S.layout.ConversionPattern=%m%n

同时在需要的class取用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.sxtemobi.cdr;
 
import org.slf4j.LoggerFactory;
 
public class Cdr {
	 static org.slf4j.Logger logger =LoggerFactory.getLogger("R");   
	 static org.slf4j.Logger logge1 =LoggerFactory.getLogger("S");
	public static void main(String[] args) {
		for(int i = 0;i&lt;100;i++){
			logger.error("test log4j");
			logge1.error("==test log4j==");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

如此以来,轻松实现。

新的监控脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh 
ria=$(ps -ef | grep com.palmtx.main.Main | awk '{if($3==1)print $3}')
tdate=`date +%Y/%m/%d-%T`
if [ "$ria" = "" ]
then
	echo "$tdate ria is need start"
	cd /home/2qi_home/riaServer
	./start.sh &
	echo "$tdate ria is need start" >> /home/ria.log
else  
	echo "$tdate ria is not need start"
	echo "$tdate ria is running and don't need start" >>/home/ria.log
fi
exit 0

debain6 更新源

修改debain6的更新源,用大便就是体验源的新。那么好吧
vim /etc/apt/sources-list

1
2
3
4
5
deb http://ftp.debian.org/debian/ squeeze main non-free contrib
deb http://ftp.debian.org/debian/ squeeze-proposed-updates main non-free contrib
deb http://ftp.us.debian.org/debian/ squeeze main non-free contrib
deb http://ftp.us.debian.org/debian/ squeeze-proposed-updates main non-free contrib
deb http://security.debian.org/ squeeze/updates main

Linux 环境下配置Java环境

觉得自己用一键SHELL没有意思了吧:)

eg:我们的jdk包放置在/home/jdk1.6.0_22

那我们可以尝试如下

1.使用/etc/profile文件

配置这个文件将会使所有用户拥有环境

1
2
3
4
5
6
7
#set java_environment
JAVA_HOME=/home/jdk1.6.0_22 #可以修改为你的解压路径
export JAVA_HOME
CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export CLASSPATH
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export PATH

需要重新登录用户

2.修改.bashrc文件 使本用户拥有环境变量

1
2
3
4
5
6
7
#set java_environment
JAVA_HOME=/home/jdk1.6.0_22 #可以修改为你的解压路径
export JAVA_HOME
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export CLASSPATH
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export PATH

需要重新登录用户

3.使用shell脚本吧

1
2
3
4
5
6
7
#set java_environment
JAVA_HOME=/home/jdk1.6.0_22 #可以修改为你的解压路径
export JAVA_HOME
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export CLASSPATH
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export PATH

shell 添加jar到classpath

我们写应用程序的时候需要写Shell来做启动,那么手工添加jar到环境变量太悲催了吧,既然用shell来做的话,那么shell能做的更多:)

EG: 我们把/home/tmsp/apache-tomcat-6.0.35/lib/* 目录下的所有jar 都导入环境变量。

1
2
3
4
for i in /home/tmsp/apache-tomcat-6.0.35/lib/*; 
do CLASSPATH=$i:"$CLASSPATH"; 
done 
echo "$CLASSPATH"

shell 监控网卡流量

需要统计网卡流量,除了依赖其他第三方的统计外,只能自己写了,原因你懂吧?:),因为生产环境没办法啊,只能自己写啊,悲催哇。

这个是统计packets的信息,可能1和9会更准一些,不过我也不清楚了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
eth=$1
mkdir -p /home/tmsp
while [ "1" ]
RXpre=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $2}')
TXpre=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $10}')
sleep 1
do
RXnext=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $2}')
TXnext=$(cat /proc/net/dev | grep $eth | tr : " " | awk '{print $10}')
ctime=$(date "+%Y-%m-%d %H:%M:%S")
RX=$((${RXnext}-${RXpre}))
TX=$((${TXnext}-${TXpre}))
echo "$ctime|RX:$RX|TX:$TX|TRX:$RXnext|TTX:$TXnext" >> /home/tmsp/$1.log
sleep 1
done

这个是简单的记录信息,那么需要后续的工作还很多,比如脚本切割,比如话单入库等等,后续完善吧。

PS:最后补充如何运行,如果你保存为 nic.sh 先给执行权限chmod +x nic.sh 然后运行,./nic.sh eth0 参数是你想要监控的网卡信息。

不足之处,不能监控到具体的端口,目前迷惘中。欢迎指点。

Nginx 根据访问终端跳转页面

有些需求需要同一个域名识别终端来展示不同的界面,使用Nginx获取UA来判断终端类型,实现简单的跳转操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
 server_name g3.tm-sp.com;
 listen 80;
 access_log off;
 location / {
 if ($http_user_agent ~ "((MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC\-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT)|(SonyEricsson)|(NEC)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC)|(SED)|(EMOL)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera))"){
	rewrite ^/(.*)$ http://221.180.20.228:8081/wap/$1 ;
}
if ( $http_user_agent ~ ^$ )  {  
	rewrite ^/(.*)$ http://221.180.20.228:8081/wap/$1 ;  
}         
 proxy_pass http://221.180.20.228:8080;
 }
}

ERROR: JDWP Unable to get JNI 1.2 environment

在JDK1.6版本中出现如此问题,需要在main函数最后加上
System.exit(0);来解决。

ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [../../../src/share/back/util.c:820]