- 浏览: 203616 次
- 性别:
- 来自: 芜湖
文章分类
- 全部博客 (139)
- 软件 (0)
- Pattern (6)
- CSDN导入 (19)
- Struts (3)
- [网站分类]1.网站首页原创 (27)
- [网站分类]6.转载区 (4)
- Hibernate (10)
- Error (8)
- [网站分类]2.Java新手区 (20)
- Java (8)
- [网站分类]4.其他技术区 (10)
- Web (1)
- C++ (2)
- Algorithm (4)
- Linux (2)
- Skill (1)
- Tech (2)
- Note (2)
- [网站分类]3.非技术区 (1)
- Database (1)
- Winty (7)
- [网站分类]1.网站首页原创Java技术区(对首页文章的要求: 原创、高质量、经过认真思考并精心写作。BlogJava管理团队会对首页的文章进行管理。) (0)
最新评论
-
haohao-xuexi02:
很不错哦。
O'Reilly cos上传组件的使用(1/3) - 上传文件 -
yoin528:
useUnicode=true&charact ...
[原]向MySQL数据库插入Blob数据的问题 -
xiaoqing20:
下载来看看!呵呵
[原]Struts2类型转换 -
xiaoqing20:
[原]Struts2类型转换
搬到blogjava总得发点原创的东西吧。
CodeHelp是专门为我们程序员设计的一款源代码管理软件。它能方便的管理您在编程和学习中有用的源代码,减少经常到处查找资料的劳动,节省您在开发中的时间和精力。这个软件不错,如果没有用过请到这里下载(http://www.nulldo.com/)。用了一段时间,发现它并没有文件导出功能。于是用Java写了一个CodeHelpExporter。
下图为CodeHelp数据库表的关系,是用Visio导入Access反向分析得来的。有了这个图我们就可以编程了。
CodeHelpExporter.java源代码如下:
import java.sql.*;
import java.io.*;
/*
*将CodeHelp数据库中的文件导出
*@version 2009-3-15
*@author Winty (wintys@gmail.com)
*/
class CodeHelpExporter{
Database db;//数据库连接对象
public CodeHelpExporter(String dbPath){
db = new Database(dbPath);
try{
db.connect();
}catch(SQLException sqle){
sqle.printStackTrace();
}
}
/**
*主函数
*/
public static void main(String[] args){
String dbq = "helpdb.mdb";
CodeHelpExporter exporter = new CodeHelpExporter( dbq );
exporter.export();
}
/**
*按CodeHelp的目录结构导出文章及其附件。
*但有一点不同,就是不含任何内容的目录不会被创建。
*文章会被导出到当前目录的CodeHelpExportedFiles目录下。
*/
public void export(){
try{
String sql;
sql = "SELECT T.NodeId AS id , T.ParentId AS parent ,";
sql +="T.Type AS type,T.Title AS title , C.Content AS content ";
sql +="FROM TContent C, TTree T WHERE T.NodeId = C.NodeId ";
ResultSet rs = db.query(sql);
while(rs.next()){
int type = rs.getInt("type");
if(type == 0)//如果是目录,则无操作
continue;
int parent = rs.getInt("parent");
int id = rs.getInt("id");
String title = rs.getString("title");
File fullParentPath = null;
fullParentPath = parentPath(parent , "");
fullParentPath = new File("CodeHelpExportedFiles/" +
fullParentPath.toString() );
//读取附件的SQL
String sql2 = "SELECT A.Title AS title , A.Data AS data ";
sql2 += "FROM TAttachment A WHERE A.NodeId = " + id;
ResultSet rs2=db.query(sql2);
//判断文章有没有附件
//如果文章没有附件则不创建目录,即文章不包含在目录中
rs2.last();
int num = rs2.getRow();
String article;
if(num > 0){
article = title + "/" ;
}
else{
article = "";
}
fullParentPath = new File(fullParentPath , article);
if(!fullParentPath.exists())
fullParentPath.mkdirs();
//读取文章
InputStream input = rs.getAsciiStream("content");
readDataToFile(new File(fullParentPath , title + ".txt") , input);
//读取文章的附件
rs2.beforeFirst();
while(rs2.next()){
String attachmentName = rs2.getString("title");
InputStream data = rs2.getBinaryStream("Data");
//将附件与其文章一同放在以文章名为目录名的目录中
readDataToFile(new File(fullParentPath , attachmentName) ,
data);
}
rs2.close();
}
rs.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
db.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
/**
*从数据流中读取数据到文件
*@param fileName 输出文件的文件名
*@param input 数据输入流
*/
private void readDataToFile(File filePath , InputStream input)
throws IOException{
FileOutputStream file = new FileOutputStream(filePath);
BufferedOutputStream output = new BufferedOutputStream(file);
byte[] buf = new byte[1024];
int len;
while((len = input.read(buf))!=-1){
output.write(buf , 0 , len);
}
input.close();
output.close();
}
/**
*递归地构造目录(如果父目录存在的话)。即如果是子目录,则一直找到根目录才返回。
*@param parent 父目录的ParentId
*@param title 文件自身目录名,对于文章而言,path总是传入空字符串。
*@return 返回构造后的目录(含从根目录一直到子目录的各级目录)
*/
private File parentPath(int parent , String path)
throws IOException , SQLException{
if(parent == 0){//根目录
File dir = new File(path);
return dir;
}
else{
String sql = "SELECT Title , ParentId FROM TTree ";
sql += "WHERE NodeId=" + parent;
ResultSet rs = db.query(sql);
if(rs.next()){
String nodeTitle = rs.getString("Title");
int nodeParent = rs.getInt("ParentId");
path = nodeTitle + "/" + path;
return parentPath(nodeParent , path);
}
rs.close();
}
return null;///
}
}
import java.io.*;
/*
*将CodeHelp数据库中的文件导出
*@version 2009-3-15
*@author Winty (wintys@gmail.com)
*/
class CodeHelpExporter{
Database db;//数据库连接对象
public CodeHelpExporter(String dbPath){
db = new Database(dbPath);
try{
db.connect();
}catch(SQLException sqle){
sqle.printStackTrace();
}
}
/**
*主函数
*/
public static void main(String[] args){
String dbq = "helpdb.mdb";
CodeHelpExporter exporter = new CodeHelpExporter( dbq );
exporter.export();
}
/**
*按CodeHelp的目录结构导出文章及其附件。
*但有一点不同,就是不含任何内容的目录不会被创建。
*文章会被导出到当前目录的CodeHelpExportedFiles目录下。
*/
public void export(){
try{
String sql;
sql = "SELECT T.NodeId AS id , T.ParentId AS parent ,";
sql +="T.Type AS type,T.Title AS title , C.Content AS content ";
sql +="FROM TContent C, TTree T WHERE T.NodeId = C.NodeId ";
ResultSet rs = db.query(sql);
while(rs.next()){
int type = rs.getInt("type");
if(type == 0)//如果是目录,则无操作
continue;
int parent = rs.getInt("parent");
int id = rs.getInt("id");
String title = rs.getString("title");
File fullParentPath = null;
fullParentPath = parentPath(parent , "");
fullParentPath = new File("CodeHelpExportedFiles/" +
fullParentPath.toString() );
//读取附件的SQL
String sql2 = "SELECT A.Title AS title , A.Data AS data ";
sql2 += "FROM TAttachment A WHERE A.NodeId = " + id;
ResultSet rs2=db.query(sql2);
//判断文章有没有附件
//如果文章没有附件则不创建目录,即文章不包含在目录中
rs2.last();
int num = rs2.getRow();
String article;
if(num > 0){
article = title + "/" ;
}
else{
article = "";
}
fullParentPath = new File(fullParentPath , article);
if(!fullParentPath.exists())
fullParentPath.mkdirs();
//读取文章
InputStream input = rs.getAsciiStream("content");
readDataToFile(new File(fullParentPath , title + ".txt") , input);
//读取文章的附件
rs2.beforeFirst();
while(rs2.next()){
String attachmentName = rs2.getString("title");
InputStream data = rs2.getBinaryStream("Data");
//将附件与其文章一同放在以文章名为目录名的目录中
readDataToFile(new File(fullParentPath , attachmentName) ,
data);
}
rs2.close();
}
rs.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
db.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
/**
*从数据流中读取数据到文件
*@param fileName 输出文件的文件名
*@param input 数据输入流
*/
private void readDataToFile(File filePath , InputStream input)
throws IOException{
FileOutputStream file = new FileOutputStream(filePath);
BufferedOutputStream output = new BufferedOutputStream(file);
byte[] buf = new byte[1024];
int len;
while((len = input.read(buf))!=-1){
output.write(buf , 0 , len);
}
input.close();
output.close();
}
/**
*递归地构造目录(如果父目录存在的话)。即如果是子目录,则一直找到根目录才返回。
*@param parent 父目录的ParentId
*@param title 文件自身目录名,对于文章而言,path总是传入空字符串。
*@return 返回构造后的目录(含从根目录一直到子目录的各级目录)
*/
private File parentPath(int parent , String path)
throws IOException , SQLException{
if(parent == 0){//根目录
File dir = new File(path);
return dir;
}
else{
String sql = "SELECT Title , ParentId FROM TTree ";
sql += "WHERE NodeId=" + parent;
ResultSet rs = db.query(sql);
if(rs.next()){
String nodeTitle = rs.getString("Title");
int nodeParent = rs.getInt("ParentId");
path = nodeTitle + "/" + path;
return parentPath(nodeParent , path);
}
rs.close();
}
return null;///
}
}
Database.java:
import java.sql.*;
import java.io.*;
/**
*数据库操作类,当前只适用于Access数据库。
*@version 2009-3-15
*@author wintys@gmail.com
*/
class Database{
private Connection conn = null;
private String dbPath = null;
/**
*构造方法
*@param databasePath Access数据库的路径
*/
public Database(String databasePath){
dbPath = databasePath;
}
/**
*连接数据库
*@return 返回一个数据库连接Connection,如果连接数据库失败,返回null。
*/
public Connection connect()
throws SQLException{
if(conn!=null)
return conn;
if(dbPath==null || dbPath.equals("")){
conn = null;
throw new SQLException("数据库路径错误!");
}
String url;
//Microsoft Access数据库连接字符串
url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=";
url += dbPath;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
conn = DriverManager.getConnection(url , "" , "");
return conn;
}
/**
*关闭数据库连接
*/
public void close() throws SQLException{
if(conn!=null)
conn.close();
}
/**
*执行查询,调用者要负责关闭结果集。
*@param sql 要执行的SQL查询语句
*@return 返回查询结果集
*/
public ResultSet query(String sql) throws SQLException{
Statement stmt;
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE ,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(sql);
return rs;
}
}
import java.io.*;
/**
*数据库操作类,当前只适用于Access数据库。
*@version 2009-3-15
*@author wintys@gmail.com
*/
class Database{
private Connection conn = null;
private String dbPath = null;
/**
*构造方法
*@param databasePath Access数据库的路径
*/
public Database(String databasePath){
dbPath = databasePath;
}
/**
*连接数据库
*@return 返回一个数据库连接Connection,如果连接数据库失败,返回null。
*/
public Connection connect()
throws SQLException{
if(conn!=null)
return conn;
if(dbPath==null || dbPath.equals("")){
conn = null;
throw new SQLException("数据库路径错误!");
}
String url;
//Microsoft Access数据库连接字符串
url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=";
url += dbPath;
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
conn = DriverManager.getConnection(url , "" , "");
return conn;
}
/**
*关闭数据库连接
*/
public void close() throws SQLException{
if(conn!=null)
conn.close();
}
/**
*执行查询,调用者要负责关闭结果集。
*@param sql 要执行的SQL查询语句
*@return 返回查询结果集
*/
public ResultSet query(String sql) throws SQLException{
Statement stmt;
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE ,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(sql);
return rs;
}
}
发表评论
-
[原]使用Ant实现zip压缩解压功能
2009-03-19 13:17 1722[关键词]:ant,zip,unzip,Apache,压缩,解 ... -
[原]EL函数的使用
2009-04-03 21:29 1121[标题]:EL函数的使用 [时 ... -
[原]对Class.getMethod()的调用未经检查
2009-04-05 15:52 2365[标题]:对Class.getMethod()的调用未经检查 ... -
[原]JNI简单示例
2009-04-05 21:33 1039[标题]:JNI简单示例 [时 ... -
[原]简单工厂模式
2009-04-14 12:26 755[关键字]:java,设计模式,简单工厂,《java与模式》 ... -
[原]工厂模式
2009-04-14 12:32 734[关键字]:java,design pattern,设计模式, ... -
[原]抽象工厂模式
2009-04-14 19:25 759[关键字]:java,design pattern,设计模式, ... -
[原]方法返回值为数组的另一种表示方法
2009-04-25 22:28 979[时间]:2009-04-25 今天看到JDK的源代码 ... -
[原]SAX使用示例
2009-04-26 19:18 2053[标题]:[原]SAX使用示例 [时间]:2009-4-25 ... -
[原]责任链模式
2009-05-09 16:47 738[关键字]:java,design pattern,设计模式, ... -
[原]状态模式
2009-05-18 23:03 839[关键字]:java,design pattern,设计模式, ... -
[原]策略模式
2009-05-21 22:21 706[关键字]:java,design pattern,设计模式, ... -
[原]VC实现重启路由器
2009-05-29 23:36 2082[标题]:[原]VC实现重启路 ... -
[原]远程登录Windows Server 2003的当前会话
2009-06-01 11:19 2075[标题]:远程登录Windows Server 2003的当前 ... -
[原]Tomcat crossContext
2009-06-01 12:27 6103[标题]:Tomcat crossContext [时间]:2 ... -
[原]装饰模式1
2009-06-07 22:33 716[关键字]:java,design pattern,设计模式, ... -
[原]装饰模式3-Grep
2009-06-07 22:42 702[关键字]:java,design pattern,设计模式, ... -
[原]合成模式-透明的
2009-06-08 22:23 766[关键字]:java,design pattern,设计模式, ... -
[原]合成模式-安全的
2009-06-08 22:27 842[关键字]:java,design pattern,设计模式, ... -
[原]模板方法模式
2009-06-15 17:05 678[关键字]:java,design pattern,设计模式, ...
相关推荐
★ CodeHelp是专门为我们程序员设计的一款源代码管理软件。...★ CodeHelp 能够为每个文章添加多个附件,并能够在临时目录中打开附件、导出附件。 ★ CodeHelp 中能够在数据库中按标题查找文章,并支持书签功能。
CodeHelp 是为了方便程序员更好的管理自己的源代码而写的一款免费软件。 利用 CodeHelp,可以方便的管理你的各种技术资料和源代码。 CodeHelp 以目录树来管理代码文件,你可以自由定义目录,并能够自由移动修改...
CodeHelp 是为了方便程序员更好的管 理自己的源代码而写的一款免费软件。 利用 CodeHelp,可以方便的管理你的各种技术资料和源代码。 CodeHelp 以目录树来管理代码文件,你可以自由定义目录,并 能够自由移动...
CodeHelp是一款专为Visual Basic(VB)开发人员设计的插件工具,旨在提升VB编程环境的效率和用户体验。它提供了一系列实用的功能,帮助程序员更好地管理和优化VB代码,从而提高开发速度和代码质量。 首先,CodeHelp...
"源代码管理软件2.0(CODEHELP)"是一款专为程序员设计的工具,旨在帮助他们有效地管理和组织收集到的各种编程语言的代码片段。这款软件利用ACCESS数据库作为存储后端,确保了数据的安全性和可靠性,同时提供了对多种...
基于Thinkry的CodeHelp2.0,编译成了Unicode版本,非中文系统也不乱码了(此版本的源代码已邮件给Thinkry,版权归Thinkry所有) 修正了附件保存问题 简单介绍: CodeHelp是专门为我们程序员设计的一款源代码管理...
开发者之间常常需要互相学习和交流,codehelp可能允许用户将代码片段导出或通过链接分享给他人,促进知识的传播和协作。 从压缩包的文件名称来看,"vcer.net.url"可能是codehelp的来源网址,用户可以通过这个链接...
声明:本程序开源,可以任意修改、复制,可以不保留原作者信息。 开发环境:vs2005 程序是我在2007年利用每个周末写的,由于现在不从事ASP.NET方面的工作,而且比较懒,放着也是浪费,所以希望有兴趣的朋友为这个...
主要功能 ★ CodeHelp是专门为我们程序员设计的一款源代码管理...★ CodeHelp 能够为每个文章添加多个附件,并能够在临时目录中打开附件、导出附件。 ★ CodeHelp 中能够在数据库中按标题查找文章,并支持书签功能。
8. **安全与隐私**:考虑到代码的敏感性,CodeHelp 重视用户数据的安全,提供了加密存储和访问权限控制,确保只有授权的用户才能查看和编辑代码。 9. **备份与同步**:为了防止数据丢失,CodeHelp 提供自动备份和云...
≡≡≡≡≡≡≡≡≡≡≡≡≡『软件简介』≡≡≡≡≡≡≡≡≡≡≡≡≡ CodeHelp 是一款 VisualBasic IDE 环境的增强插件。 通过安装该软件,你可以让你的 VisualBasic IDE 拥有下列功能: 1.源代码编辑区...
自己写的xml文件,放在codehelp的syntex文件夹内即可实现对abap语言的语法着色
CodeHelp 是一款 VisualBasic IDE 环境的增强插件。 通过安装该软件,你可以让你的 VisualBasic IDE 拥有下列功能: 1.源代码编辑区支持全屏 2.源代码编辑区支持鼠标滚轮 3.像 VisualStudio 2003 一样支持标签化工作...
在数据备份和导出方面,CodeHelp 2.0表现出色。它允许用户将所有笔记和相关文件打包成一个单一的文件,这个功能对于数据迁移或防止数据丢失至关重要。只需一键操作,就能将整个笔记库安全地保存到本地或云存储,方便...
CodeHelp是专门为我们程序员设计的一款源代码管理软件。它能方便的管理您在编程和学习中有用的源代码,减少经常到处查找资料的劳动,节省您在开发中的时间和精力。知识管理越来越被大家所重视,源代码也应该做为一种...
**codehelp 代码管理器** 是一款专为程序员设计的高效工具,旨在简化代码的管理和检索过程。在软件开发过程中,开发者经常需要回顾和复用以前编写过的代码片段,这通常需要在各种文件和项目中搜索,费时费力。而**...
3. 版本控制:CodeHelp2.0内置了版本控制系统,可以轻松追踪代码的修改历史,方便团队成员查看和恢复不同版本的代码,避免因误操作导致的数据丢失。 4. 协作与共享:为了支持团队协作,CodeHelp2.0提供了便捷的代码...
★ CodeHelp 能够为每个文章添加多个附件,并能够在临时目录中打开附件、导出附件。★ CodeHelp 中能够在数据库中按标题查找文章,并支持书签功能。 CodeHelp 2.0 新增功能·支持多个数据库文件,能够新建数据库、...
5. **代码导入与导出**:支持从常见的代码托管平台(如GitHub、GitLab)或其他本地文件系统导入源代码,同时也能将代码导出为常见的代码文件格式,方便分享和备份。 6. **协作与分享**:CodeHelp或许还具备一定的...