C#之IO类库(一)——操作文件系统

本文实例总结了JSP常见的文件操作。分享给大家供大家参考。具体如下:

以下内容引用自:

C#的IO类库提供了丰富的IO操作,下面我来总结一下其IO类库提供的一些操作文件系统的方法

JSP中的文件操作:FILE类

JSP操作(Action)使用XML语法结构来控制Servlet引擎的行为。可以动态地插入一个文件,重组JavaBean组件,将用户转换到另一个页面,或为Java插件生成HTML。

一.操作驱动器
C#用DriveInfo来操作驱动器
1.创建对象
a.我们可以通过静态方法DriveInfo.GetDrives()来获取所有的Driver。
b.可以以Drive Letter为参数新建DriveInfo对象,注意DNS路径不能作为参数。
c.此外,我们还可以通过Directory.GetLogicalDrives()先获取机器上所有Driver的Driver
letter,再用它新建DriveInfo对象以操作所有的Driver。

String path=request.getRealPath("/");//传递参数"/"可以返回web应用根目录
String tmp_path=path+"tmp";
File f1=new File(tmp_path);//创建FILE类,指定路径为tmp_path
f1.mkdir();//创建目录
File f2=new File(tmp_path,"a.txt");//创建FILE类,指定路径为//tmp_path+"a.txt"
f2.createNewFile();//创建f2指定的文件
File f3=new File(tmp_path,"b.txt");
f3.createNewFile();
File f4=new File(tmp_path,"b.txt");
f4.createNewFile();

操作元素只有一个语法,因为它符合XML标准:

2.获取驱动器的状态
我们通过DriveInfo对象来获取驱动器的状态,可以获取的状态有
AvailableFreeSpace:获取当前用户被分配的可用空间大小(bytes)
TotalFreeSpace:获取所有可用空间大小(bytes)
TotalSize:获取总大小(bytes)
DriveFormat:返回FAT, NTFS等值
DriveType:返回DriveType类型的Enum值,可以是CDRom, Fixed, Network,
NoRootDirectory, Ram, Removable,或者Unknown
IsReady:对Removable和CD-ROM来说只有相应的设备可以访问了才返回true,当该属性为false时,很多其他属性无法获取
Name:盘符名
RootDirectory:返回Driver所代表的路径的Directory对象。
VolumeLabel:返回VolumeLabel信息,VolumeLabel就是咱自己对盘符定义的名字

其中:

<jsp:action_name attribute="value" />

二.操作文件夹
C#提供了DirectoryInfo和Directory两个类来操作文件夹,这两个类提供了很多相同的方法,他们的区别在于DirectoryInfo是先构造一个文件夹对象,再对这个对象进行操作。而Directory提供的大多数都是静态函数,这样能够直接根据给定的文件夹路径进行相应的操作。在对文件夹进行多个操作时最好用DirectoryInfo,而只进行一个操作,最好用Directory。
1.构造对象
DirectoryInfo需要先构造文件夹对象,再获取文件夹属性,或者对文件夹进行操作。它的构造方法不负责判断路径是否存在。
Directory不需要构造文件夹对象,直接传入文件夹的路径进行操作

File对象的length()方法可以计算文件的大小
isFile()方法可以判断是否为文件
isDirectory()方法可以判断是否为文件夹
getName()可以得到文件文件夹的名字
canRead()是否可读
canWrite()是否可写
isHidden()是否隐藏
lastModified()最后修改日期,返回Date类的一个对象

动作元素基本上是预定义的函数,有以下JSP操作:

2.判断文件夹是否存在
DirectoryInfo对象可通过查看Exists属性查看文件夹是否存在
Directory可通过Exists方法查看文件夹是否存在

文件的读取

语法 目的
jsp:include 当请求页面时,包含一个文件
jsp:useBean 发现或实例化一个JavaBean
jsp:setProperty JavaBean的属性集
jsp:getProperty 将JavaBean的属性嵌入到输出中
jsp:forward 将请求转发给一个新页面
jsp:plugin 生成浏览器-特定代码,为Java插件创建OBJECT或EMBED标签
jsp:element 动态的定义XML元素
jsp:attribute 定义了动态定义的XML元素的属性
jsp:body 定义了动态定义XML元素的body
jsp:text 用于在JSP页面和文档中编写模板

3.获取文件夹属性
注意,在用DirectoryInfo和Directory类获取文件夹属性前最好先判断其是否存在
对DirectoryInfo对象,在获取文件夹属性前应先用refresh函数刷新,可以访问文件夹的下列属性:
Attributes:archive, compressed, directory, hidden, offline, read-only,
system, 和temporary的或值
CreationTime
CreationTimeUtc
LastAccessTime
LastAccessTimeUtc
LastWriteTime
LastWriteTimeUtc

示例1:

一、共同的属性

Directory也可获取上述属性,不过是用静态函数获取,另外Directory也不支持获取Attribute。
SetCreationTime
SetCreationTimeUtc
SetLastAccessTime
SetLastAccessTimeUtc
SetLastWriteTime
SetLastWriteTimeUtc
GetCreationTime
GetCreationTimeUtc
GetLastAccessTime
GetLastAccessTimeUtc
GetLastWriteTime
GetLastWriteTimeUtc

String path=request.getRealPath("/");
File fp=new File(path,"file1.txt");//定义一个文件
FileInputStream fistream=new FileInputStream(fp);//定义一个文件输入流绑定一个文件
byte buf[]=new byte[10000];
int bytesum=fistream.read(buf,0,10000)//把字节文件写入到buf数组中,返回写入的字节数
String str_file=new String(buf,0,bytesum);
out.println(str_file);
fistream.close();

对于所有的操作元素来说,有两个属性是共同的:id属性和scope属性。

4.路径操作
DirectoryInfo和Directory类都支持路径操作,这些操作只针对传入的路径字符串,和文件夹是否存在无关
DirectoryInfo有下面一些属性
Name
Extension
FullName
Parent
Root

示例2:

  • Id属性:Id属性惟一地标识操作元素,并允许在JSP页面内引用操作。如果操作创建了一个对象的一个实例,那么id值可以通过隐式对象PageContext来引用该操作

  • Scope属性:这个属性标识了操作元素的生命周期。id属性和scope属性是直接相关的,因为scope属性决定了id属性相关的对象的生命周期。scope属性有四个可能值:(a)页面,(b)请求,(c)会话和(d)应用程序。

Directory有下面一些方法
GetParent:获取父目录的DirectoryInfo对象
GetDirectoryRoot

String path=request.getRealPath("/");
File fp=new File(path,"file1.txt");
FileReader freader=new FileReader(fp):
BufferedReader bfdreader=new BufferedReader(freader);
String str_line=bfdreader.readLine();
while(str_line!=null){
  out.println(str_line);
  out.println("
");
  str_line=bfdreader.readLine();
 }
 bfdreader.close();
 freader.close();

二、<jsp:include>操作

5.新建,移动,删除文件夹
DirectoryInfo和Directory类都支持文件夹的新建,移动,删除
DirectoryInfo的方法
Create,CreateSubdirectory,Delete,MoveTo

文件的写入:

此操作允许将文件插入到将要生成的页面中。语法如下:

Directory的方法
CreateDirectory
Delete  
Move

示例1:

<jsp:include page="relative URL" flush="true" />

6.遍历文件夹下的内容
DirectoryInfo和Directory类都支持遍历文件夹下的内容,而且都支持通过传入searchpattern和searchOption来定义遍历的行为,对于searchpattern,*匹配一个或多个字符,?匹配一个字符。searchOption的值是TopDirectory或AllDirectories,用来控制匹配的时候要不要包括子目录。
DirectoryInfo的方法:
EnumerateDirectories
EnumerateFiles
EnumerateFileSystemInfos
GetDirectories
GetFiles
GetFileSystemInfos

String path=request.getRealPath("/");
File fp=new File(path,"file2.txt");
FileWriter fwriter=new FileWriter(fp);
request.setCharacterEncoding("GBK");//设置字符编码
String str_file=request.getParameter("textarea");
fwriter.write(str_file);
fwriter.close();

该操作与包含指令不同,包含指令在JSP页面转换成Servlet时插入文件,该操作在请求页面时插入文件。

Directory的方法
GetDirectories
GetFiles
GetFileSystemEntries
EnumerateDirectories
EnumerateFiles
EnumerateFileSystemEntries

示例2:

下面是与包含操作相关的属性列表:

7.获取和设置当前的工作路径
Directory有两个重要的方法:
GetCurrentDirectory:获取当前的工作路径
SetCurrentDirectory:设置当前的工作路径

String path=request.getRealPath("/");
File fp=new FIle(path,"file2.txt");
FileWriter fwriter=new FIleWriter(fp);
BufferedWriter bfwriter=new BufferedWriter(fwriter);
request.setCharacterEncoding("GBK");
String str_file=request.getParameter("textarea");
bfwriter.write(str_file,0,str_file.length());
bfwriter.flush();
bfwriter.close();
属性 描述
page 要被包含的页面的相对URL。
flush 布尔属性决定了包含的资源在被包含之前其缓冲区是否刷新。

三.操作文件
C#提供了FileInfo和File两个类来操作文件,这两个类提供了很多相同的方法,他们的区别在于FileInfo是先构造一个文件对象,再对这个对象进行操作。而File提供的大多数都是静态函数,这样能够直接根据给定的文件路径进行相应的操作。在对文件进行多个操作时最好用FileInfo,而只进行一个操作,最好用File。
1.构造对象
FileInfo需要先构造文件对象,再获取文件属性,或者对文件进行操作。它的构造方法不负责判断路径是否存在。
File不需要构造文件对象,直接传入文件的路径进行操作

希望本文所述对大家的JSP程序设计有所帮助。

示例:

2.判断文件是否存在
FileInfo对象可通过查看Exists属性查看文件是否存在
File可通过Exists方法查看文件是否存在

定义以下两个文件(a)date.jsp和(b)main.jsp,如下:

3.获取文件属性
注意,在用FileInfo和File类获取文件属性前最好先判断其是否存在
对FileInfo对象,在获取文件属性前应先用refresh函数刷新,可以访问文件的下列属性:
Attributes:archive, compressed, directory, hidden, offline, read-only,
system, 和temporary的或值
CreationTime
CreationTimeUtc
LastAccessTime
LastAccessTimeUtc
LastWriteTime
LastWriteTimeUtc
Length:文件大小
IsReadOnly

以下是date.jsp文件的内容:

File也可获取上述属性,不过是用静态函数获取
GetAttributes
SetAttributes
SetCreationTime
SetCreationTimeUtc
SetLastAccessTime
SetLastAccessTimeUtc
SetLastWriteTime
SetLastWriteTimeUtc
GetCreationTime
GetCreationTimeUtc
GetLastAccessTime
GetLastAccessTimeUtc
GetLastWriteTime
GetLastWriteTimeUtc

<p>
   Today's date: <%= (new java.util.Date()).toLocaleString()%>
</p>

4.路径操作
FileInfo提供了一些路径操作,这些操作只针对传入的路径字符串,和文件是否存在无关
FileInfo有下面一些属性
Name
Extension
FullName
Directory:返回DirectoryInfo对象
DirectoryName
Parent
Root

以下是main.jsp文件的内容:

5.新建,移动,删除文件
FileInfo和File类都提供了新建,移动,删除文件操作
FileInfo的方法:
CopyTo
Create
Delete
MoveTo
Replace

<html>
<head>
<title>The include Action Example</title>
</head>
<body>
<center>
<h2>The include action Example</h2>
<jsp:include page="date.jsp" flush="true" />
</center>
</body>
</html>

File的方法
Copy
Create
Delete
Move
Replace

现在把所有这些文件保存在在根目录中,并试图访问
main.jsp。这将显示如下所示结果:

6.加密解密文件
FileInfo和File类都提供了Encrypt和Decrypt方法用来加密和解密文件,用某个用户加密的文件只有同一个用户能解密

The include action Example

Today's date: 12-Sep-2010 14:54:22

四.监听文件夹
C#有个很有趣的类,FileSystemWatcher,这个类可以用来监听文件夹内文件的增加,删除,修改等事件。
1.定制监听的信息
通过设置FileSystemWatcher的一些属性来定制监听的信息
Path:监听的目录
NotifyFilter:用来设置对哪些类型的更改进行监视
监视的类型为FileName,DirectoryName,Attributes,Size,LastWrite,LastAccess,CreationTime,Security的或值。默认为LastWrite,
FileName, DirectoryName的或值
InternalBufferSize:内部缓存区的大小,默认8KB,最小4KB,最大64KB
Filter:可以用通配符过滤文件,*匹配一个或多个字符,?匹配一个字符
IncludeSubdirectories:是否监听子目录

三、<jsp:useBean>操作

2.定制事件发生后的行为
文件夹里会发生下述事件
Changed
Created
Deleted
Renamed
我们通过给这些事件加事件处理器来处理事件
另外还可以用WaitForChanged来监听某个指定类型的消息然后返回

useBean操作具有多种用途。它首先利用id和scope变量搜索现有对象。如果没有找到一个对象,那么它会试图创建指定的对象。

3.启动监听
只有当EnableRaisingEvents为true且Path有值时,才能监听成功,当我们将所有信息设置好后,就可以通过设置这个值启动和停止监听了

加载bean的最简单的方式如下:

4.用BeginInit和EndInit来阻止component在初始化完成前使用,一般将一系列的操作写在这两个函数之间。

<jsp:useBean id="name" class="package.class" />

5.在Form中定义的时候必须将Form控件赋给SynchronizingObject属性

加载bean类完成后,可以使用jsp:setProperty和jsp:getProperty操作来修改和检索bean属性。

6.简单的示例:

下面是与useBean操作关联的属性列表:

监听”C:jingle”文件夹下面所有文件和文件夹的重命名操作

属性 描述
class 指定bean的全部包名。
type 指定将在对象中引用的变量的类型。
beanName 通过java.beans.Beans类中 instantiate()方法给定bean名称。
 [PermissionSet(SecurityAction.Demand, Name="FullTrust")]
    public static void Run()
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = "c:\jingle";
        watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName;
        watcher.IncludeSubdirectories = true;
        watcher.Filter = "*.*";

        watcher.Renamed += new RenamedEventHandler(OnRenamed);

        watcher.EnableRaisingEvents = true;

        Console.Read();
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
    }

四、<jsp:setProperty>操作

 

setProperty操作设置了Bean的属性。在定义该操作之前,
Bean一定已经预定义了。有两种使用setProperty操作的基本的方式:

可以使用jsp:setProperty之后,但是在该操作外面,使用一个jsp:useBean元素,如下所示:

<jsp:useBean id="myName" ... />
...
<jsp:setProperty name="myName" property="someProperty" .../>

在这种情况下,无论新的bean是否实例化或现有的bean是否被发现,jsp:setProperty都会被执行。

jsp:setProperty可以出现的第二个背景是在jsp:useBean元素内部,如下所示:

<jsp:useBean id="myName" ... >
...
   <jsp:setProperty name="myName" property="someProperty" .../>
</jsp:useBean>

这里,当且仅当实例化一个新对象时,jsp:setProperty
才会被执行,如果一个现有的对象被发现时,它不会被执行。

下面是与setProperty操作相关的属性列表:

属性 描述
name 指定了将被设置属性的bean。该Bean一定是之前定义的。
property 表明了想设置的属性。值为“*”意味着所有请求的名字与bean属性名字匹配的参数将被传递给适当的 setter 方法。
value 值分配给给定属性的值。参数的值为null或参数不存在时,setProperty操作将被忽略。
param param属性是请求参数的名称,该属性会接收该请求参数的值。不能同时使用值和参数,但是使用其中的一个是允许的。

五、<jsp:getProperty>操作

getProperty操作用于检索给定属性的值并将它转换成一个字符串,并最终将它插入到输出中。

getProperty操作只有两个属性,两者都是必需的,其简单的语法如下所示:

<jsp:useBean id="myName" ... />
...
<jsp:getProperty name="myName" property="someProperty" .../>

以下是与setProperty操作相关的属性属性列表:

属性 描述
name 有检索属性的Bean的名称。Bean一定是之前定义的。
property property属性是要被检索的Bean属性的名称。

示例:

定义一个测试的bean,在例子中使用如下所示:

/* File: TestBean.java */public class TestBean {
   private String message = "No message specified";
   public String getMessage() {
      return(message);
   }
   public void setMessage(String message) {
      this.message = message;
   }
}

(操作已过时,POM和Eclipse项目跳过)编译以上代码生成TestBean.class文件并确保将TestBean.class复制在
C:apache-tomcat-7.0.2webappsweb-infclassesaction文件夹中,且类路径变量也应设置为该文件夹:

现在在main.jsp文件中使用以下代码,该文件加载bean并set/get了一个简单的字符串参数:

<html>
<head>
<title>Using JavaBeans in JSP</title>
</head>
<body>
<center>
<h2>Using JavaBeans in JSP</h2>

<jsp:useBean id="test" class="action.TestBean" />

<jsp:setProperty name="test" property="message" value="Hello JSP..." />

<p>Got message....</p>

<jsp:getProperty name="test" property="message" />

</center>
</body>
</html>

现在试着访问main.jsp,将会出现如下所示的结果:

Using JavaBeans in JSP

Got message....
Hello JSP...

六、<jsp:forward>操作

forward操作终止当前页面的操作并将请求转发给另一个资源,如一个静态页面,另一个JSP页面,或Java
Servlet。

该操作的简单的语法如下所示:

<jsp:forward page="Relative URL" />

以下是与forward操作相关的属性列表:

属性 描述
page 应该包括另一个资源的相对URL,比如静态页面,另一个JSP页面,或Java Servlet。

示例:

以下是date.jsp文件的内容:

<p>
   Today's date: <%= (new java.util.Date()).toLocaleString()%>
</p>

以下是main.jsp文件的内容:

<html>
<head>
<title>The include Action Example</title>
</head>
<body>
<center>
<h2>The include action Example</h2>
<jsp:forward page="date.jsp" />
</center>
</body>
</html>

现在把所有这些文件保存在在根目录中并试图访问main.jsp。这将显示类似如下所示的结果。这里丢弃主页的内容,只显示来自转发页面的内容。

Today's date: 12-Sep-2010 14:54:22

七、<jsp:plugin>操作

插件用于将Java组件插入到JSP页面中。它决定了浏览器的类型以及需要插入的<object>或<embed>标签的类型。

如果所需的插件不存在,它将下载插件,然后执行Java组件。Java组件可以是一个Applet或一个JavaBean。

插件操作有几个属性,对应常用的生成Java组件的HTML标签。<param>元素也可以用来给Applet或Bean发送参数。

下面是使用插件操作的典型的语法:

<jsp:plugin type="applet" codebase="dirname" code="MyApplet.class" width="60" height="80">
   <jsp:param name="fontcolor" value="red" />
   <jsp:param name="background" value="black" />
   <jsp:fallback>
      Unable to initialize Java Plugin
   </jsp:fallback>
</jsp:plugin>

如果感兴趣的话,可以使用applet尝试该操作。一个新元素,<fallback>元素,当组件失败时,可以用来指定一个错误字符串发送给用户。(已过时)

The <jsp:element> Action

The <jsp:attribute> Action

The <jsp:body> Action

所述的**<jsp:element>,<jsp:attribute><jsp:body>**动作被用于动态地定义的XML元素。这个词动态是重要的,因为这意味着可以在请求时生成XML元素,而不是在编译时静态地生成XML元素。

以下是动态定义XML元素的简单示例:

<%@page language="java" contentType="text/html"%>
<html xmlns="http://www.w3c.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page">

   <head><title>Generate XML Element</title></head>

   <body>
      <jsp:element name="xmlElement">
         <jsp:attribute name="xmlElementAttr">
            Value for the attribute
         </jsp:attribute>

         <jsp:body>
            Body for XML element
         </jsp:body>

      </jsp:element>
   </body>
</html>

这将在运行时生成以下HTML代码 :

<html xmlns="http://www.w3c.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page">
   <head><title>Generate XML Element</title></head>

   <body>
      <xmlElement xmlElementAttr="Value for the attribute">
         Body for XML element
      </xmlElement>
   </body>
</html>

八、<jsp:text>动作

可以使用<jsp:text>操作将模板文本写入JSP页面和文档。以下是此操作的简单语法:

<jsp:text>Template data</jsp:text>

模板的主体不能包含其他元素;它只能包含文本和EL表达式。请注意,在XML文件中,不能使用诸如${whatever>0}表达式,因为大于符号是非法的。相反,使用gt表单,例如${whatever
0}
或替代方法是将值嵌入CDATA部分。

<jsp:text><![CDATA[<br>]]></jsp:text>

如果需要包括DOCTYPE声明,例如XHTML,您还必须使用<jsp:text>元素,如下所示:

<jsp:text><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">]]></jsp:text>

   <head><title>jsp:text action</title></head>

   <body>
      <books>
    <book>
      <jsp:text>  
           Welcome to JSP Programming
         </jsp:text>
    </book>
   </books>
   </body>
</html>

 

 

测试工程:

发表评论

电子邮件地址不会被公开。 必填项已用*标注