Posts Tagged ‘文件’

asp.net(c#)中取得文件物理路径

星期二, 06月 3rd, 2008

最近突然需要用到取得文件物理路径,找了下,这个不错
asp.net(c#)在实际应用中,经常需要将虚拟路径转换为实际路径.Request对象deMapPath方法可以解决该问题.下面de例子显示MapPath方法de使用.
[复制此相关代码]CODE:
<script language=”c#” runat=”server”>
void Page_Load(Object sender,EventArgs e)
{
Response.Write(Request.MapPath(”~”));
}
</script>

获取转向地址的URL的源文件(可自定义REFER)

星期二, 06月 3rd, 2008

软件下载:
http://test.fzclx.com/caixi/geturl.rar

程式源文件:
CS打包:http://test.fzclx.com/caixi/geturl.cs.rar

c#写de,可能要先安装framework.
http://www.microsoft.com/downloads/info.aspx?na=0&p=4&SrcDisplayLang=zh-cn&SrcCategoryId=&SrcFamilyId=&genscs=&u=/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&displaylang=zh-cn

下面是相关代码:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.IO;
namespace WindowsApplication4
{
/// <summary>
/// Form1 de摘要说明.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox realurl;
private System.Windows.Forms.TextBox formurl;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox formreferer;
private System.Windows.Forms.Panel panel1;
/// <summary>
/// 必需de设计器变量.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 窗体设计器支持所必需de
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数相关代码
//
}
/// <summary>
/// 清理所有正在使用de资源.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows 窗体设计器生成de相关代码
/// <summary>
/// 设计器支持所需de方法 - 不要使用相关代码编辑器修改
/// 此方法de内容.
/// </summary>
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
this.formurl = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.realurl = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.formreferer = new System.Windows.Forms.TextBox();
this.panel1 = new System.Windows.Forms.Panel();
this.SuspendLayout();
//
// formurl
//
this.formurl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.formurl.ForeColor = System.Drawing.SystemColors.WindowText;
this.formurl.Location = new System.Drawing.Point(24, 32);
this.formurl.Name = "formurl";
this.formurl.Size = new System.Drawing.Size(288, 21);
this.formurl.TabIndex = 0;
this.formurl.Text = "http://";
this.formurl.TextChanged = new System.EventHandler(this.formurl_TextChanged);
//
// label2
//
this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.label2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.label2.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(134)));
this.label2.Location = new System.Drawing.Point(24, 16);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(128, 17);
this.label2.TabIndex = 2;
this.label2.Text = "输入您要获取de网址:";
this.label2.Click = new System.EventHandler(this.label2_Click);
//
// button1
//
this.button1.ForeColor = System.Drawing.Color.FromArgb(((System.Byte)(64)), ((System.Byte)(64)), ((System.Byte)(64)));
this.button1.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.button1.Location = new System.Drawing.Point(320, 32);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(56, 64);
this.button1.TabIndex = 3;
this.button1.Text = "获取…";
this.button1.Click = new System.EventHandler(this.button1_Click);
//
// label1
//
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.label1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(134)));
this.label1.Location = new System.Drawing.Point(24, 104);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(128, 17);
this.label1.TabIndex = 5;
this.label1.Text = "真实de网址:";
this.label1.Click = new System.EventHandler(this.label1_Click);
//
// realurl
//
this.realurl.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.realurl.ForeColor = System.Drawing.Color.OrangeRed;
this.realurl.Location = new System.Drawing.Point(24, 120);
this.realurl.Name = "realurl";
this.realurl.Size = new System.Drawing.Size(352, 21);
this.realurl.TabIndex = 4;
this.realurl.Text = "";
//
// label3
//
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.label3.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(134)));
this.label3.Location = new System.Drawing.Point(24, 56);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(128, 17);
this.label3.TabIndex = 7;
this.label3.Text = "伪装来路:";
//
// formreferer
//
this.formreferer.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.formreferer.Location = new System.Drawing.Point(24, 72);
this.formreferer.Name = "formreferer";
this.formreferer.Size = new System.Drawing.Size(288, 21);
this.formreferer.TabIndex = 6;
this.formreferer.Text = "http://";
//
// panel1
//
this.panel1.BackColor = System.Drawing.Color.LightGray;
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel1.Location = new System.Drawing.Point(18, 13);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(364, 130);
this.panel1.TabIndex = 8;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
this.ClientSize = new System.Drawing.Size(392, 165);
this.Controls.Add(this.label3);
this.Controls.Add(this.formreferer);
this.Controls.Add(this.label1);
this.Controls.Add(this.realurl);
this.Controls.Add(this.button1);
this.Controls.Add(this.label2);
this.Controls.Add(this.formurl);
this.Controls.Add(this.panel1);
this.Name = "Form1";
this.Text = "取得真实URL — 落伍decaixi www.im286.com";
this.Load = new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// 应用程序de主入口点.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void Form1_Load(object sender, System.EventArgs e)
{
}
private void label2_Click(object sender, System.EventArgs e)
{
}
private void button1_Click(object sender, System.EventArgs e)
{
string Theurl=formurl.Text;
string Referurl=formreferer.Text;
if (Theurl.Length<10)
{
MessageBox.Show("兄弟,URL不正确吧","URL不正确");
formurl.Focus();
}
else
{
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(Theurl);
myReq.Referer=Referurl;
HttpWebResponse myres=(HttpWebResponse)myReq.GetResponse();
bool hasChanged = (myReq.RequestUri != myReq.Address);
string geturl;
if (hasChanged){
geturl=myReq.Address.ToString();
}
else{
geturl=myReq.RequestUri.ToString();
}
realurl.Text=geturl;
realurl.Focus();
}
}
private void label1_Click(object sender, System.EventArgs e)
{
}
private void formurl_TextChanged(object sender, System.EventArgs e)
{
}
}
}

让你的.NET程序兼容不同版本的Dll文件

星期二, 06月 3rd, 2008

前段时间写de一个WinFormde.NET程序.因为引用了不少de库文件,但是最近这些库文件因为修正了一些Bug和算法.但是主de程序文件没有怎么改动.所以就不像把这个主程序重新编译了.于是就把所有de新版DLL文件拷贝到运行目录下,希望主程序能够直接调用新版de库文件.结果发现原来这些库文件都用Strong Name签了名de.主程序一调用就出错,说找不到该版本de文件.

后来查了一下MSDN,发现只要在config里面加入runtime节点就可以了.

<runtime>
<assemblyBinding xmlns=”urn:schemas-microsoft-com:asm.v1″>
<dependentAssembly>
<assemblyIdentity name=”MyAssembly”
publicKeyToken=”2b7c3a3291de04″
culture=”neutral” />
<bindingRedirect oldVersion=”3.0.0.8″
newVersion=”4.1.0.0″/>
</dependentAssembly>
</assemblyBinding>
</runtime>

不过这有个前提条件就是这两个DLLdePublicKeyToken是一样de,就是需要用同一个sn文件签名de才行.

当然如果您de库文件根本就没有用Strong Name签名de话,就不用考虑版本问题了.

ASP.NET设计网络硬盘之文件夹实现

星期二, 06月 3rd, 2008

在介绍“网络硬盘”概念时已经提到,每个用户在“网络硬盘”上都有自己de一块空间.在下面程序设计中是这样处理de:为用户提供一个固定de文件夹,在这个文件夹下用户可以自己增加/删除新de文件夹或文件.如图1所示,首次打开网页时将列出该文件夹下de所有内容(包括文件和文件夹).如果想进入下一级文件夹,可以选中该文件夹,单击“打开”按钮进入.下面将就查看文件夹内容功能de实现分步骤进行说明.


图1 用户主界面

  1. 页面加载
  由于程序所提供de用户目录是固定de,如c:\UserDir,而且要求在页面加载后显示该文件夹所有内容,所以需要在Page_Load中进行相应操作:首先要判断该文件夹是否存在,如果不存在需要先创建它;然后再列出该文件夹下de内容,其相关代码实现如下:
private void Page_Load(object sender, System.EventArgs e)
{
 // 在此处放置用户相关代码以初始化页面
 if(Page.IsPostBack==false)
 {
  CurrentPath= @”c:\UserDir\”; //设置当前目录
  if(Directory.Exists(@”c:\UserDir\”)==false) //若该目录不存在,创建该目录
   Directory.CreateDirectory(@”c:\UserDir\”);
   LoadDir(CurrentPath); //初始化装入目录
 }
}

  LoadDir(string FullPath)方法用来列出该文件夹下de所有内容,其相关代码如下:
private void LoadDir(string FullPath)
{
 CurrentPath=FullPath;
 ArrayList values = new ArrayList();
 string [] MyFiles,MyDirs;
 MyFiles = Directory.GetFiles(FullPath); //得到该目录下所有文件
 if(CurrentPath!=@”c:\UserDir”) //若不是顶级目录,增加“返回上级目录”选项 {
  values.Add(”返回上级目录”);
 }
 values.AddRange(MyFiles); //加入文件
 MyDirs= Directory.GetDirectories(FullPath); //得到该目录下所有目录
 values.AddRange(MyDirs); //加入目录
 FileList.DataSource=values; //设置数据源
 FileList.DataBind(); //绑定数据
}

  首先要定义一个ArrayList数组对象values,用以存放顶级目录下de所有内容(包括文件夹名和文件名).Directory.GetFiles()方法返回顶级目录下de所有文件名,其返回类型为一个string数组,故需要定义一个string类对象MyFiles来保存返回de文件名;Directory.GetDirectories()返回顶级目录下de所有文件夹名称,同样定义一个string数组对象MyDirs来保存它们.完成这些后就可以把MyFiles和MyDirs数组添加进values对象了.最后要做de只是为ListBox控件对象FileList添加数据源和绑定数据.有一点需要说明:如果当前目录不是顶级目录,则需要能返回到上级目录,为此需要在FileList中添加“返回上级目录”选项.
  2. 多级目录查看
  通过上一部分列出de两段相关代码,就可以完成在页面加载时列出顶级目录下de所有内容.当然列出顶级目录下de内容还是不够de,和Windows操作系统类似,网络硬盘中文件夹目录也是嵌套de,存在二级或者多级文件夹目录.为此要进行一些相应de处理,使得用户可以查看多级文件夹目录内容.前面界面设计中提供了一个“打开”按钮,用户选择相应de文件夹后,单击该按钮就可以查看该文件夹下de内容.
  下面就为“打开”按钮添加相关代码.在“设计”面板中双击该按钮,系统就会自动为其添加事件,其相关代码内容如下:
private void btnOpen_Click(object sender, System.EventArgs e)
{
 if(FileList.SelectedItem.Text==”返回上级目录”) //返回上级目录
 {
  string ParentPath=Directory.GetParent(CurrentPath).ToString();
  LoadDir(ParentPath);
  return;
 }
 else //打开目录
 {
  LoadDir(FileList.SelectedItem.Text);
 }
}

  程序首先判断用户选中de是不是“返回上级目录”.如果是de话,则要先通过Directory.GetParent()方法返回上级文件夹名称,然后再调用LoadDir()方法来显示该目录下de内容;如果用户选中de不是“返回上级目录”而是一个文件夹名称,则可以直接调用LoadDir()方法,FileList.SelectedItem.Text为选中de文件夹名,用来作为LoadDir()方法de参数.

ASP.NET2.0:页面中链入的CSS、js文件带中文时需注意

星期二, 06月 3rd, 2008

  当定义de样式中有中文时,如 .sometyle {font-family:@黑体;},如果书写不正确,如写成 .sometyle {font-family: 黑体;},这应该是个错误de写法,这样不仅这个样式不起作用,而且还会影响到定义在它后面de样式起作用,不知道对cssde解析本来就是这个规则,还是ASP.NET 2.0de问题.

  当您直接把从网上download下来dejs文件加入deVS2005项目中时,如果此文件中带中文,当您调用其方法时,就会出现对象找不到dejs错误,就像您没有链如该文件一样.您需要在项目中新建一个js文件,然后把您down下来de文件中de相关代码copy进这个新文件,然后使用这个新建de文件.这个问题应该是文件编码de问题.

  另外,ASP.NET2.0 采用de是XHTML 1.0标准,而之前1.x是HTML 4.0, 从两者HTML源文件头中可以看出

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN” >

  所以定义元素是要符合XHTML 1.0规范,比如长度都要加好单位,如width:100px;width:100不起作用.

ASP.NET技巧:同时对多个文件进行大量写操作对性能优化

星期二, 06月 3rd, 2008

  我自己de一个项目,需要同时对65536个文件进行多次写操作.

  如果先全部打开所有de文件,然后重复写,最后关闭所有de文件.那么第一次写操作全部完成需要16分钟左右,而第二次就需要40分钟了.没有继续测试了.

for (int i = 0; i < 65536; i )
{
fileStream[i] = new FileStream(buffDir “\\” i.ToString() “.dat”, FileMode.Create,FileAccess.Write, FileShare.Write,14000);
}
write;
write;
write;
……..
for (int i = 0; i < 65536; i )
{
fileStream[i] .close();
}

  如果在写操作de时候只打开相应de一个文件,写完关闭.那么所有写操作完成只要2分30秒左右.

  循环


for (int i=0;i<65536;i )
{
open;
write;
close;
}

  由此可见,第二种办法性能要远大于第一种.一次打开所有de文件,需要占用不小de内存,最主要de是.net在处理filestream de时候,可能要进行大量de内存分配和回收等工作,消耗了大量内存和资源.

  另外我也做个测试,如果文件数目比较小,那么第一种de性能又要大大好于第二种.

ASP.NET数据库编程之处理文件访问许可

星期二, 06月 3rd, 2008

  一个MDB数据库就是硬盘上de另外一个文件,所以,像其他文件一样,它也将遇到相同de文件访问许可问题.这个问题de意思是为了读取(和写入,就像您将要在本书de后面看到de那样)数据库文件,页面中所运行de应用程序必须具有相关许可才可以在Windows中读取(和写入)该文件.
  到目前为止,示例中de页面都能够“正常运行”de原因就是您使用de是VWD Web Server,一个在运行VWDde用户de身份下运行de轻量级程序.这就是说,VWD Web Server为您而运行,并且您已经被允许读取和写入页面连接deMDB文件.
  但是,当在IIS下运行页面时,情况就有一点复杂了.此时,ASP.NET页面运行于一个具有特定权限限制de用户账户de身份之下.在IIS 5.1之下,这个账户是“ASPNET”.在IIS 6.0或更高版本下,这个账户是“Network Service”,属于一个称为IIS_WPG(“worker process group”)deWindows用户组.为了在IIS下使用Access数据库,这些账户都必须授予对包含了MDB文件de目录进行读取de许可以及按情况授予写入de许可.
  为了帮助您创建这些许可,当数据库处于应用程序根目录之下deApp_Data子目录下时,VWD将执行额外de步骤并自动地将这个许可授予ASPNET或者 Network Service账户.假如您正在使用VWD来开发机器上de页面,这个特定de目录就一直会被授予正确de许可.App_Data目录还有另外de好处,例如防止其中de任何文件响应发出请求deWeb浏览器.这就是说将MDB文件放入应用程序de本地App_Data目录之后,就可以保护这些文件不被应用程序de客户端无意或有意地下载了.所以,我极力推荐将MDB文件保存至App_Data目录中.
  如果必须将MDB文件保存至其他de地方,或者需要手动指定数据库目录de许可(例如,您正工作于一台远程Web服务器),那么可以使用Windows来为ASP.NET和/或 Network Service账户配置许可.
  如需手动设置许可,请按如下步骤执行:
  (1) 使用Windows Explorer浏览MDB文件所在de文件夹.
  (2) 右键单击这个目录并选择Properties.
  (3) 选择Security标签并单击Add按钮.
  (4) 添加本地deASP.NET账户(IIS 5.1) 或者IIS_WPG组(IIS 6).
  (5) 单击OK;然后将相关许可应用至这个目录.
  如需获得更多信息,请参阅名为“Running ASP.NET 1.1和IIS 6.0”de白皮书,可以从ASP.NETdeWeb站点:http://www.asp.net/faq/AspNetAndIIS6.aspx上获得该白皮书.

ASP.NET通过Remoting service上传文件

星期二, 06月 3rd, 2008

最近在因为在学习Remoting,纯粹只是了解一下,发现Remoting确实是好东西.

我通常有三种方式来使用remoting,一种是

第一种:Publishing a public object
公开de对象创建在本地
第二种:Remote creation of a public object (SAO)
对象创建在客户端请求中
第三种:Remote creation of a private object (CAO)
对象创建在HOST上,客户端引用服务器上de对象

目次我也没有很好理解这三种de本质区别在哪里.而这三种方式deremoting创建方式也不相同.

第一种方式
Host:
ChannelServices.RegisterChannel (new TcpChannel(1500));
cTransfer Trans = new cTransfer();
RemotingServices.Marshal (Trans, “TestService”);Client:
cTransfer T = (cTransfer) Activator.GetObject(typeof(cTransfer),
“tcp://host:1500/TestService”);
第二种方式
Host:
ChannelServices.RegisterChannel (new TcpChannel(1500));
RemotingConfiguration.RegisterWellKnownServiceType(typeof(cTransfer),
“TestService”, WellKnownObjectMode.Singleton);Client:
cTransfer T = (cTransfer) Activator.GetObject(typeof(cTransfer),
“tcp://host:1500/TestService”);
第三种方式
Host:
ChannelServices.RegisterChannel (new TcpChannel(1500));
RemotingConfiguration.RegisterActivatedServiceType(typeof(cTransfer));Client:
object[] attr = {new UrlAttribute(”tcp://host:1500″)};
object[] args = {”Sample constructor argument”};
cTransfer T = (cTransfer) Activator.CreateInstance(typeof(cTransfer), args, attr);
如果我需要一个对象(object)允许远程调用处理,那么这个对象(object)需要继承于MarshalByRefObject这个类.

如何在remoting中传送文件呢?基本思路就是在client打开clientde文件,转换在Byte[]类型之后调用hostde对象.
Client与Host之间传送de对象
[Serializable]
public struct kAction
{
public string filename;
public byte[] context;
};打开文件,将流字节保存到Context中去
Stream fileStream=File.Open(this.transFileName.Text,FileMode.Open);
fileStream.Position=0;
byte[] Content = new byte[((int) fileStream.Length) 1];
fileStream.Read(Content,0,Content.Length) ;
在Host在读取到Kaction之后,把它保存到指定文件夹下面
MemoryStream meoeryStream=new MemoryStream(k_Action.context);
FileStream fileStream=new FileStream(@”d:\” k_Action.filename,FileMode.Create);
meoeryStream.WriteTo(fileStream);
fileStream.Close();
meoeryStream.Close();
发现不能在对象中又定义新de对象.在准备发送到HOST上会提示“包含潜在危险de类型”.
[Serializable]
public struct kAction
{
public string filename;
public byte[] context;
public FineInfo fileInfo;//这里

};
记录一下自己de心得.有空我会好好整理下下回做篇完整点de.

cnzc’s blogs

Java操作文本文件的方法

星期一, 06月 2nd, 2008

最初java是不支持对文本文件de处理de,为了弥补这个缺憾而引入了Reader和Writer两个类,这两个类都是抽象类,Writer中write(char[] ch,int off,int length),flush()和close()方法为抽象方法,Reader中read(char[] ch,int off,int length)和close()方法是抽象方法.子类应该分别实现他们.
  当我读写文本文件de时候,采用Reader是非常方便de,比如FileReader,InputStreamReader和BufferedReader.其中最重要de类是InputStreamReader,它是字节转换为字符de桥梁.您可以在构造器重指定编码de方式,如果不指定de话将采用底层操作系统de默认编码方式,例如GBK等.当使用FileReader读取文件de时候.
  FileReader fr = new FileReader(”ming.txt”);
  int ch = 0;
  while((ch = fr.read())!=-1 )
  {
  System.out.print((char)ch);
  }
  其中read()方法返回de是读取得下个字符.当然您也可以使用read(char[] ch,int off,int length)这和处理二进制文件de时候类似,不多说了.如果使用InputStreamReader来读取文件de时候
  while((ch = isr.read())!=-1)
  {
  System.out.print((char)ch);
  }
  这和FileReader并没有什么区别,事实上在FileReader中de方法都是从InputStreamReader中继承过来de.read()方法是比较好费时间de,如果为了提高效率我可以使用BufferedReader对Reader进行包装,这样可以提高读取得速度,我可以一行一行de读取文本,使用readLine()方法.
  BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(”ming.txt”)));
  String data = null;
  while((data = br.readLine())!=null)
  {
  System.out.println(data);
  }
  当您明白了如何用Reader来读取文本文件de时候那么用Writer写文件同样非常简单.有一点需要注意,当您写文件de时候,为了提高效率,写入de数据会先放入缓冲区,然后写入文件.因此有时候您需要主动调用flush()方法.与上面对应de写文件de方法为:
  FileWriter fw = new FileWriter(”hello.txt”);
  String s = “hello world”;
  fw.write(s,0,s.length());
  fw.flush();
  OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(”hello2.txt”));
  osw.write(s,0,s.length());
  osw.flush();
  PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(”hello3.txt”)),true);
  pw.println(s);
  不要忘记用完后关闭流!下面是个小例子,帮助新手理解.其实有de时候javadeIO系统是需要我多记记de,不然哪天就生疏了.
  hello world i like java language
  import java.io.*;
  public class TestFile2
  {
  public static void main(String[] args) throws IOException
  {
  FileReader fr = new FileReader(”ming.txt”);
  char[] buffer = new char[1024];
  int ch = 0;
  while((ch = fr.read())!=-1 )
  {
   System.out.print((char)ch);
  }
  InputStreamReader isr = new InputStreamReader(new FileInputStream(”ming.txt”));
  while((ch = isr.read())!=-1)
  {
   System.out.print((char)ch);
  }
  BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(”ming.txt”)));
  String data = null;
  while((data = br.readLine())!=null)
  {
   System.out.println(data);
  }
  FileWriter fw = new FileWriter(”hello.txt”);
  String s = “hello world”;
  fw.write(s,0,s.length());
  fw.flush();
  OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(”hello2.txt”));
  osw.write(s,0,s.length());
  osw.flush();
  PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(”hello3.txt”)),true);
  pw.println(s);
  fr.close();
  isr.close();
  br.close();
  fw.close();
  osw.close();
  pw.close();
  }
  }

改变JSP的文件后缀

星期一, 06月 2nd, 2008

今天闲来无事,突然想到一个问题,能不能把访问JSP文件de后缀换成我自己de后缀呢?经过自己de一些调试,终于成功啦.哈哈哈. 好高兴…..
首先,在WEB.XM里配置
<servlet>
<servlet-name>testsuffix</servlet-name>
<servlet-class>mytest.TestSuffix</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testsuffix</servlet-name>
<url-pattern>*.br</url-pattern>
</servlet-mapping>


在SERVLET里写页面转向就可以啦..

String uri = request.getRequestURI();
uri = uri.replaceFirst(”.br”, “.jsp”);
RequestDispatcher rd = request.getRequestDispatcher(uri);
rd.forward(request, response);

哈哈哈.可以通过*.br访问以前deJSP文件啦.