??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产精品网站,久久国产小视频,久久午夜免费电影http://www.aygfsteel.com/leeguannan/articles/185764.html阿南阿南Wed, 12 Mar 2008 09:44:00 GMThttp://www.aygfsteel.com/leeguannan/articles/185764.htmlhttp://www.aygfsteel.com/leeguannan/comments/185764.htmlhttp://www.aygfsteel.com/leeguannan/articles/185764.html#Feedback0http://www.aygfsteel.com/leeguannan/comments/commentRss/185764.htmlhttp://www.aygfsteel.com/leeguannan/services/trackbacks/185764.html阅读全文

阿南 2008-03-12 17:44 发表评论
]]>
关于Java文g路径问题http://www.aygfsteel.com/leeguannan/articles/127380.html阿南阿南Sun, 01 Jul 2007 12:36:00 GMThttp://www.aygfsteel.com/leeguannan/articles/127380.htmlhttp://www.aygfsteel.com/leeguannan/comments/127380.htmlhttp://www.aygfsteel.com/leeguannan/articles/127380.html#Feedback0http://www.aygfsteel.com/leeguannan/comments/commentRss/127380.htmlhttp://www.aygfsteel.com/leeguannan/services/trackbacks/127380.html

1.如何获得当前文g路径

常用Q?/font>

字符串类型:System.getProperty("user.dir");

l合Q?/font>

package com.zcjl.test.base;
import java.io.File;
public class Test {
    public static void main(String[] args) throws Exception {
        System.out.println(
            Thread.currentThread().getContextClassLoader().getResource(""));
        System.out.println(Test.class.getClassLoader().getResource(""));
        System.out.println(ClassLoader.getSystemResource(""));
        System.out.println(Test.class.getResource(""));
        System.out.println(Test.class.getResource("/"));
        System.out.println(new File("").getAbsolutePath());
        System.out.println(System.getProperty("user.dir"));

    }
}

2.Web服务?/font>

(1).Weblogic

WebApplication的系l文件根目录是你的weblogic安装所在根目录?br>例如Q如果你的weblogic安装在c:\bea\weblogic700.....
那么Q你的文件根路径是c:\.
所以,有两U方式能够让你访问你的服务器端的文gQ?br>a.使用l对路径Q?br>比如你的参数文件放在c:\yourconfig\yourconf.propertiesQ?br>直接使用 new FileInputStream("yourconfig/yourconf.properties");
b.使用相对路径Q?br>相对路径的根目录是你的webapplication的根路径Q即WEB-INF的上一U目录,你的参数文件放在yourwebapp\yourconfig\yourconf.propertiesQ?br>q样使用Q?br>new FileInputStream("./yourconfig/yourconf.properties");
q两U方式均可,自己选择?/font>

(2).Tomcat

在类中输出System.getProperty("user.dir");昄的是%Tomcat_Home%/bin

(3).Resin

不是你的JSP攄相对路径,是JSP引擎执行q个JSP~译成SERVLET
的\径ؓ?比如用新建文件法试File f = new File("a.htm");
q个a.htm在resin的安装目录下

(4).如何ȝ对\径哪Q?/font>

在Java文g中getResource或getResourceAsStream均可

例:getClass().getResourceAsStream(filePath);//filePath可以?/filename",q里?代表web发布根\径下WEB-INF/classes

(5).获得文g真实路径

string  file_real_path=request.getRealPath("mypath/filename"); 

通常使用request.getRealPath("/"); 

3.文g操作的类

import java.io.*;
import java.net.*;
import java.util.*;
//import javax.swing.filechooser.*;
//import org.jr.swing.filter.*;

/**
* 此类中封装一些常用的文g操作?br>* 所有方法都是静态方法,不需要生成此cȝ实例Q?br>* 为避免生成此cȝ实例Q构造方法被x为privatecd的?br>* @since  0.1
*/

public class FileUtil {
  /**
   * U有构造方法,防止cȝ实例化,因ؓ工具cM需要实例化?br>   */
  private FileUtil() {

  }

  /**
   * 修改文g的最后访问时间?br>   * 如果文g不存在则创徏该文件?br>   * <b>目前q个Ҏ的行为方式还不稳定,主要是方法有些信息输出,q些信息输出是否保留q在?/font>

虑中?lt;/b>
   * @param file 需要修Ҏ后访问时间的文g?br>   * @since  0.1
   */
  public static void touch(File file) {
    long currentTime = System.currentTimeMillis();
    if (!file.exists()) {
      System.err.println("file not found:" + file.getName());
      System.err.println("Create a new file:" + file.getName());
      try {
        if (file.createNewFile()) {
        //  System.out.println("Succeeded!");
        }
        else {
        //  System.err.println("Create file failed!");
        }
      }
      catch (IOException e) {
      //  System.err.println("Create file failed!");
        e.printStackTrace();
      }
    }
    boolean result = file.setLastModified(currentTime);
    if (!result) {
    //  System.err.println("touch failed: " + file.getName());
    }
  }

  /**
   * 修改文g的最后访问时间?br>   * 如果文g不存在则创徏该文件?br>   * <b>目前q个Ҏ的行为方式还不稳定,主要是方法有些信息输出,q些信息输出是否保留q在?/font>

虑中?lt;/b>
   * @param fileName 需要修Ҏ后访问时间的文g的文件名?br>   * @since  0.1
   */
  public static void touch(String fileName) {
    File file = new File(fileName);
    touch(file);
  }

  /**
   * 修改文g的最后访问时间?br>   * 如果文g不存在则创徏该文件?br>   * <b>目前q个Ҏ的行为方式还不稳定,主要是方法有些信息输出,q些信息输出是否保留q在?/font>

虑中?lt;/b>
   * @param files 需要修Ҏ后访问时间的文g数组?br>   * @since  0.1
   */
  public static void touch(File[] files) {
    for (int i = 0; i < files.length; i++) {
      touch(files);
    }
  }

  /**
   * 修改文g的最后访问时间?br>   * 如果文g不存在则创徏该文件?br>   * <b>目前q个Ҏ的行为方式还不稳定,主要是方法有些信息输出,q些信息输出是否保留q在?/font>

虑中?lt;/b>
   * @param fileNames 需要修Ҏ后访问时间的文g名数l?br>   * @since  0.1
   */
  public static void touch(String[] fileNames) {
    File[] files = new File[fileNames.length];
    for (int i = 0; i < fileNames.length; i++) {
      files = new File(fileNames);
    }
    touch(files);
  }

  /**
   * 判断指定的文件是否存在?br>   * @param fileName 要判断的文g的文件名
   * @return 存在时返回trueQ否则返回false?br>   * @since  0.1
   */
  public static boolean isFileExist(String fileName) {
    return new File(fileName).isFile();
  }

  /**
   * 创徏指定的目录?br>   * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录?br>   * <b>注意Q可能会在返回false的时候创建部分父目录?lt;/b>
   * @param file 要创建的目录
   * @return 完全创徏成功时返回trueQ否则返回false?br>   * @since  0.1
   */
  public static boolean makeDirectory(File file) {
    File parent = file.getParentFile();
    if (parent != null) {
      return parent.mkdirs();
    }
    return false;
  }

  /**
   * 创徏指定的目录?br>   * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录?br>   * <b>注意Q可能会在返回false的时候创建部分父目录?lt;/b>
   * @param fileName 要创建的目录的目录名
   * @return 完全创徏成功时返回trueQ否则返回false?br>   * @since  0.1
   */
  public static boolean makeDirectory(String fileName) {
    File file = new File(fileName);
    return makeDirectory(file);
  }

  /**
   * 清空指定目录中的文g?br>   * q个Ҏ尽可能删除所有的文gQ但是只要有一个文件没有被删除都会q回false?br>   * 另外q个Ҏ不会q代删除Q即不会删除子目录及其内宏V?br>   * @param directory 要清I的目录
   * @return 目录下的所有文仉被成功删除时q回trueQ否则返回false.
   * @since  0.1
   */
  public static boolean emptyDirectory(File directory) {
    boolean result = false;
    File[] entries = directory.listFiles();
    for (int i = 0; i < entries.length; i++) {
      if (!entries.delete()) {
        result = false;
      }
    }
    return true;
  }

  /**
   * 清空指定目录中的文g?br>   * q个Ҏ尽可能删除所有的文gQ但是只要有一个文件没有被删除都会q回false?br>   * 另外q个Ҏ不会q代删除Q即不会删除子目录及其内宏V?br>   * @param directoryName 要清I的目录的目录名
   * @return 目录下的所有文仉被成功删除时q回trueQ否则返回false?br>   * @since  0.1
   */
  public static boolean emptyDirectory(String directoryName) {
    File dir = new File(directoryName);
    return emptyDirectory(dir);
  }

  /**
   * 删除指定目录及其中的所有内宏V?br>   * @param dirName 要删除的目录的目录名
   * @return 删除成功时返回trueQ否则返回false?br>   * @since  0.1
   */
  public static boolean deleteDirectory(String dirName) {
    return deleteDirectory(new File(dirName));
  }

  /**
   * 删除指定目录及其中的所有内宏V?br>   * @param dir 要删除的目录
   * @return 删除成功时返回trueQ否则返回false?br>   * @since  0.1
   */
  public static boolean deleteDirectory(File dir) {
    if ( (dir == null) || !dir.isDirectory()) {
      throw new IllegalArgumentException("Argument " + dir +
                                         " is not a directory. ");
    }

    File[] entries = dir.listFiles();
    int sz = entries.length;

    for (int i = 0; i < sz; i++) {
      if (entries.isDirectory()) {
        if (!deleteDirectory(entries)) {
          return false;
        }
      }
      else {
        if (!entries.delete()) {
          return false;
        }
      }
    }

    if (!dir.delete()) {
      return false;
    }
    return true;
  }


  /**
   * q回文g的URL地址?br>   * @param file 文g
   * @return 文g对应的的URL地址
   * @throws MalformedURLException
   * @since  0.4
   * @deprecated 在实现的时候没有注意到FilecLw带一个toURLҎ文件\径{换ؓURL?br>   *             请用File.toURLҎ?br>   */
  public static URL getURL(File file) throws MalformedURLException {
    String fileURL = "file:/" + file.getAbsolutePath();
    URL url = new URL(fileURL);
    return url;
  }

  /**
   * 从文件\径得到文件名?br>   * @param filePath 文g的\径,可以是相对\径也可以是绝对\?br>   * @return 对应的文件名
   * @since  0.4
   */
  public static String getFileName(String filePath) {
    File file = new File(filePath);
    return file.getName();
  }

  /**
   * 从文件名得到文gl对路径?br>   * @param fileName 文g?br>   * @return 对应的文件\?br>   * @since  0.4
   */
  public static String getFilePath(String fileName) {
    File file = new File(fileName);
    return file.getAbsolutePath();
  }

  /**
   * DOS/Windows格式的\径{换ؓUNIX/Linux格式的\径?br>   * 其实是\径中?\"全部换ؓ"/"Q因为在某些情况下我们{换ؓq种方式比较方便Q?br>   * 某中E度上说"/"?\"更适合作ؓ路径分隔W,而且DOS/Windows也将它当作\径分隔符?br>   * @param filePath 转换前的路径
   * @return 转换后的路径
   * @since  0.4
   */
  public static String toUNIXpath(String filePath) {
    return filePath.replace('\\', '/');
  }

  /**
   * 从文件名得到UNIX风格的文件绝对\径?br>   * @param fileName 文g?br>   * @return 对应的UNIX风格的文件\?br>   * @since  0.4
   * @see #toUNIXpath(String filePath) toUNIXpath
   */
  public static String getUNIXfilePath(String fileName) {
    File file = new File(fileName);
    return toUNIXpath(file.getAbsolutePath());
  }

  /**
   * 得到文g的类型?br>   * 实际上就是得到文件名中最后一?#8220;.”后面的部分?br>   * @param fileName 文g?br>   * @return 文g名中的类型部?br>   * @since  0.5
   */
  public static String getTypePart(String fileName) {
    int point = fileName.lastIndexOf('.');
    int length = fileName.length();
    if (point == -1 || point == length - 1) {
      return "";
    }
    else {
      return fileName.substring(point + 1, length);
    }
  }

  /**
   * 得到文g的类型?br>   * 实际上就是得到文件名中最后一?#8220;.”后面的部分?br>   * @param file 文g
   * @return 文g名中的类型部?br>   * @since  0.5
   */
  public static String getFileType(File file) {
    return getTypePart(file.getName());
  }

  /**
   * 得到文g的名字部分?br>   * 实际上就是\径中的最后一个\径分隔符后的部分?br>   * @param fileName 文g?br>   * @return 文g名中的名字部?br>   * @since  0.5
   */
  public static String getNamePart(String fileName) {
    int point = getPathLsatIndex(fileName);
    int length = fileName.length();
    if (point == -1) {
      return fileName;
    }
    else if (point == length - 1) {
      int secondPoint = getPathLsatIndex(fileName, point - 1);
      if (secondPoint == -1) {
        if (length == 1) {
          return fileName;
        }
        else {
          return fileName.substring(0, point);
        }
      }
      else {
        return fileName.substring(secondPoint + 1, point);
      }
    }
    else {
      return fileName.substring(point + 1);
    }
  }

  /**
   * 得到文g名中的父路径部分?br>   * 对两U\径分隔符都有效?br>   * 不存在时q回""?br>   * 如果文g名是以\径分隔符l尾的则不考虑该分隔符Q例?/path/"q回""?br>   * @param fileName 文g?br>   * @return 父\径,不存在或者已l是父目录时q回""
   * @since  0.5
   */
  public static String getPathPart(String fileName) {
    int point = getPathLsatIndex(fileName);
    int length = fileName.length();
    if (point == -1) {
      return "";
    }
    else if (point == length - 1) {
      int secondPoint = getPathLsatIndex(fileName, point - 1);
      if (secondPoint == -1) {
        return "";
      }
      else {
        return fileName.substring(0, secondPoint);
      }
    }
    else {
      return fileName.substring(0, point);
    }
  }

  /**
   * 得到路径分隔W在文g路径中首ơ出现的位置?br>   * 对于DOS或者UNIX风格的分隔符都可以?br>   * @param fileName 文g路径
   * @return 路径分隔W在路径中首ơ出现的位置Q没有出现时q回-1?br>   * @since  0.5
   */
  public static int getPathIndex(String fileName) {
    int point = fileName.indexOf('/');
    if (point == -1) {
      point = fileName.indexOf('\\');
    }
    return point;
  }

  /**
   * 得到路径分隔W在文g路径中指定位|后首次出现的位|?br>   * 对于DOS或者UNIX风格的分隔符都可以?br>   * @param fileName 文g路径
   * @param fromIndex 开始查扄位置
   * @return 路径分隔W在路径中指定位|后首次出现的位|,没有出现时返?1?br>   * @since  0.5
   */
  public static int getPathIndex(String fileName, int fromIndex) {
    int point = fileName.indexOf('/', fromIndex);
    if (point == -1) {
      point = fileName.indexOf('\\', fromIndex);
    }
    return point;
  }

  /**
   * 得到路径分隔W在文g路径中最后出现的位置?br>   * 对于DOS或者UNIX风格的分隔符都可以?br>   * @param fileName 文g路径
   * @return 路径分隔W在路径中最后出现的位置Q没有出现时q回-1?br>   * @since  0.5
   */
  public static int getPathLsatIndex(String fileName) {
    int point = fileName.lastIndexOf('/');
    if (point == -1) {
      point = fileName.lastIndexOf('\\');
    }
    return point;
  }

  /**
   * 得到路径分隔W在文g路径中指定位|前最后出现的位置?br>   * 对于DOS或者UNIX风格的分隔符都可以?br>   * @param fileName 文g路径
   * @param fromIndex 开始查扄位置
   * @return 路径分隔W在路径中指定位|前最后出现的位置Q没有出现时q回-1?br>   * @since  0.5
   */
  public static int getPathLsatIndex(String fileName, int fromIndex) {
    int point = fileName.lastIndexOf('/', fromIndex);
    if (point == -1) {
      point = fileName.lastIndexOf('\\', fromIndex);
    }
    return point;
  }

  /**
   * 文件名中的cd部分L?br>   * @param filename 文g?br>   * @return Lcd部分的结?br>   * @since  0.5
   */
  public static String trimType(String filename) {
    int index = filename.lastIndexOf(".");
    if (index != -1) {
      return filename.substring(0, index);
    }
    else {
      return filename;
    }
  }
  /**
   * 得到相对路径?br>   * 文g名不是目录名的子节点时返回文件名?br>   * @param pathName 目录?br>   * @param fileName 文g?br>   * @return 得到文g名相对于目录名的相对路径Q目录下不存在该文g时返回文件名
   * @since  0.5
   */
  public static String getSubpath(String pathName,String fileName) {
    int index = fileName.indexOf(pathName);
    if (index != -1) {
      return fileName.substring(index + pathName.length() + 1);
    }
    else {
      return fileName;
    }
  }

}
 4.遗留问题

目前new FileInputStream()只会使用l对路径Q相Ҏ用过Q因相对于web服务器地址Q比较麻?/font>

q不如写个配|文件来的快?/font>

5.按Java文gcd分类d配置文g

配置文g是应用系l中不可~少的,可以增加E序的灵zL。java.util.Properties是从jdk1.2有的类Q一直到现在都支持load ()ҎQjdk1.4以后save(output,string) ->store(output,string)。如果只是单U的读,Ҏ不存在烦恼的问题。web层可以通过 Thread.currentThread().getContextClassLoader().
getResourceAsStream("xx.properties") 获取QApplication可以通过new FileInputStream("xx.properties");直接在classes一U获取。关键是有时我们需要通过web修改配置文gQ我们不能将路径写死了。经q测试觉得有以下心得Q?/font>

1.servlet中读写。如果运用Struts 或者Servlet可以直接在初始化参数中配|,调用时根据servlet的getRealPath("/")获取真实路径Q再ҎString file = this.servlet.getInitParameter("abc");获取相对的WEB-INF的相对\径?br>例:
InputStream input = Thread.currentThread().getContextClassLoader().
getResourceAsStream("abc.properties");
Properties prop = new Properties();
prop.load(input);
input.close();
OutputStream out = new FileOutputStream(path);
prop.setProperty("abc", “test");
prop.store(out, “–test–");
out.close();

2.直接在jsp中操作,通过jsp内置对象获取可操作的l对地址?br>例:
// jsp面
String path = pageContext.getServletContext().getRealPath("/");
String realPath = path+"/WEB-INF/classes/abc.properties";

//java E序
InputStream in = getClass().getClassLoader().getResourceAsStream("abc.properties"); // abc.properties攑֜webroot/WEB-INF/classes/目录?br>prop.load(in);
in.close();

OutputStream out = new FileOutputStream(path); // path为通过面传入的\?br>prop.setProperty("abc", “abcccccc");
prop.store(out, “–test–");
out.close();

3.只通过JavaE序操作资源文g
InputStream in = new FileInputStream("abc.properties"); // 攑֜classes同

OutputStream out = new FileOutputStream("abc.properties");  



阿南 2007-07-01 20:36 发表评论
]]>
Hibernate Iterator JCS分析 http://www.aygfsteel.com/leeguannan/articles/120759.html阿南阿南Tue, 29 May 2007 13:44:00 GMThttp://www.aygfsteel.com/leeguannan/articles/120759.htmlhttp://www.aygfsteel.com/leeguannan/comments/120759.htmlhttp://www.aygfsteel.com/leeguannan/articles/120759.html#Feedback0http://www.aygfsteel.com/leeguannan/comments/commentRss/120759.htmlhttp://www.aygfsteel.com/leeguannan/services/trackbacks/120759.html

JCS是一个对象CacheQ它可以把Java对象~存hQ提高那些访问频率很高的Java对象的存取效率。JCS是按照对象的唯一标示来存取对象的Q比如说可以按照对象的hashCode来存取?/p>

对于Hibernate来说Q可以利用JCS来缓存查询结果,q样当下ơ访问同L数据Q就无须L据库取,直接从JCS中取出来Q加快了查询速度?/p>

当Hibernate使用List或者Iterator方式来第一ơ读取数据的时候,JCS是空的,此时不管是List方式q是Iterator方式都会往JCS里面填充查询出来的持久对象,例如Q?/p>

select c from Cat as c 

?/p>

select c.id, c.name  from Cat as c

q种HQL语句不构造POQ因此不会去填充JCS?/p>

好了Q现在JCS里面填好了数据,但是该怎么取呢Q上面我说过是按照对象的唯一标示来存取的Q而对于PO持久对象来说Q唯一标示是主键Q因此Hibernate首先必须获得主键列表Q然后根据主键列表挨个判断,看这个持久对象究竟是在JCS里面q是在数据库里面Q如果在JCS里面Q那么按照主键取Q如果在数据库,那么发送sql取?/p>

现在我们来分析ؓ什么Iterator可以使用JCSQ而List不能。上面说了,用JCS之前Q要先获得持久对象的主键Q才能去JCS里面取持久对象,而我们怎么才能获得主键列表呢?必须L据库中取得,q一步是没有办法~冲的?/p>

Hibernate Iterator的查询本w是分ؓ两步的:

==> select id from cat ==> select * from cat where id = ?==> select * from cat where id = ?...==> select * from cat where id = ?

W一步,L据库中取主键列表Q第二步Q按照主键一个一个取数据。当然了Q我们现在可以看出来QIterator方式下如果不用JCS的话Q那么从数据库中取出n条记录就需要n+1ơsql查询Q这是非常可怕的事情Q因此如果在没有使用JCS的情况下Q你又必Mơ去取大量数据,应该避免使用Iterator?/p>

而Iterator的第一ơsql是取主键列表Q这个时间消耗是非常的Q如果用了JCSQ那么每ơ查询仍然要不可避免的去发送一ơsql: select id from cat d主键列表Q然后呢Q?然后Iterator׃会那么傻了,他会先到JCS里面ȝ看,按照主键L持久对象Q如果有了,直接拿出来用Q如果没有,那么只好L据库中取得,然后再把它填到JCS里面厅R?/p>

因此可以看出来,JCS有点cM一个内存中的简单对象数据库Q?Iterator的第一ơsql取主键列表是必须要到数据库里面取的,取得了主键这把钥匙以后,Iterator会首先尝试开JCSq把锁,打得开q接进去,如果打不开Q就只好d数据库这把锁了?/p>

而Hibernate List方式是JDBC的简单封装,一ơsql把所有的数据都取出来了,它不会像Iterator那样先取主键Q然后再取数据,因此List无法利用JCS。不qList也可以把从数据库中取出的数据填充到JCS里面厅R?/p>

最佳的方式Q第一ơ访问用ListQ快速填充JCSQ以后访问采用IteratorQ充分利用JCS?/p>

mikeho write:

那JCS是如何和Database保持同步的?

robbin write:

jcs.default.elementattributes.MaxLifeSeconds=240Q最大缓冲时_

时做作废,另外你在E序里面也可以clear JCS cache




Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=261240



阿南 2007-05-29 21:44 发表评论
]]>
վ֩ģ壺 | ľ| С| | ʯ| «ɽ| ͭɽ| ƽ| | | | ˳ƽ| ʡ| | ƽ| | | ¬| | ƽ| | Զ| ϼ| Ĭ| ͩ| ƾ| ǹ| | | Ϫ| Ȫ| | | Ϫ| ͤ| ղ| | | | | ƺ|