隨筆 - 117  文章 - 72  trackbacks - 0

          聲明:原創作品(標有[原]字樣)轉載時請注明出處,謝謝。

          常用鏈接

          常用設置
          常用軟件
          常用命令
           

          訂閱

          訂閱

          留言簿(7)

          隨筆分類(130)

          隨筆檔案(123)

          搜索

          •  

          積分與排名

          • 積分 - 156401
          • 排名 - 390

          最新評論

              搬到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;///
              }
          }

          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;
              }
          }

          posted on 2009-03-16 17:05 天堂露珠 閱讀(1074) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 诸暨市| 齐河县| 织金县| 松原市| 出国| 贡觉县| 确山县| 探索| 昌乐县| 昆明市| 会理县| 阿勒泰市| 胶南市| 石棉县| 桂平市| 乐山市| 宜城市| 镇康县| 惠州市| 启东市| 永济市| 安新县| 即墨市| 南和县| 邯郸县| 瑞丽市| 东方市| 四子王旗| 芦溪县| 曲周县| 方城县| 安顺市| 六安市| 云林县| 巢湖市| 龙门县| 阳东县| 定安县| 都兰县| 东丰县| 乐昌市|