??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲最大在线观看,在线aⅴ亚洲中文字幕,99亚洲精品高清一二区http://m.tkk7.com/wjywilliam/category/17458.htmlzh-cnFri, 07 Mar 2008 13:20:21 GMTFri, 07 Mar 2008 13:20:21 GMT60一个体现Java接口及工厂模式优点的例子 & 设计模式之Factoryhttp://m.tkk7.com/wjywilliam/articles/184575.htmlwjywilliamwjywilliamFri, 07 Mar 2008 10:11:00 GMThttp://m.tkk7.com/wjywilliam/articles/184575.htmlhttp://m.tkk7.com/wjywilliam/comments/184575.htmlhttp://m.tkk7.com/wjywilliam/articles/184575.html#Feedback0http://m.tkk7.com/wjywilliam/comments/commentRss/184575.htmlhttp://m.tkk7.com/wjywilliam/services/trackbacks/184575.html我们先来看看q两文章:

设计模式之Factory


板桥里h http://www.jdon.com 2002/10/07Q{载请保留Q?/p>

工厂模式定义:提供创徏对象的接?

Z使用?
工厂模式是我们最常用的模式了,著名的Jive论坛 ,大量用了工厂模式Q工厂模式在JavaE序pȝ可以说是随处可见?/span>

Z么工厂模式是如此常用Q因为工厂模式就相当于创建实例对象的newQ我们经常要ҎcClass生成实例对象Q如A a=new A() 工厂模式也是用来创徏实例对象的,所以以后new时就要多个心|是否可以考虑实用工厂模式Q虽然这样做Q可能多做一些工作,但会l你pȝ带来更大的可扩展性和量的修改量?/span>

我们以类SampleZQ?如果我们要创建Sample的实例对?

Sample sample=new Sample();

可是Q实际情冉|Q通常我们都要在创?span lang="EN-US" xml:lang="EN-US">sample实例时做点初始化的工?比如赋?查询数据库等?/span>

首先Q我们想到的是,可以使用Sample的构造函敎ͼq样生成实例写?

Sample sample=new Sample(参数);

但是Q如果创?span lang="EN-US" xml:lang="EN-US">sample实例时所做的初始化工作不是象赋DL单的事,可能是很长一D代码,如果也写入构造函CQ那你的代码很难看了Q就需要Refactor重整Q?/span>

Z么说代码很难看,初学者可能没有这U感觉,我们分析如下Q初始化工作如果是很长一D代码,说明要做的工作很多,很多工作装入一个方法中Q相当于很多鸡蛋放在一个篮子里Q是很危险的Q这也是有背?span lang="EN-US" xml:lang="EN-US">Java面向对象的原则,面向对象的封?Encapsulation)和分z?Delegation)告诉我们Q尽量将长的代码分派“切割”成每D,每D再“装”h(减少D和D之间偶合联pL?Q这P׃风险分散,以后如果需要修改,只要更改每段Q不会再发生牵一动百的事情?/span>

在本例中Q首先,我们需要将创徏实例的工作与使用实例的工作分开, 也就是说Q让创徏实例所需要的大量初始化工作从Sample的构造函C分离出去?/span>

q时我们需?span lang="EN-US" xml:lang="EN-US">Factory工厂模式来生成对象了Q不能再用上面简单new Sample(参数)?/span>q有,如果Sample有个l承如MySample, 按照面向接口~程,我们需要将Sample抽象成一个接?现在Sample是接?有两个子cMySample 和HisSample .我们要实例化他们?如下:

Sample mysample=new MySample();
Sample hissample=new HisSample();

随着目的深?span lang="EN-US" xml:lang="EN-US">,Sample可能q会"生出很多儿子出来", 那么我们要对q些儿子一个个实例?更糟p的?可能q要对以前的代码q行修改:加入后来生出儿子的实?q在传统E序中是无法避免?

但如果你一开始就有意识用了工厂模式,q些ȝ没有了.

工厂Ҏ
你会建立一个专门生?span lang="EN-US" xml:lang="EN-US">Sample实例的工?

public class Factory{

  public static Sample creator(int which){

  //getClass 产生Sample 一般可使用动态类装蝲装入cR?br />   if (which==1)
    return new SampleA();
  else if (which==2)
    return new SampleB();

  }

}

那么在你的程序中,如果要实例化Sample?׃?/span>

Sample sampleA=Factory.creator(1);

q样,在整个就不涉及到Sample的具体子c?辑ֈ装效果,也就减少错误修改的机?q个原理可以用很通俗的话来比?是具体事情做得多,容易范错误.q每个做q具体工作的人都深有体会,相反,官做得越?说出的话抽象越W统,范错误可能性就少.好象我们从编E序中也能悟Zh生道?呵呵.

使用工厂Ҏ 要注意几个角Ԍ首先你要定义产品接口Q如上面的Sample,产品接口下有Sample接口的实现类,如SampleA,其次要有一个factoryc,用来生成产品SampleQ如下图Q最双是生产的对象SampleQ?/p>

 

q一步稍微复杂一点,是在工厂类上进行拓展,工厂cM有承它的实现类concreteFactory?strong>?/em>

抽象工厂
工厂模式中有: 工厂Ҏ(Factory Method) 抽象工厂(Abstract Factory).

q两个模式区别在于需要创建对象的复杂E度上。如果我们创建对象的Ҏ变得复杂?如上面工厂方法中是创Z个对象Sample,如果我们q有新的产品接口Sample2.

q里假设QSample有两个concretecSampleA和SamleBQ而Sample2也有两个concretecSample2A和SampleB2

那么Q我们就上例中Factory变成抽象c?共同部分封装在抽象cM,不同部分使用子类实现Q下面就是将上例中的Factory拓展成抽象工?

public abstract class Factory{

  public abstract Sample creator();

  public abstract Sample2 creator(String name);

}

public class SimpleFactory extends Factory{

  public Sample creator(){
    .........
    return new SampleA

  }

  public Sample2 creator(String name){
    .........
    return new Sample2A

  }

}

public class BombFactory extends Factory{

  public Sample creator(){
    ......
    return new SampleB

  }

  public Sample2 creator(String name){
    ......
    return new Sample2B
  }

}

 

从上面看C个工厂各自生产出一套Sample和Sample2,也许你会疑问Qؓ什么我不可以用两个工厂方法来分别生Sample和Sample2?

抽象工厂q有另外一个关键要点,是因?SimpleFactory内,生Sample和生产Sample2的方法之间有一定联p,所以才要将q两个方法捆l在一个类中,q个工厂cL其本w特征,也许刉过E是l一的,比如Q制造工艺比较简单,所以名U叫SimpleFactory?/span>

在实际应用中Q工厂方法用得比较多一些,而且是和动态类装入器组合在一起应用,

举例

我们?span lang="EN-US" xml:lang="EN-US">Jive的ForumFactoryZQ这个例子在前面的Singleton模式中我们讨Q现在再讨论其工厂模?

public abstract class ForumFactory {

  private static Object initLock = new Object();
  private static String className = "com.jivesoftware.forum.database.DbForumFactory";
  private static ForumFactory factory = null;

  public static ForumFactory getInstance(Authorization authorization) {
    //If no valid authorization passed in, return null.
    if (authorization == null) {
      return null;
    }
    //以下使用了Singleton 单态模?br />     if (factory == null) {
      synchronized(initLock) {
        if (factory == null) {
            ......

          try {
              //动态{载类
              Class c = Class.forName(className);
              factory = (ForumFactory)c.newInstance();
          }
          catch (Exception e) {
              return null;
          }
        }
      }
    }

    //Now, q回 proxy.用来限制授权对forum的访?br />     return new ForumFactoryProxy(authorization, factory,
                    factory.getPermissions(authorization));
  }

  //真正创徏forum的方法由l承forumfactory的子cd完成.
  public abstract Forum createForum(String name, String description)
  throws UnauthorizedException, ForumAlreadyExistsException;

  ....

}

 

 

因ؓ现在?span lang="EN-US" xml:lang="EN-US">Jive是通过数据库系l存放论坛帖子等内容数据,如果希望更改为通过文gpȝ实现,q个工厂ҎForumFactory提供了提供动态接?

private static String className = "com.jivesoftware.forum.database.DbForumFactory";

你可以用自己开发的创徏forum的方法代替com.jivesoftware.forum.database.DbForumFactory可?

在上面的一D代码中一q了三U模?span lang="EN-US" xml:lang="EN-US">,除了工厂模式?q有Singleton单态模?以及proxy模式,proxy模式主要用来授权用户对forum的访?因ؓ讉Kforum有两Uh:一个是注册用户 一个是游客guest,那么那么相应的权限就不一?而且q个权限是诏I整个系l的,因此建立一个proxy,cM|关的概?可以很好的达到这个效?  

看看Java宠物店中的CatalogDAOFactory:

public class CatalogDAOFactory {

 

  /**

  * 本方法制定一个特别的子类来实现DAO模式?br />   * 具体子类定义是在J2EE的部|描q器中?br />   */

  public static CatalogDAO getDAO() throws CatalogDAOSysException {

    CatalogDAO catDao = null;

    try {

      InitialContext ic = new InitialContext();
      //动态装入CATALOG_DAO_CLASS
      //可以定义自己的CATALOG_DAO_CLASSQ从而在无需变更太多代码
      //的前提下Q完成系l的巨大变更?/p>

      String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);

      catDao = (CatalogDAO) Class.forName(className).newInstance();

    } catch (NamingException ne) {

      throw new CatalogDAOSysException("
        CatalogDAOFactory.getDAO: NamingException while
          getting DAO type : \n" + ne.getMessage());

    } catch (Exception se) {

      throw new CatalogDAOSysException("
        CatalogDAOFactory.getDAO: Exception while getting
          DAO type : \n" + se.getMessage());

    }

    return catDao;

  }

}


CatalogDAOFactory是典型的工厂ҎQcatDao是通过动态类装入器className获得CatalogDAOFactory具体实现子类Q这个实现子cdJava宠物店是用来操作catalog数据库,用户可以Ҏ数据库的cd不同Q定制自q具体实现子类Q将自己的子cdl与CATALOG_DAO_CLASS变量可以?/span>

由此可见Q工厂方法确实ؓpȝl构提供了非常灵zd大的动态扩展机Ӟ只要我们更换一下具体的工厂ҎQ系l其他地Ҏ需一点变换,有可能系l功能进行改头换面的变化?/p>

设计模式如何在具体项目中应用?a target="_blank">《Java实用pȝ开发指南?/font>

--------------------------------------------------------------------------------------------------------------------------------------------------------------

一个体现Java接口及工厂模式优点的例子(转蝲?a >http://www.jspcool.com/j2se/20071019225405.htm)

随着模式概念的普及,了解模式和用模式的E序员越来越多,很多人在学习模式的时候,都会有这样一U疑惑:“有必要搞得这么复杂吗Q?#8221;。的,因ؓ教程的例子过于简单化Q这h便读者学习)Q或者是作者选例子的时候ƈ没有很好体现所讲模式的优点Q很多情况下如果仅就其例子的问题来说Q用模式是太复杂了。因此才Dq样的误解:“模式是把简单的问题复杂化吗Q?#8221;。当然不是,随着你开发实늚不断丰富Q你l会发现模式强大威力Q而且模式也ƈ非贵族化的编E方式,它就是一些经q提g的解决问题的Ҏ技巧?

通过学习模式Q程序员开始告别过d直线式的代码方式Q模式开扩了我们的视野,强化了我们面向对象编E的思维方式。然而现在又出现了另一个普遍的问题Q盲目应用模式。模式是问题的解x案,先有问题才有模式Q模式是依附于所要解决的问题的而生的。必M解模式在很多情况下是以提高代码的复杂度ؓ代h来增强灵zL、可复用性。如果在自已的代码中使用某一模式仅只提高了代码的复杂度,而其它方面收效甚微,或者某部䆾代码Ҏ׃存在灉|性及高复用性的需求,那么我们没有必要ؓ使用模式而放弃更直观单的代码写法?

一的高手90%_֊x问题的解x案,因ؓ扑ֈ了好的解x案,再写起代码会很轻松代码也z流畅,看这L代码是一Un受和提高Q二的熟手90%_֊x代码实现Q因为问题的解决Ҏq最佻I实现的代码也会比较复杂;三流菜鸟记流水帐,90%_֊在敲键盘Q常常做了大半才发现行不通,回过头来再用90%的时间敲键盘Q根本不会用CQ何模式,写出来的代码的只有他自已才能看懂。做出来的Y件也是支ȝ,做一丁点改动都要大费周折Q而且你还不知道改动后会生什么问题,大有住危戉K的感觉?

在这里还是D一个滥用模式的例子吧。我曑֏与过一个大集团公司QApȝ的第二期开发,开发沿用原有代码架构ƈ增加新的功能模块。文档很我d代码时就被它E序里的代码转来转去搞得头大如斗Q最后读懂了Q原代码架构M采用工厂模式Q而且是最复杂的抽象工厂模式。它把所有模块类都通过工厂生成q工厂套工厂Qƈ且每一个模块类都有一个接口,每个接口也只有一个模块现实类Q因为涉及权限控制还用了代理(proxy)模式。 L代码后我开始嵌入代码,发现每新增一个类Q都要到六个Java文g中去增加相应代码Q而在cM每增加一个方法,也要到它的接口等四个Java文g中去增加相应代码。天呀Q!Q记得当时我的小姆指怼不听使唤Q就是因为频J的使用Ctrl+C 、Ctrl+VQ小姆指按着Ctrl键给累的。整个项目组苦不堪言Q真烦透了。项目结束后我回֏玎ͼ代理模式用得q对Q现在针Ҏ限这cL向控制有AOP~程q种新的解决办法了)但工厂模式在q里Ҏ是画蛇添Q不仅没有解决什么问题,反而增加代码复杂度和耦合性,降低了开发效率连l护隑ֺ都提高了。而且那种每个cȝ单的加一个接口的方式Q更是没有道理,q让我很惌周星驰说q的一句话Q?#8220;球~~~不是q么t~~~~的,接口~~~不是q么用~~~?#8221;。言归正传,我们先来看这样一个常见问题:某系l需要支持多U类型的数据库。用qOracle、MSSQL{数据库的h都知道,它们的SQL~写方式都各有些不同。比如说Oracle的唯一标识自动+1字段用的是序列,MSSQL改一下字D属性就成了Q还有各U各自特有的SQL用法。ؓ了支持多数据库,N我们要开发多套系l?当然NO。请看下面的解决Ҏ?

即然数据库存在多U,我们可以系l中所有对数据库的操作抽象出来Q写成一个个Ҏl合C个类中,有几U数据库我们写几个q样的类。具体设计类囑֦下:

 


要说明:
OracleDataOperate、SqlserverDataOperate、MysqlDataOperateQ分别代表Oracle、Sqlserver、Mysqlq三U数据库的操作类。承自AbstractDataOperate
AbstractDataOperate是一个抽象类Q包含了那些不同U类数据库都是一样代码的操作Ҏ。承自DataOperate
DataOperate是上面说的数据操作类的统一接口Q只有两个方法:取得一条记录、插入一条记录?
DataOperateFactory是一个工厂方法,l一用它的方法来得到数据库操作类的实例?
SampleClass是我们系l的某个功能模块的类?
People是一个实体类Q代表一条记录。三个字Dcoid唯一标识W、name姓名、date生日?

详细说明Q?
Q、所有系l功能模块类只认DataOperatq个接口q不必管具体的实现类是OracleDataOperateqSqlserverDataOperate。DataOperate源代码如下:
public interface DataOperate {
//Ҏ记录的唯一标识取出一条记?
People getPeople(String oid);
//插入一条记?
boolean insertPeople(People people);
}

Q、AbstractDataOperate、OracleDataOperate、SqlserverDataOperate、MysqlDataOperate都是l承DataOperate接口的,没什么好说的Q省略?

Q、DataOperateFactory。我们看看工厂方法怎么写的?
public class DataOperateFactory {
public static final int ORACLE = 0; //定义三个表示数据库类型的帔R
public static final int MYSQL = 1;
public static final int SQLSERVER = 2;

private static DataOperate db;
private static int dataType = MYSQL;
/**
* Ҏ数据库类?dataType)取得一个数据库操作cȝ实例Q?
* q里对DataOperate使用了单例模式,因ؓOracelDataOperate{都是无状态的工具c,
* 所以整个系l只保留一个实例就行了?
*
* @return q回的是接口Q客L不必兛_具体是用那个实现c?
*/
public static DataOperate getInstance() {
if (db == null) {
if (dataType == ORACLE) //ҎdateTypeq回相应的实现类
return new OracelDataOperate();
if (dataType == MYSQL)
return new MysqlDataOperate();
if (dataType == SQLSERVER)
return new SqlserverDataOperate();
}
return db;
}
}

Q、接下来q看用端是如何调用工厂方法和使用数据操作cȝ?
/**
* pȝ某个功能c?
*/
public class SampleClass {
private DataOperate db; //声明一个数据库操作c,注意q里用的是接口噢
/**某方?/
public void sampleMethod() {
db = DataOperateFactory.getInstance();//得到单一实例
People p = db.getPeople("123"); //取得一条记?
db.insertPeople(p);//再插回去
}
}

  我们发现SampleClass中根本没有出现OracelDataOperate、MysqlDataOperate{的影子Q这是接口的威力。客L不必针对OracelDataOperate{写不同的代码,它只兛_DataOperate卛_Q具体要取那个类的逻辑qDataOperateFactory负责了?

ȝQ?
从例子中我们可以看到什么是面向接口的编E方式。SampleClass使用数据操作cd以不必关心具体是那个c,只要是符合接口的都行
要实例?只须调用DataOperateFactory.getInstance()卛_Q其它的交于DataOperateFactoryq个工厂来做吧,使用端什么都不用兛_?
我们要支持新的数据库cdQ只要象OracelDataOperate那样Q再写一个承AbstractDataOperate的类卛_Q比如SysbaseDataOperate。然后到DataOperateFactory中加入相应代码即可?
如果我们惌可配|性更高,可以用private static int dataType = MYSQL;中的D|到一个文本文件中?
  对于开发支持多U数据库的系l,强烈使用hibernateQ我现在做的pȝ是用hibernate的,开发时用MysqlQ到要给客户时将数据库换了DB2Q程序不用做M改动Q真正的无逢移植。不q这P本文所提到的方法就没什么用?


 

q两是我找到的关于Factory Mode的文章,但是前面的论q很好,后面的例子却不怎么P特别是第二篇的例子ƈ不符合实际也没必要这样做Q纯_Ҏ接口也可以实玎ͼFactory Modeq没有体现多。第一的׃乎比较切实,但是说的也不够清晰?/p>

wjywilliam 2008-03-07 18:11 发表评论
]]>
java文g操作大全(Jsp?http://m.tkk7.com/wjywilliam/articles/122059.htmlwjywilliamwjywilliamTue, 05 Jun 2007 01:44:00 GMThttp://m.tkk7.com/wjywilliam/articles/122059.htmlhttp://m.tkk7.com/wjywilliam/comments/122059.htmlhttp://m.tkk7.com/wjywilliam/articles/122059.html#Feedback0http://m.tkk7.com/wjywilliam/comments/commentRss/122059.htmlhttp://m.tkk7.com/wjywilliam/services/trackbacks/122059.htmlJava文g操作大全

文g的徏?查与删除
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>文g的徏立、检查与删除</title>
</head>
<body>
<%
String path=request.getRealPath("");
//out.println(path);
File f=new File(path,"File.txt");
//out.println(f);
//out.println(f.exists());

if(f.exists()){//查File.txt是否存在
f.delete();//删除File.txt文g
out.println(path + "\\File.txt 存在Q已删除?);
}else{
f.createNewFile();//在当前目录下建立一个名为File.txt的文?
out.println(path + "\\File.txt 不存在,已徏立?);//输出目前所在的目录路径
}
%>

目录的徏?查与删除
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>目录的徏?查与删除</title>
</head>
<body>
<%
String path=request.getRealPath("");
path=path + "\\Sub";//要建立的目录\?
File d=new File(path);//建立代表Sub目录的File对象Qƈ得到它的一个引?
if(d.exists()){//查Sub目录是否存在
d.delete();
out.println("Sub目录存在Q已删除");
}else{
d.mkdir();//建立Sub目录
out.println("Sub目录不存在,已徏?);
}
%>
</body>
</html>


如何在JSP中处理虚拟目?br><%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>JSP中如何处理虚拟目?lt;/title>
</head>
<body>
取得虚拟目录对应的磁盘\?lt;br>
Web站点ȝ录的位置?lt;font color=#ff0000><%=request.getRealPath("/")%></font><br>
JSP|页所在的目录位置<font color=#ff0000><%=request.getRealPath("./")%></font><br>
JSP|页所在目录上一层目录的位置<font color=#ff0000><%=request.getRealPath("../")%></font><br>
</body>
</html>


文g属性的取得
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date,java.io.*"%>
<html>
<head>
<title>文g属性的取得</title>
</head>
<body>
<%
String path=request.getRealPath("/");
File f=new File(path,"ReadData.txt");
if(f.exists()){
%>
<%=f.getName()%>的属性如下:<br><br>
文g长度为:<%=f.length()%>
<%=f.isFile()?"是文?:"不是文g"%><br>
<%=f.isDirectory()?"是目?:"不是目录"%><br>
<%=f.canRead()?"可读?:"不可d"%><br>
<%=f.canWrite()?"可写?:"不可写入"%><br>
<%=f.isHidden()?"是隐藏文?:"不是隐藏文g"%><br>
文g的最后修Ҏ期ؓQ?lt;%=new Date(f.lastModified())%><br>
<%
}else{
f.createNewFile();//在当前目录下建立一个名为ReaData.txt的文?
%>
<%=f.getName()%>的属性如下:<br><br>
文g长度为:<%=f.length()%>
<%=f.isFile()?"是文?:"不是文g"%><br>
<%=f.isDirectory()?"是目?:"不是目录"%><br>
<%=f.canRead()?"可读?:"不可d"%><br>
<%=f.canWrite()?"可写?:"不可写入"%><br>
<%=f.isHidden()?"是隐藏文?:"不是隐藏文g"%><br>
文g的最后修Ҏ期ؓQ?lt;%=new Date(f.lastModified())%><br>
<%
}
%>
</body>
</html>


取出目录中文件的Ҏ
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>取出目录中文件的Ҏ--列出目录中的文g</title>
</head>
<body>
<%
String path=request.getRealPath("/");
File d=new File(path);//建立当前目录中文件的File对象
File list[]=d.listFiles();//取得代表目录中所有文件的File对象数组
out.println("<font color=#ff0000>" + path + "目录下的文gQ?lt;/font><br>");
for(int i=0;i<list.length;i++){
if(list<I>.isFile()){
out.println(list<I>.getName() + "<br>");
}
}
out.println("<br><font color=#ff0000>" + path + "目录下的目录Q?lt;/font><br>");
for(int i=0;i<list.length;i++){
if(list<I>.isDirectory()){
out.println(list<I>.getName() + "<br>");
}
}
%>
</body>
</html>


判断是否为空白文?br><%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>判断是否为空白文?lt;/title>
</head>
<body>
<%
String path=request.getRealPath("/");
out.println(path);
FileReader fr=new FileReader(path + "\\AtEnd.txt");//建立FileReader对象Qƈ实例化ؓfr
//对FileReadercȝ成的对象使用read()ҎQ可以从字符中d下一个字W?
if(fr.read()==-1)//判断是否已读到文件的l尾
{
out.print("AtEnd.txt文g中没有数?lt;br>");
}else{
out.println("AtEnd.txt文g中有数据");
}
fr.close();
%>
</body>
</html>


d所有的文g数据
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*,java.lang.*"%>
<html>
<head>
<title>d所有的文g数据</title>
</head>
<body>
<%
String path=request.getRealPath(".");
FileReader fr=new FileReader(path + "\\ReadData.txt");
//关键在于dq程中,要判断所d的字W是否已l到了文件的末尾Qƈ且这个字W是不是文g中的断行W,卛_断该字符值是否ؓ13?
int c=fr.read();//从文件中d一个字W?
//判断是否已读到文件结?
while(c!=-1){
out.print((char)c);//输出d的数?
c=fr.read();//从文件中l箋d数据
if(c==13){//判断是否为断行字W?
out.print("<br>");//输出分行标签
fr.skip(1);//略过一个字W?
//c=fr.read();//d一个字W?
}
}
fr.close();
%>
</body>
</html>


一行一行读取数?
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>文gd</title>
</head>
<body>
<%
String path=request.getRealPath("");//取得当前目录的\?
FileReader fr=new FileReader(path + "\\file\\inc\\t.txt");//建立FileReader对象Qƈ实例化ؓfr
BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象Qƈ实例化ؓbr
String Line=br.readLine();//从文件读取一行字W串
//判断d到的字符串是否不为空
while(Line!=null){
out.println(Line + "<br>");//输出从文件中d的数?
Line=br.readLine();//从文件中l箋d一行数?
}
br.close();//关闭BufferedReader对象
fr.close();//关闭文g
%>
</body>
</html>


略过文g中的字符不读?
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>略过字节不读?lt;/title>
</head>
<body>
<%
String path=request.getRealPath(".");
FileReader fr=new FileReader(path + "\\ReadData.txt");
fr.skip(2);//跌2个字?
int c=fr.read();//d一个字?
while(c!=-1){
out.print((char)c);
c=fr.read();
}
fr.close();
%>
</body>
</html>


数据写入文?
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>数据写入文?lt;/title>
</head>
<body>
<%
String path=request.getRealPath(".");
FileWriter fw=new FileWriter(path + "\\WriteData.txt");//建立FileWriter对象Qƈ实例化fw
//字W串写入文g
fw.write("大家好!");
fw.write("本书是《JSP~程技巧?);
fw.write("请多多指教!");
fw.write("email:stride@sina.com");
fw.close();

FileReader fr=new FileReader(path + "\\WriteData.txt");
BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象Qƈ实例化ؓbr
String Line=br.readLine();
//d一行数?
out.println(Line + "<br>");
br.close();//关闭BufferedReader对象
fr.close();
%>
</body>
</html>


写入文件的数据分行
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>写入文件的数据分行</title>
</head>
<body>
<%
String path=request.getRealPath(".");
FileWriter fw=new FileWriter(path + "\\WriteData.txt");
BufferedWriter bw=new BufferedWriter(fw);
bw.write("大家好!");
bw.write("本书是《JSP~程技巧》?);
bw.newLine();//断行
bw.write("请多多指教!");
bw.newLine();//断行
bw.write("email: stride@sina.com");
bw.flush();//数据更新至文g
fw.close();//关闭文g?
out.println("写入文g内容为:<br>");
FileReader fr=new FileReader(path + "\\WriteData.txt");
BufferedReader br=new BufferedReader(fr);
String Line=br.readLine();//d一行数?
while(Line!=null){
out.println(Line + "<br>");
Line=br.readLine();
}
fr.close();
%>
</body>
</html>

如何数据追加写入到文g
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>写入文件的数据分行</title>
</head>
<body>
<%
String path=request.getRealPath(".");
RandomAccessFile rf=new RandomAccessFile(path + "\\WriteData.txt","rw");//定义一个类RandomAccessFile的对象,q实例化
rf.seek(rf.length());//指针移动到文g末尾
rf.writeBytes("\nAppend a line to the file!");
rf.close();//关闭文g?
out.println("写入文g内容为:<br>");
FileReader fr=new FileReader(path + "\\WriteData.txt");
BufferedReader br=new BufferedReader(fr);//d文g的BufferedRead对象
String Line=br.readLine();
while(Line!=null){
out.println(Line + "<br>");
Line=br.readLine();
}
fr.close();//关闭文g
%>
</body>
</html></I></I></I></I>



wjywilliam 2007-06-05 09:44 发表评论
]]>
Java的IOpȝ基本应用http://m.tkk7.com/wjywilliam/articles/109042.htmlwjywilliamwjywilliamFri, 06 Apr 2007 16:01:00 GMThttp://m.tkk7.com/wjywilliam/articles/109042.htmlhttp://m.tkk7.com/wjywilliam/comments/109042.htmlhttp://m.tkk7.com/wjywilliam/articles/109042.html#Feedback0http://m.tkk7.com/wjywilliam/comments/commentRss/109042.htmlhttp://m.tkk7.com/wjywilliam/services/trackbacks/109042.htmlJava的IOpȝ基本应用

 

1. stream
stream代表的是M有能力出数据的数据源,或是M有能力接收数据的接收源。在Java的IO中,所有的streamQ包括Input和Out streamQ都包括两种cdQ?br> 
 1.1 以字节ؓ导向的stream
 以字节ؓ导向的streamQ表CZ字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种cdQ?br> 1) input streamQ?br> 1) ByteArrayInputStreamQ把内存中的一个缓冲区作ؓInputStream使用
 2) StringBufferInputStreamQ把一个String对象作ؓInputStream
 3) FileInputStreamQ把一个文件作为InputStreamQ实现对文g的读取操?br> 4) PipedInputStreamQ实Cpipe的概念,主要在线E中使用
 5) SequenceInputStreamQ把多个InputStream合ƈZ个InputStream
 2) Out stream
 1) ByteArrayOutputStreamQ把信息存入内存中的一个缓冲区?br> 2) FileOutputStreamQ把信息存入文g?br> 3) PipedOutputStreamQ实Cpipe的概念,主要在线E中使用
 4) SequenceOutputStreamQ把多个OutStream合ƈZ个OutStream
 
 1.2 以Unicode字符为导向的stream
 以Unicode字符为导向的streamQ表CZUnicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种cdQ?br> 1) Input Stream
 1) CharArrayReaderQ与ByteArrayInputStream对应
 2) StringReaderQ与StringBufferInputStream对应
 3) FileReaderQ与FileInputStream对应
 4) PipedReaderQ与PipedInputStream对应
 2) Out Stream
 1) CharArrayWriteQ与ByteArrayOutputStream对应
 2) StringWriteQ无与之对应的以字节为导向的stream
 3) FileWriteQ与FileOutputStream对应
 4) PipedWriteQ与PipedOutputStream对应
 以字Wؓ导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。如CharArrayReaderQ和ByteArrayInputStream的作用都是把内存中的一个缓冲区作ؓInputStream使用Q所不同的是前者每ơ从内存中读取一个字节的信息Q而后者每ơ从内存中读取一个字W?br> 
 1.3 两种不现导向的stream之间的{?br> InputStreamReader和OutputStreamReaderQ把一个以字节为导向的stream转换成一个以字符为导向的stream?br> 
 2. streamd属?br> 
 2.1 “为streamd属?#8221;的作?br> q用上面介绍的Java中操作IO的APIQ我们就可完成我们想完成的Q何操作了。但通过FilterInputStream和FilterOutStream的子c,我们可以为streamd属性。下面以一个例子来说明q种功能的作用?br> 如果我们要往一个文件中写入数据Q我们可以这h作:
 FileOutStream fs = new FileOutStream(“test.txt”);
 然后可以通过产生的fs对象调用write()函数来往test.txt文g中写入数据了。但是,如果我们惛_?#8220;先把要写入文件的数据先缓存到内存中,再把~存中的数据写入文g?#8221;的功能时Q上面的API没有一个能满我们的需求了。但是通过FilterInputStream和FilterOutStream的子c,为FileOutStreamd我们所需要的功能?br> 
 2.2 FilterInputStream的各U类?br> 
 2.2.1 用于装以字节ؓ导向的InputStream
 1) DataInputStreamQ从stream中读取基本类型(int、char{)数据?br> 2) BufferedInputStreamQ用缓冲区
 3) LineNumberInputStreamQ会记录input stream内的行数Q然后可以调用getLineNumber()和setLineNumber(int)
 4) PushbackInputStreamQ很用刎ͼ一般用于编译器开?br> 
 2.2.2 用于装以字Wؓ导向的InputStream
 1) 没有与DataInputStream对应的类。除非在要用readLine()时改用BufferedReaderQ否则用DataInputStream
 2) BufferedReaderQ与BufferedInputStream对应
 3) LineNumberReaderQ与LineNumberInputStream对应
 4) PushBackReaderQ与PushbackInputStream对应
 
 2.3 FilterOutStream的各U类?br> 
 2.2.3 用于装以字节ؓ导向的OutputStream
 1) DataIOutStreamQ往stream中输出基本类型(int、char{)数据?br> 2) BufferedOutStreamQ用缓冲区
 3) PrintStreamQ生格式化输出
 
 2.2.4 用于装以字Wؓ导向的OutputStream
 1) BufferedWriteQ与对应
 2) PrintWriteQ与对应
 
 3. RandomAccessFile

 1) 可通过RandomAccessFile对象完成Ҏ件的d操作
 2) 在生一个对象时Q可指明要打开的文件的性质QrQ只读;wQ只写;rw可读?br> 3) 可以直接跛_文g中指定的位置
 
 4. I/O应用的一个例?br>
 import java.io.*;
 public class TestIO{
 public static void main(String[] args)
 throws IOException{
 //1.以行为单位从一个文件读取数?/font>
 BufferedReader in =
 new BufferedReader(
 new FileReader("F:\\nepalon\\TestIO.java"));
 String s, s2 = new String();
 while((s = in.readLine()) != null)
 s2 += s + "\n";
 in.close();
 
 //1b. 接收键盘的输?br> BufferedReader stdin =
 new BufferedReader(
 new InputStreamReader(System.in));
 System.out.println("Enter a line:");
 System.out.println(stdin.readLine());
 
 //2. 从一个String对象中读取数?/font>
 StringReader in2 = new StringReader(s2);
 int c;
 while((c = in2.read()) != -1)
 System.out.println((char)c);
 in2.close();
 
 //3. 从内存取出格式化输入
 try{
 DataInputStream in3 =
 new DataInputStream(
 new ByteArrayInputStream(s2.getBytes()));
 while(true)
 System.out.println((char)in3.readByte());
 }
 catch(EOFException e){
 System.out.println("End of stream");
 }
 
 //4. 输出到文?br> try{
 BufferedReader in4 =
 new BufferedReader(
 new StringReader(s2));
 PrintWriter out1 =
 new PrintWriter(
 new BufferedWriter(
 new FileWriter("F:\\nepalon\\ TestIO.out")));
 int lineCount = 1;
 while((s = in4.readLine()) != null)
 out1.println(lineCount++ + "Q? + s);
 out1.close();
 in4.close();
 }
 catch(EOFException ex){
 System.out.println("End of stream");
 }
 
 //5. 数据的存储和恢复
 try{
 DataOutputStream out2 =
 new DataOutputStream(
 new BufferedOutputStream(
 new FileOutputStream("F:\\nepalon\\ Data.txt")));
 out2.writeDouble(3.1415926);
 out2.writeChars("\nThas was pi:writeChars\n");
 out2.writeBytes("Thas was pi:writeByte\n");
 out2.close();
 DataInputStream in5 =
 new DataInputStream(
 new BufferedInputStream(
 new FileInputStream("F:\\nepalon\\ Data.txt")));
 BufferedReader in5br =
 new BufferedReader(
 new InputStreamReader(in5));
 System.out.println(in5.readDouble());
 System.out.println(in5br.readLine());
 System.out.println(in5br.readLine());
 }
 catch(EOFException e){
 System.out.println("End of stream");
 }
 
 //6. 通过RandomAccessFile操作文g
 RandomAccessFile rf =
 new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
 for(int i=0; i<10; i++)
 rf.writeDouble(i*1.414);
 rf.close();
 
 rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
 for(int i=0; i<10; i++)
 System.out.println("Value " + i + "Q? + rf.readDouble());
 rf.close();
 
 rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
 rf.seek(5*8);
 rf.writeDouble(47.0001);
 rf.close();
 
 rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
 for(int i=0; i<10; i++)
 System.out.println("Value " + i + "Q? + rf.readDouble());
 rf.close();
 }
 }
 
 关于代码的解释(以区为单位)Q?/strong>
 1ZQ当d文gӞ先把文g内容d~存中,当调用in.readLine()Ӟ再从~存中以字符的方式读取数据(以下U?#8220;~存字节d方式”Q?br> 1bZQ由于想以缓存字节读取方式从标准IOQ键盘)中读取数据,所以要先把标准IOQSystem.inQ{换成字符导向的streamQ再q行BufferedReader装?br> 2ZQ要以字W的形式从一个String对象中读取数据,所以要产生一个StringReadercd的stream?br> 4ZQ对String对象s2d数据Ӟ先把对象中的数据存入~存中,再从~冲中进行读取;对TestIO.out文gq行操作Ӟ先把格式化后的信息输出到~存中,再把~存中的信息输出到文件中?br> 5ZQ对Data.txt文gq行输出Ӟ是先把基本类型的数据输出屋缓存中Q再把缓存中的数据输出到文g中;Ҏ件进行读取操作时Q先把文件中的数据读取到~存中,再从~存中以基本cd的Ş式进行读取。注意in5.readDouble()q一行。因为写入第一个writeDouble()Q所以ؓ了正显C。也要以基本cd的Ş式进行读取?br> 6区是通过RandomAccessFilecd文gq行操作?/p>



wjywilliam 2007-04-07 00:01 发表评论
]]>
眀h文集之数据格式化1.0http://m.tkk7.com/wjywilliam/articles/109039.htmlwjywilliamwjywilliamFri, 06 Apr 2007 15:56:00 GMThttp://m.tkk7.com/wjywilliam/articles/109039.htmlhttp://m.tkk7.com/wjywilliam/comments/109039.htmlhttp://m.tkk7.com/wjywilliam/articles/109039.html#Feedback0http://m.tkk7.com/wjywilliam/comments/commentRss/109039.htmlhttp://m.tkk7.com/wjywilliam/services/trackbacks/109039.html阅读全文

wjywilliam 2007-04-06 23:56 发表评论
]]>
վ֩ģ壺 ɫ˵| Ʒަv| ޾Ʒþþþȥq| ŷa߹ۿ| 91ѹۿ| AVһ| պþëƬ | ޸Ӱ߹ۿ| 99Ƶ߹ۿ| Ļպ| þþƷվ| ɫƷaһ| wwwѲƵ| ޾Ʒ߳ˮ| 91ƵƷȫѹۿ| ͵͵͵ɫ| fc2ѹƵ18| һ߲ | Ʒѿþþþ| ţƷ޳avƬ| ڵĤѿ| ٶ100%ڵѹۿ| ҹ³˿ƬAV| þþƷAVӰ| һƷƵ| ҰƵѹۿȫ| ޼Ƶ| baoyu122.Ƶ| ޸պƷһ| ֻ߿avƬ| Ʒavɫ| ҹ㽶Ƭ| ĻѸ| ƷAVһ| ĻӰԺѹۿ| ɫƷVRһ| Ļȫ| һһͰһƵ| avƷ| Ʒ| þùƷ|