一起去看海

2010/05/20

java备份mysql数据库

Filed under: Java笔记 — Tags: — admin @ 13:16

java备份mysql数据库的备忘。开始找了个非常长的程序,通过读取控制台执行备份命令后的输出再保存为文件,显得十分麻烦。想到命令行里有重定向符号,可以将输出直接保存为文件,修改后程序就十分短了。

执行的时候mysql的bin目录一定要在path里面。早上在添加了环境变量之后没有重启Eclipse,程序一直没跑过。

[java]package com.ooobj.db;

public class DBBackup {

public void backup() {
try {
String mysql = "mysqldump -uroot -padmin dianiks > D:/temp/dianiks.sql";
java.lang.Runtime.getRuntime().exec("cmd /c " + mysql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void load() {

try {
String mysql = "mysqladmin -uroot -padmin create dianiks";
java.lang.Runtime.getRuntime().exec("cmd /c " + mysql);
String path = "mysql -uroot -padmin dianiks < D:/temp/dianiks.sql";
java.lang.Runtime.getRuntime().exec("cmd /c " + path);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

public static void main(String[] args) {
DBBackup db = new DBBackup();
db.backup();
db.load();
}

}[/java]

2010/05/17

调试工具1.1版

Filed under: Java笔记 — Tags: — admin @ 22:15

上周写了个调试工具,功能很简单http://www.ooobj.com/2010/05/debug-tool/。今天给加了个查找的功能,代码从网上找的记事本代码中抽出来的,呵呵。

部分代码:

[java]private DebugMsg() {
f = new JFrame("调试工具");
Container contentPane = f.getContentPane();
contentPane.setLayout(new BorderLayout());

textArea = new JTextArea(20, 40);
textArea.setEditable(false);
JScrollPane scroll = new JScrollPane(textArea);

JButton clear = new JButton("清除");
clear.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
clearText();
}
});

JMenuBar menuBar = new JMenuBar();
JMenu toolMenu = new JMenu("工具");
menuBar.add(toolMenu);
JMenu helpMenu = new JMenu("帮助");
menuBar.add(helpMenu);

JMenuItem helpItem = new JMenuItem("使用帮助");
helpItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
textArea.setText("Ctrl+F 查找\n" +
"Ctrl+D 清除消息\n" +
"Ctrl+Q 退出\n" +
"查看更新:www.ooobj.com\n");
}
});
helpMenu.add(helpItem);

JMenuItem findItem = new JMenuItem("查找");
findItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mySearch();
}
});
findItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, Event.CTRL_MASK));
toolMenu.add(findItem);

JMenuItem clearItem = new JMenuItem("清除");
clearItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
clearText();
}
});
clearItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, Event.CTRL_MASK));
toolMenu.add(clearItem);

JMenuItem quitItem = new JMenuItem("退出");
quitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(-1);
}
});
quitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK));
toolMenu.add(quitItem);

contentPane.add(scroll, BorderLayout.CENTER);
contentPane.add(clear, BorderLayout.SOUTH);
contentPane.add(menuBar, BorderLayout.NORTH);

f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

}[/java]

调试工具1.1代码下载

调试工具

2010/05/09

一个简单的信息输出调试工具

Filed under: Java笔记 — Tags: — admin @ 09:46

平时做项目经常需要debug但是没办法debug,于是都要system.out来查看相关的信息。前几天做项目的时候突然发现system.out失灵了,估计是在哪里被重定向了,急切间又找不到在哪个地方恢复。于是自己写了一个小工具来帮助开发。

[java]package com.ooobj.debug;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class DebugMsg {

private JTextArea textArea = null;

private static DebugMsg dm = null;

public static DebugMsg getInstance() {
if (dm == null) {
dm = new DebugMsg();
}
return dm;
}

private DebugMsg() {
JFrame f = new JFrame("Debug Message");
Container contentPane = f.getContentPane();
contentPane.setLayout(new BorderLayout());

textArea = new JTextArea(20, 40);
textArea.setEditable(false);
JScrollPane scroll = new JScrollPane(textArea);

JButton clear = new JButton("Clear Messages");
clear.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
clearText();
}
});

contentPane.add(scroll, BorderLayout.CENTER);
contentPane.add(clear, BorderLayout.SOUTH);

f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

}

private void clearText() {
textArea.setText("");
}

public void writeText(String text) {
textArea.append(text);
}

public static void outMsg(String msg) {
DebugMsg t = DebugMsg.getInstance();
t.writeText(msg + "\n");
}

}[/java]

功能很简单,只一个输出窗口输出信息,还有一个清除按钮可以清除信息。使用了单例模式,这样只需要使用DebugMsg.outMsg()就可以输出信息。

后面有时间的话还打算继续完善一下,可以增加查找功能,可以在输出信息中查找相关词语;还有高亮功能,可以让不同地方输出的信息背景颜色不一样。

2010/05/04

JAVA连接FTP测试

Filed under: Java笔记 — Tags: — admin @ 11:04

毕设中要连接FTP,于是找了一下JAVA连接ftp的方法。发现有两个比较常用的包,一个是JDK自带的sun.net.ftp,功能比较简单。一个是org.apache.commons.net.ftp。这里先用sun.net.ftp写个Demo。

[java]package com.ooobj.test;

import java.io.DataInputStream;
import java.io.IOException;

import sun.net.ftp.FtpClient;

public class FTPTest {

public static void main(String[] args) {
try {
FtpClient fc = new FtpClient("192.168.7.128", 21);
fc.login("ooobj", "123");
System.out.println(fc.pwd());
DataInputStream dis = new DataInputStream(fc.nameList("."));
String s = "";
while ((s = dis.readLine()) != null) {
System.out.println(new String(s.getBytes("ISO-8859-1"),"GBK"));
}
} catch (IOException e) {
e.printStackTrace();
}

}

}[/java]

其中nameList()方法是列出文件,不包括文件夹。list()方法则列出文件和文件夹。sun.net.ftp提供的字符编码是”ISO-8859-1″,需要在读取的时候转换,比较麻烦。

2010/05/01

Java的Properties类使用实例

Filed under: Java笔记 — admin @ 22:56

一个工程项目通常需要将相关的属性配置到.properties或.xml文件中,在java.util 包下面有一个类 Properties,可以专门读写这类文件。本文通过四个实例分别对.properties或.xml文件进行读写来学习Properties类的使用。

test.properties

[text]database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/test
database.username=root
database.password=123[/text]

test.xml

[xml]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="database.driver">com.mysql.jdbc.Driver</entry>
<entry key="database.url">jdbc:mysql://localhost:3306/test</entry>
<entry key="database.username">root</entry>
<entry key="database.password">123</entry>
</properties>[/xml]

测试代码:
[java]public class PropertiesTest {

public void readProperties(){
Properties props = new Properties();

try {
long beginTime = System.currentTimeMillis();
props.load(getClass().getResourceAsStream("test.properties"));
long endTime = System.currentTimeMillis();
System.out.println("Use time: " + (endTime – beginTime));
} catch (IOException e) {
e.printStackTrace();
}

System.out.println(props.getProperty("database.driver"));
System.out.println(props.getProperty("database.username"));

}

public void readXMLProperties(){
Properties props = new Properties();

try {
long beginTime = System.currentTimeMillis();
props.loadFromXML(getClass().getResourceAsStream("test.xml"));
long endTime = System.currentTimeMillis();
System.out.println("Use time: " + (endTime – beginTime));
} catch (IOException e) {
e.printStackTrace();
}

System.out.println(props.getProperty("database.driver"));
System.out.println(props.getProperty("database.username"));
}

public void writeProperties(){
Properties props = new Properties();
props.setProperty("username", "test_username");
props.setProperty("password", "test_password");
PrintStream fw;
try {
long beginTime = System.currentTimeMillis();
fw = new PrintStream(new File("testwrite.properties"));
props.list(fw);
long endTime = System.currentTimeMillis();
System.out.println("Write properties use time: " + (endTime – beginTime));
} catch (FileNotFoundException e) {
e.printStackTrace();
}

}

public void writeXMLProperties(){
Properties props = new Properties();
props.setProperty("username", "test_username");
props.setProperty("password", "test_password");
PrintStream fw;
try {
long beginTime = System.currentTimeMillis();
fw = new PrintStream(new File("testwrite.xml"));
props.storeToXML(fw, "test");
long endTime = System.currentTimeMillis();
System.out.println("Write XML use time: " + (endTime – beginTime));
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
PropertiesTest pt = new PropertiesTest();
pt.readProperties();
pt.readXMLProperties();
pt.writeProperties();
pt.writeXMLProperties();
}

}[/java]

运行结果:

[text]Use time: 6
com.mysql.jdbc.Driver
root
Use time: 84
com.mysql.jdbc.Driver
root
Write properties use time: 1
Write XML use time: 26[/text]

从运行的时间看来,读取.properties文件比读取.xml文件要快的多,而且.properties文件看起来更加直观。

2010/04/12

【每日一技】提高文件读取速度的NIO

Filed under: Dian团队, Java笔记 — Tags: , — admin @ 17:19

NIO即new io.主要是采用通道机制来提高文件读取速度。以下为一个简单的读取文本文
件的例子:

[java]public String readTxtFile(String path) throws IOException {

long start = System.currentTimeMillis();

//设置缓冲区的大小

final int BUFFER_SIZE = 0×900000;

String content = "";

// 创建一个文件输入流

FileInputStream fis = new FileInputStream(path);

// 获得该输入流的通道

FileChannel fc = fis.getChannel();

// 创建一个字节缓冲区

ByteBuffer bb = ByteBuffer.allocate(BUFFER_SIZE);

// 将字节序列从此通道读入给定的缓冲区

fc.read(bb);

// 反转此缓冲区。首先将限制设置为当前位置,然后将位置设置为 0

bb.flip();

// 获得缓冲区中剩余元素数,并创建相应的字节数组

byte[] bytes = new byte[bb.remaining()];

// 将缓冲区中的字节序列存放在字节数组里

bb.get(bytes);

// 将字节数组中的内容转换成字符串

content = new String(bytes);

long end = System.currentTimeMillis();

System.out.println(end – start);

return content;

}[/java]

我做了一个简单的测试,对于一般几K到几十K的文本文件,只需要几毫秒到20几毫秒
,对于一个好几M的文本文件,只需要200多个毫秒。希望有兴趣的同学可以进一步的研
究,共同探讨相关话题。

另外推荐一篇关于流的文章:http://www.ibm.com/developerworks/cn/java/j-io1/

———————————————————

henix: 那跟FileInputStream再套上BufferedInputStream有什么区别?

———————————————————

spllot:

我觉得一个很重要的区别是,NIO中的做法更灵活,操作起来比较简单.我写的小例子只是
其中的一角,还有像MappedByteBuffer等缓冲区,这些缓冲区都有清除、反转和重绕方法
,用以标记当前位置,以及将当前位置重置为前一个标记处.并且还定义了一系列用于将
数据移出或移入缓冲区的 get 和 put 方法,用于压缩、复制 和切片 缓冲区的方法,
以及用于分配新缓冲区和将现有数组包装到缓冲区中.

对于我写的那个小程序,确实给人的感觉是空间换时间.

就我写的那个程序来说,对于一个小的文件,缓冲区设置小一点是没有什么问题的,但是如
果是一个好几个M的文件,如果缓冲区设置的过小的话,会出现读出来的内容不完全的情况
.所以为了简单的引进NIO,我仅仅是做了一个示例.

对于文件比较大的情况,如果将缓冲区设置比较小的话,也是可以解决的,分块来读就行了
.NIO是按块来读的,从这点来看,就比传统的IO读起来会快很多.另外NIO是无阻塞的,传统
的IO读文件的时候,需要将数据读到缓冲区后,再等待处理,会浪费很多时间,但NIO则不需
要,通过通道来传输,减少了等待的时间,从而提高了读取速度.

P.S 我的毕业设计是桌面搜索引擎,其中会涉及到文件的读取,有可能文件是比较大的,并
且数量是比较多的,所以如何减少读取时间,提高索引速度是很重要的,因此我考虑到使用
NIO.有兴趣的同学可以和我一起研究.

—————————————————

转自Dian团队内部技术讨论。

2010/04/09

Java字符串的trim方法

Filed under: Java笔记 — Tags: — admin @ 09:04

Java的String类有个方法叫trim(),说是去除字符串中的空格用的,其实这样的表述并不正确,正确的表述应该是去除字符串首尾的ASCII码小于等于空格的字符,对于字符串中的空格并没有效果。有点纠结,不过看一下trim()的实现代码就明白了。

[java]public String trim() {
int len = count;
int st = 0;
int off = offset;      /* avoid getfield opcode */
char[] val = value;    /* avoid getfield opcode */

while ((st < len) && (val[off + st] <= ‘ ‘)) {
st++;
}
while ((st < len) && (val[off + len - 1] <= ‘ ‘)) {
len–;
}
return ((st > 0) || (len < count)) ? substring(st, len) : this;
}[/java]

第一个while循环去除字符串前面的空格,后一个循环去除字符串后面的空格。

示例:

[java]public static void main(String[] args) {

String a="     \n    www ooobj.com\n";
String b="www ooobj.com";

System.out.println(b.equals(a));

a = a.trim();

System.out.println(b.equals(a));

System.out.println(a);
}[/java]

输出:

[java]false
true
www ooobj.com[/java]

另外,trim方法并不对传入的字符串进行空值检查,有需要可以再写一个检查空值的:

[java]private static String trim(String src) {
if (src == null) {
return null;
}
return src.trim();
}[/java]

2010/04/08

commons-logging + log4j完美搭配

Filed under: Java笔记 — Tags: — admin @ 14:14

对于java的日志工具,以前一直只用过log4j,只听说过commons-logging。这两天在研究周导写的代码,发现工程中不仅用了log4j,还用上了commons-logging。觉得很奇怪,一个工程干嘛要用两个日志工具?

原来,Apache为了让众多的日志工具有一个相同操作方式,还实现做了一个通用日志工具包commons-logging。commons-logging是为那些需要建立在不同环境下使用不同日志架构的组件或库的开发者创建的,其中包括 Apache Log4j以及Java log的日志架构。commons-logging在运行时会自行决定使用哪种日志架构,如果发现classpath中是否有Log4j的包,则自动使用Log4j作为日志实现类,如果其他的日志工具一个也没有,则使用commons-logging自己提供的一个简单的日志实现类SimpleLog。

写了个小小的测试代码,发现commos-logging真的很强大。

[java]package com.ooobj.log;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class LogTest {

private static Log log = LogFactory.getLog(LogTest.class);

public void test() {
log.debug("111");
log.info("222");
log.warn("333");
log.error("444");
log.fatal("555");
}

public static void main(String[] args)  {
LogTest logTest  =   new  LogTest();
logTest.test();
}
}[/java]

classpath中无log4j包的输出:

2010-4-8 14:12:37 com.ooobj.log.LogTest test
信息: 222
2010-4-8 14:12:37 com.ooobj.log.LogTest test
警告: 333
2010-4-8 14:12:37 com.ooobj.log.LogTest test
严重: 444
2010-4-8 14:12:37 com.ooobj.log.LogTest test
严重: 555

classpath中放入log4j包的输出:

[main] DEBUG com.ooobj.log.LogTest – 111
[main] INFO com.ooobj.log.LogTest – 222
[main] WARN com.ooobj.log.LogTest – 333
[main] ERROR com.ooobj.log.LogTest – 444
[main] FATAL com.ooobj.log.LogTest – 555

log4j.properties文件:

[java]#设置级别和多个目的地
log4j.rootLogger=debug,appender1,appender2

#输出到控制台
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#设置输出样式
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout

#输出到文件(这里默认为追加方式)
log4j.appender.appender2=org.apache.log4j.FileAppender
#设置文件输出路径
#【1】文本文件
#log4j.appender.appender2.File=D:/workspace3.3/test/Log4JDemo02.log
#【2】HTML文件
log4j.appender.appender2.File=D:/workspace3.3/test/Log4JDemo02.html
#设置文件输出样式
#log4j.appender.appender2.layout=org.apache.log4j.TTCCLayout
log4j.appender.appender2.layout=org.apache.log4j.HTMLLayout[/java]

2010/03/30

Maven的安装

Filed under: Java笔记 — Tags: — admin @ 16:37

Maven 是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model), 一组标准集合, 一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

Maven的下载地址: http://maven.apache.org/download.html

下载后解压到你想要安装的位置,这里假设是D:\Java\apache-maven-2.2.1。在环境变量中添加一个M2_HOME变量,值为D:\Java\apache-maven-2.2.1。在PATH变量中加入%M2_HOME%\bin即可。

打开命令行,输入 mvn -v,将能看到Maven的版本信息:

>mvn -v
Apache Maven 2.2.1 (r801777; 2009-08-07 03:16:01+0800)
Java version: 1.6.0_14
Java home: D:\Java\jdk1.6.0_14\jre
Default locale: zh_CN, platform encoding: GBK
OS name: “windows 7″ version: “6.1″ arch: “x86″ Family: “windows”

安装完成!

2010/01/11

最新语言排名

Filed under: Java笔记 — Tags: — admin @ 10:53

好几天没写博客了。今天在javaeye上看到最新的2010年TIOBE第一次语言排行榜已经新鲜出炉。稍稍留意了一下,JAVA的优势越来越弱了。C语言的活力实在不可小觑,可惜自己把C丢的差不多了。语言新秀GO有google的支持发展迅猛,已经在13的位置,下个月可能还要飚升几位,看来有必要去了解一下这个语言了。

2010年TIOBE第一次语言排行榜

Older Posts »

Powered by WordPress