java

log日志记录

http://www.cnblogs.com/wangwanchao/p/5310096.html 在项目开发中,记录错误日志是一个很有必要功能。 一是方便调试 二是便于发现系统运行过程中的错误 三是存储业务数据,便于后期分析 日志的实现方式: 1、自己写类,将日志数据,以io操作方式,写数据到文本文件。或者是写到数据库中。 2、使用log4j。log4j,这也是此文要记录的。log4j,以前在用.Net做web form时,用log4net。平台通吃。而且,log4j可以将日志,输出到console窗口,输出到文本文件,输出到数据库 等,功能还是很强大的! 3、使用jdk自带的logging.jar中的方法。 4、使用slfj。slfj,是也是一个很强大的功能。slfj旨在一统天下,也就是slfj提供了logging.jar 和 log4j的接口,可以通过slfj来调用log4j,也可以调用jdk的logging。 Log4j三个主要的组件,它们分别是 Logger、Appender和Layout, Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。有一个Logger 称为Root,它永远存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法获得,其它Logger通过 Logger.getLogger(String name)方法。 Appender则是用来指明将所有的log信息存放到什么地方,Log4j中支持多种appender,如 console、files、GUI components、NT Event Loggers等,一个Logger可以拥有多个Appender,也就是你既可以将Log信息输出到屏幕,同时 存储到一个文件中。 Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。 log日志级别 trace: 是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。 debug: 调试么,我一般就只用这个作为最低级别,trace压根不用。是在没办法就用eclipse或者idea的debug功能就好了么。 info: 输出一下你感兴趣的或者重要的信息,这个用的最多了。 warn: 有些信息不是错误信息,但是也要给程序员的一些提示,类似于eclipse中代码的验证不是有error 和warn(不算错误但是也请注意,比如以下depressed的方法)。 error: 错误信息。用的也比较多。 fatal: 级别比较高了。重大错误,这种级别你可以直接停止程序了,是不应该出现的错误么!不用那么紧张,其实就是一个程度的问题。 log4j的配置文件 %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL, %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %r: 输出自应用启动到输出该log信息耗费的毫秒数 %c: 输出日志信息所属的类目,通常就是所在类的全名 %t: 输出产生该日志事件的线程名 %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 %%: 输出一个”%”字符 %F: 输出日志消息产生时所在的文件名称 %L: 输出代码中的行号 %m: 输出代码中指定的消息,产生的日志具体信息 %n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如: 1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。 2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。 3)%.

eclipse中文字体小、主题背景以及中文乱码

一些eclipse的小功能,做个备忘 1、eclipse中文字体小 Window-preferences-general-apperance-colors and fonts-basic-text font-courier new 2、主题背景 eclipse 默认的背景全白,在晚上的时候刺眼,可改成dark主题:Window-preferences-general,右边有个theme,选择dark,visual studio既视感。eclipse 自带的主题推荐这个,网上有很多自制的,可以自己下载。 3、中文乱码 如果eclipse里所有工程里都有这种问题,那么设置整个工作空间:Window-preferences-workspace-text file encoding,默认是GBK,可以在other里选择自己想要的(中文支持比较好的就是GBK和UTF8这两种,UTF8是国际通用的中文编码标准,切换试试); 如果只是个别项目出现乱码,只需要修改项目的编码即可:选中项目-右键-Properties(属性)-Resource(资源)-Other(其他),然后选择你想要的编码格式。 如果是单个文件出现乱码,跟上一个处理步骤相同。

java中try 与catch的使用

try{ //代码区 }catch(Exception e){ //异常处理 } 代码区如果有错误,就会返回所写异常的处理。 首先要清楚,如果没有try的话,出现异常会导致程序崩溃。 而try则可以保证程序的正常运行下去,比如说: try{ int i = 1/0; }catch(Exception e){ …….. } 一个计算的话,如果除数为0,则会报错,如果没有try的话,程序直接崩溃。用try的话,则可以让程序运行下去,并且输出为什么出错! try catch 是捕捉try部分的异常,当你没有try catch的时候,如果出现异常则程序报错,加上try catch,出现异常程序正常运行,只是把错误信息存储到Exception里,所以catch是用来提取异常信息的,你可以在Catch部分加上一句System.out.println(e.ToString());,如果出现异常可以把异常打印出来 Java的异常处理机制(try…catch…finally) 1 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案、也不许执行代码看真正答案哦。如果你的答案是正确,那么这篇文章你就不用浪费时间看啦。 public class TestException { public TestException() { } boolean testEx() throws Exception { boolean ret = true; try { ret = testEx1(); } catch (Exception e) { System.out.println("testEx, catch exception"); ret = false; throw e; } finally { System.out.println("testEx, finally; return value="

Ubuntu16.04 LTS的Java环境配置总结

* Linux* 这几天刚刚折腾linux(刚刚正式接触使用的linux小白),而我安装好系统后的第一件事就是配置Java环境。此篇文章用于记录安装过程以作为备忘,如有疑问或者错误欢迎指正,一起交流,共同成长。 步骤 1.官网下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 本人的版本是:jdk-8u121-linux-x64.tar.gz 2.安装jdk 解压缩包 .tar.gz命令:dpkg zxvf 包名 绝对路径(不指定路径则默认为当前目录) (比较详细,我是小白…..捂脸.jpg)当然,首先要做的是通过命令行进入该包所在目录或者通过绝对路径进行解压也行。我是在包所在目录解压: 相关命令行 dpkg zxvf jdk-8u121-linux-x64.tar.gz 得到下面的文件jdk1.8.0_121 将此文件用命令行移动到指定文件夹 我的是/usr/lib/Java ,Java文件夹需要自己建立 sudo mv jdk1.8.0_121 /usr/lib/Java 3.用/etc/profile文件配置环境变量及修改系统默认Java以解决配置好环境变量后仍显示未设置Java环境问题 命令行打开gedit编辑/etc/profile 注:去掉sudo,则为只读模式 sudo gedit /etc/profile 添加以下代码到profile文件末尾 export JAVA_HOME=/usr/lib/Java/jdk1.8.0_121 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin 命令行使得/etc/profile文件生效 source /etc/profile 问题来了: 到此步为止,当时我就立即测试命令java , javac 。然而,显示没有设置java环境!!!于是我网上搜资料,查明的原因是:Ubuntu下默认调用的是自带的java版本,因此需要修改默认版本设置。Ok,代码如下: sudo update-alternatives --install /usr/bin/java java /usr/lib/Java/jdk1.8.0_121/bin/java 300 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/Java/jdk1.8.0_121/bin/javac 300 sudo update-alternatives --install /usr/bin/jar jar /usr/lib/Java/jdk1.8.0_121/bin/jar 300 sudo update-alternatives --install /usr/bin/javah javah /usr/lib/Java/jdk1.

eclipse-jee 如何修改黑色主题

我们用eclipse时,可以选择黑色主题,使软件整体变成暗色调,看起来比较舒服,有保护眼睛的作用 但是,当我们使用eclipse-jee时,就没有这么方便了,只能通过自己修改背景颜色,随便修改字体颜色,以便看起来比较舒服… 其实eclipse官网已经给我们提供多个主题选项,我们可以通过预览,下载自己所需的主题,然后导入自己的eclipse-jee 1、eclipse-color-theme 链接页面 http://marketplace.eclipse.org/content/eclipse-color-theme 根据自己的喜好下载相应主题epf文件 2、导入epf文件 3、OK啦 【然后根据自己的喜好稍微修改就行,美美哒 O(∩_∩)O】

Java 和 HTTP 的那些事(一) 模拟 HTTP 请求

最新在学习使用 Java 来写网络爬虫,模拟浏览器发送 HTTP 请求,并抓取返回页面中的信息。由于对 Java 刚接触,以前用 .Net 写的一些网络请求相关的工具类都派不上用场,于是对如何使用 Java 模拟 HTTP 请求潜心研究了一番,在此写下这个《Java 和 HTTP 的那些事》系列的博客,并记录一些我中途遇到了明坑和暗坑,供后来人参考。此为第一篇。 一、使用 HttpURLConnection 发送 HTTP 请求 Java 自带的 java.net 这个包中包含了很多与网络请求相关的类,但是对于我们来说,最关心的应该是 HttpURLConnection 这个类了。 1.1 创建 HTTP 连接对象 要得到一个 HttpURLConnection HTTP 连接对象,首先需要一个 URL,代码如下: 1 2 URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 1.2 添加 HTTP 请求头 得到 HTTP 连接对象之后,我们就可以进行 HTTP 操作了,我们可以添加任意的 HTTP 请求头,然后执行我们需要的 GET 或者 POST 请求。我们像下面这样,添加两个 HTTP 头(User-Agent 和 Accept-Language): 1 2 con.

解决java 图片压缩图片图片变色问题

最近有人遇到在处理在用Java进行图片压缩的时候,压缩后图片的背景色发生了变色,如图所示: 压缩前: 压缩后: 经查阅相关资料后发现可以用阿里巴巴的SImpleImage可以解决这个问题。 主要依赖以下jar包:commons-io-2.4.jar、commons-lang.jar、commons-logging-1.1.1.jar、jai_codec-1.1.3.jar、jai_core-1.1.3.jar SimpleImage github地址:https://github.com/alibaba/simpleimage 相关jar包下载:http://download.csdn.net/detail/asd1231510/8911263 测试代码: import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.commons.io.IOUtils; import com.alibaba.simpleimage.ImageRender; import com.alibaba.simpleimage.SimpleImageException; import com.alibaba.simpleimage.render.ReadRender; import com.alibaba.simpleimage.render.ScaleParameter; import com.alibaba.simpleimage.render.ScaleRender; import com.alibaba.simpleimage.render.WriteRender; public class Example { public static void main(String[] args) { File in = new File("E:/20111014111307895.jpg"); //原图片 File out = new File("E:/testImage.jpg"); //目的图片 ScaleParameter scaleParam = new ScaleParameter(400, 400); //将图像缩略到1024x1024以内,不足1024x1024则不做任何处理 FileInputStream inStream = null; FileOutputStream outStream = null; WriteRender wr = null; try { inStream = new FileInputStream(in); outStream = new FileOutputStream(out); ImageRender rr = new ReadRender(inStream); ImageRender sr = new ScaleRender(rr, scaleParam); wr = new WriteRender(sr, outStream); wr.

java实现为图片添加水印

这个水印功能是看的慕课网的视频自己跟着学的,视频连接如下:http://www.imooc.com/learn/482 图片文件的上传界面、上传功能以及页面展示,这里就不再写了,可以去struts2环境下实现文件上传看,也可以去慕课网看视频。这里就记录下生成水印的代码。 先说说实现水印功能的思路: 1、创建图片缓存对象 2、创建绘图工具对象(有点类似于画布) 3、使用绘图工具对象将原图绘制到缓存图像对象中 4、使用绘图工具对象将水印(文字/图片)绘制到缓存图片对象中 5、创建图像编码工具类 6、使用图像编码工具类输出缓存图像到目标文件中 以下为水印功能的具体实现: 1、用来集中处理业务逻辑的Action(这里用的例子是一次性为多张图片添加水印): public class WaterMarkAction extends ActionSupport{ private File[] image; private String[] imageFileName; private String uploadPath; private List picInfo = new ArrayList(); public String waterMark() throws Exception{ String realUploadPath = ServletActionContext.getServletContext().getRealPath(uploadPath); if(image!=null && image.length>0){ PicInfo pic=null; UploadService uploadService = new UploadService();//该service用来上传文件 //MarkService markService = new TextMarkService();//文字水印 //MarkService markService = new ImageMarkService();//图片水印 //MarkService markService = new MoreTextMarkService();//多文字水印 MarkService markService = new MoreImageMarkService();//多图片水印 for(int i=0;i 2、定义实现水印功能的接口:添加的水印包括四种情况:单一文字水印、单一图片水印、多文字水印、多图片水印。所以这里将实现水印的功能定义成了一个抽象类(除了有需要子类实现的方法外还有子类需要用到的公用方法),抽象类代码如下:

有向图闭环检测值java代码实现

本文有向图闭环检测算法和实现由文章《如何检测节点网络中是否存在闭环之java实现》中的无向图闭环检测算法的基础上修改得到,其中修改点如下: 1.修改了数据结构,在原来无向图闭环检测算法的数据结构的基础上,增加了”isFrozen”和”isRoot”属性;其中”isFrozen”属性用于员无向图闭环检测算法中,在多父节点的场景下,由于相同的子节点要遍历两次而造成闭环检测判断的逻辑性错误,同时可以减少算法的开销,默认为false;”isRoot”属性用标识某一节点是否为根节点,默认为fasle。具体数据结构如下表: 属性名 值类型 nodeName String curRelIndex int beforeNode String relList List isFrozen boolean isRoot boolean 2.修改了获取算法起始点的方法,将在无向图闭环算法中随机获取起始点的方式修改为符合有向图的特点的方式—–如果节点集合中有给定根节点,即集合中某个节点的”isFrozen”属性值为true,则选择该属性为根节点,事先给定根节点的方式有助于减少算法开销;若无给定根节点,则算法默认给定一个根节点,该根节点的元素为该集合中的所有的节点,这种方式增加算法的开销 3.修改了进入闭环检测方法的条件—-将count > 1 改为 count >= 1 ,其实在无向图中 count >= 1 也无妨。 4.修改了获取从一个节点的关系列表中获取下一节点索引的方法。取消掉了对节点关系列表中与上一节点相同的节点的过滤。 5.修改了back()方法,在back()中增加了对”isFrozen”属性的修改,修改规则是,当一个节点后退时,将改节点的”isFrozen”属性修改为”true”。 6.对traverse()做了一些修改,对调用head()和back()方法的判断中增加了一个判断条件—即若当前节点的isFrozen属性值为true,则后退,不再前进;因为若”isFrozen”属性的值为true,则说明该节点的所有子节点都已经遍历完,而且没有出现闭环的情况,所以可以不用再遍历。 源码如下: /** * * 功能:判断有向图中是否存在闭环 * 作者:EugeneJao * @param nodeCollections * @return * @throws Exception */ public boolean isContainLoopInDigraph(Map> nodeCollections) throws Exception{ //用map的hash码计算,速度更快 Map visitedList = new HashMap(); /** * 初始化"起点 */ String startNode = getOriginInDigraph(nodeCollections); boolean containLoop = false ; /** * 初始化"

一道逻辑题 房间里有100盏电灯

在 博客园看到的这个问题,也想做一下。题目是这样的 房间里有100盏电灯,编号为1,2,3……100,每盏灯上有一个按钮,初始时灯全都是关的。编好号的100位同学由房间外依次走进去,将自己编号的倍数的灯的按钮全部按一次,例如第一位同学把编号是1的倍数的灯的按钮按一下(此时100盏灯全亮),第二位同学把编号是2的倍数的灯的按钮按一下(此时只有50盏灯亮着,50盏被这个人按灭了)……第100位同学把编号是100的倍数的灯(即编号为100的灯)的按钮按一下,请问依次走完后,还有多少盏灯亮着? 最简单的做法就是模拟一下100个同学进入房间的情景,从1号同学开始每个人都去按一遍开关,最后看一下哪些灯亮着,这个方法最简单也最容易想到,可是效率有点低。其实可以计算一下每个开关被按下的次数,因为刚开始的时候所有的灯泡都是关着的,所以如果某个灯泡的开关被按了奇数次,那么这个灯泡最终就是开着的,否则就是关着的。那怎么计算每个灯泡开关被按下的次数呢?因为每个同学都会按下自己编号倍数的开关,即如果灯泡编号是同学编号的倍数,他就会按下开关,也就是说如果同学编号是灯泡编号的约数,他就会按下开关(这不是废话么)。那么统计一下灯泡编号约数的个数就可以了,约数个数为计数的灯泡最后开着,约数个数为偶数的灯泡最后关着。下边是代码: public class Lamp { public static void main(String[] args){ int result = 0; for(int i=1;i<=100;i++){ if(isOdd(getFactorNum(i))){ result += 1; } } System.out.println(result); } //求n约数的个数 public static int getFactorNum(int n){ int result = 0; for(int i=1;i<=n;i++){ if(n%i == 0){ result += 1; } } return result; } //判断n是否为奇数 public static boolean isOdd(int n){ return (n&1) == 1; } } ——————————–更新—————————— 又想了一下还有更简单的算法,因为一个数的约数都成成对出现的,也就是说如果n存在一个约数p,那么一定有一个q与之相对应且满足n=pq,所以n约数的个数一定是偶数,但是有一种情况例外,那就是p=q,所以只有编号为完全平方数的灯泡亮着。按着这个方法计算就简单多了,直接return (int)Math.sqrt(100);