<13>IO流(上)

本文详细介绍了Java IO流的基础概念,包括字节流与字符流的区别、输入流和输出流的作用,以及File类的使用和FileReader/FileWriter/FileInputStream/FileOutputStream的应用实例。通过实例演示了如何读写文本文件、复制文件和处理非文本文件。

1.1 IO流概述

1.1.1 流的分类

  • 1.按操作数据单位:字节流、字符流
  • 2.按数据的流向:输入流、输出流
  • 3.按流的角色:节点流、处理流

1.1.2 流的体系结构

一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。
下图是一个描述输入流和输出流的类层次图:
在这里插入图片描述

1.2 输入、输出的标准化过程

1.2.1 输入过程

① 创建File类的对象,指明读取的数据的来源。(要求此文件一定要存在)
② 创建相应的输入流,将File类的对象作为参数,传入流的构造器中
③ 具体的读入过程:
创建相应的byte[] 或 char[]。
④ 关闭流资源
说明:程序中出现的异常需要使用try-catch-finally处理。

1.2.2 输出过程

① 创建File类的对象,指明写出的数据的位置。(不要求此文件一定要存在)
② 创建相应的输出流,将File类的对象作为参数,传入流的构造器中
③ 具体的写出过程:
write(char[]/byte[] buffer,0,len)
④ 关闭流资源
说明:程序中出现的异常需要使用try-catch-finally处理。

1.3 File类

1.3.1 File类理解

  • File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)
  • File类声明在java.io包下
  • File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法, 并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
  • 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的"终点".

1.3.2 File的实例化

常用构造器

  • File(String filePath)
  • File(String parentPath,String childPath)
  • File(File parentFile,String childPath)

路径的分类

  • 相对路径:相较于某个路径下,指明的路径。
  • 绝对路径:包含盘符在内的文件或文件目录的路径。

说明
IDEA中:
如果大家开发使用JUnit中的单元测试方法测试,相对路径即为当前Module下
如果大家使用main()测试相对路径即为当前的Project下
Eclipse中:
不管使用单元测试方法还是使用main()测试,相对路径都是当前的Project下

1.4 FileReader/FileWriter的使用

1.4.1 FileReader的使用

首先介紹两种流操作:

  • public void close() throws IOException{}
    关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。
  • public int read(byte[] r) throws IOException{}
    这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。
    在这里插入图片描述
    例1:将review01下的hello.txt文件内容读入程序中,并输出到控制台
  @Test
 public void test002() {
        FileReader fr = null;
        try {
        	//1.File类的实例化
            File file = new File("E:\\Review\\src\\review01\\hello.txt");
            //2.FileReader流的实例化
            fr = new FileReader(file);

			//3.读入的操作
            char[] cbuf = new char[5];
            int len = 0;
            //read(char[] cbuf):返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1
            while((len = fr.read(cbuf)) != -1){
                String str = new String(cbuf, 0, len);
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
        	//4.资源的关闭
            if (fr != null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
 注:public String(byte[] bytes,int offset,int length)这个方法表示 将字符数组bytes从第offset个字符开始,长度为length的所有字符构建成一个字符串。

1.4.2 FileWriter的使用

涉及到的流操作:

  • public void write(byte[] w)
    把指定数组中w.length长度的字节写到OutputStream中。

说明:

  • 输出操作,对应的File可以不存在的。并不会报异常
  • File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
    File对应的硬盘中的文件如果存在:
    如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原文件的覆盖
    如果流使用的构造器是:FileWriter(file,true):不会对原文件覆盖,而是在原文件基础上追加内容

例:从内存中写出数据到硬盘的文件里。

    @Test
    public void writeTest(){

        FileWriter fw = null;
        try {
        	//1.提供File类的对象,指明写出到的文件
            File file = new File("hello1.txt");
			//2.提供FileWriter的对象,用于数据的写出
            fw = new FileWriter(file, false);
			//3.写出的操作
            fw.write("abcd\n");
            fw.write("efg");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
        	//4.流资源的关闭
            if (fw != null){
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

1.4.3 文本文件的复制

例:将Project下的hello1.txt复制为hello2.txt

 @Test
    public void test03(){

        FileReader fr = null;
        FileWriter fw = null;
        try {
            //1.创建File类的对象,指明读入和写出的文件
            File file = new File("hello1.txt");//读入的文件
            File destFile = new File("hello2.txt");//写出的文件

			//2.创建输入流和输出流的对象
            fr = new FileReader(file);
            fw = new FileWriter(destFile);//3.数据的读入和写出操作
            char[] c = new char[5];
            int len;
            while ((len = fr.read(c)) != -1){
                fw.write(c,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
        	//4.关闭流资源
            if (fr != null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fw != null){
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

1.5 FileInputStream / FileOutputStream的使用

  • 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
  • .对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,…),使用字节流处理

例:实现对图片的复制操作

 @Test
    public void test1(){

        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
        	//1.创建File类的对象,指明读入和写出的文件
            File file = new File("xx.jpg");
            File descFile = new File("yy.jpg");
			//2.创建输入流和输出流的对象
            fis = new FileInputStream(file);
            fos = new FileOutputStream(descFile);
			//3.数据的读入和写出操作
            byte[] bytes = new byte[5];
            int len;
            while ((len = fis.read(bytes)) != -1){
                fos.write(bytes,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
        	//4.资源关闭
            if (fis !=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

文章参考:
b站尚硅谷宋红康老师Java教学视频;
菜鸟教程:https://www.runoob.com/java/java-files-io.html

<lib> <name>createVolumeDP</name> <code>runlib:checkdplicense| runlib:makecachewarnings| clearversion:PagePool| domethodsstop:91| jumpif:$v.canbecompressed:!=:true:SKIP2| goto:sizeopt| stop| label:SKIP2| goto:size| stop| </code> </lib>这是一个xml我想找到<xml> <title>Create Volume</title> <helpcontextid>CreateVolume</helpcontextid> <width>800</width> <height>630</height> <windowtype>single</windowtype> <icon>12</icon> <firstcard></firstcard> <createobject>volume</createobject> <createdefaultname>yes</createdefaultname> <finishnowcaption>Create Now</finishnowcaption> <requireconfigstore>true</requireconfigstore> <vars> <var> <name>basename</name> <type>String</type> </var> <var> <name>skipdisks</name> <type>String</type> </var> <var> <name>fromcmm</name> <type>boolean</type> <value>false</value> </var> <var> <name>fromload</name> <type>boolean</type> <value>false</value> </var> <var> <name>sourcesecure</name> <type>boolean</type> <value>false</value> </var> <var> <name>runmap</name> <type>boolean</type> <value>false</value> </var> <var> <name>runnewmap</name> <type>boolean</type> <value>false</value> </var> <var> <name>linkerran</name> <type>boolean</type> <value>false</value> </var> <var> <name>mapran</name> <type>boolean</type> <value>false</value> </var> <var> <name>diskgroupid</name> <type>int</type> </var> <var> <name>pagepoolindex</name> <type>int</type> </var> <var> <name>importTemplate</name> <type>object</type> </var> <var> <name>CopyReplaySchedules</name> <type>boolean</type> <value>false</value> </var> <var> <name>convertToBlocks</name> <type>boolean</type> <value>false</value> </var> <var> <name>volumetoduplicate</name> <type>object</type> </var> <var> <name>columnList</name> <type>string</type> <value>DiskFolderName:COLUMN_HEAD_DISK_FOLDER:180|redundancy:COLUMN_HEAD_REDUNDANCY:180|DataPageSizeDisplay:COLUMN_HEAD_DATAPAGE_SIZE:180|status:COLUMN_HEAD_STATUS:100</value> </var> <var> <name>lastcard</name> <type>String</type> </var> <var> <name>pageclassmode</name> <value>0</value> </var> <var> <name>sizewarning</name> <type>string</type> </var> <var> <name>sizewarning2</name> <type>string</type> </var> <var> <name>SystemReadCacheWarning</name> <type>string</type> </var> <var> <name>SystemWriteCacheWarning</name> <type>string</type> </var> <var> <name>tier1writable</name> <type>string</type> <value></value> </var> <var> <name>tier2writable</name> <type>string</type> <value></value> </var> <var> <name>tier3writable</name> <type>string</type> <value></value> </var> <var> <name>tier1replay</name> <type>string</type> <value></value> </var> <var> <name>tier2replay</name> <type>string</type> <value></value> </var> <var> <name>tier3replay</name> <type>string</type> <value></value> </var> <var> <name>selectedtemplate</name> <type>string</type> <value></value> </var> <var> <name>selectedTemplateName</name> <type>string2</type> <value><None></value> </var> <var> <name>NONE</name> <type>string2</type> <value><None></value> </var> <var> <name>dpColumns</name> <type>string</type> <value>blank::25:false:false:0:::Cost|raidlevellabel:COLUMN_HEAD_RAID_LEVEL:90|DiskSpeedZone:COLUMN_HEAD_DISK_TRACKS_USED:100|selectedwritable:COLUMN_HEAD_WRITABLE_DATA:90:false:false:11:true:false|selectedhistorical:COLUMN_HEAD_REPLAY_DATA:80:false:false:11:true:false|</value> </var> <var> <name>userProfilesFound</name> <type>boolean</type> <value>false</value> </var> <var> <name>ReplayTemplateVector</name> <type>vector</type> </var> <var> <name>SelectedTemplatesVector</name> <type>vector</type> </var> <var> <name>selectedReplayProfilesStr</name> <type>string</type> <value></value> </var> <var> <name>comma</name> <type>string</type> <value>, </value> </var> <var> <name>labelValue1</name> <type>string</type> <value>Storage Profile:</value> </var> <var> <name>labelValue2</name> <type>string</type> <value>RAID Types:</value> </var> <var> <name>labelValue3</name> <type>string</type> <value>Storage Tier:</value> </var> <var> <name>storageLabel1</name> <type>string</type> <value>Storage Profile:</value> </var> <var> <name>storageLabel2</name> <type>string</type> <value></value> </var> <var> <name>storageValue1</name> <type>string</type> <value></value> </var> <var> <name>storageValue2</name> <type>string</type> <value></value> </var> <var> <name>storageTierText</name> <type>string</type> <value>Select the RAID and Storage Tier settings for this volume:</value> </var> <var> <name>textValue1</name> <type>string</type> <value>Select the RAID and Storage Tier settings for this volume:</value> </var> <var> <name>textValue2</name> <type>string</type> <value>Select the Storage Tier setting for this volume:</value> </var> <var> <name>defaultServer</name> <type>object</type> </var> <var> <name>colon</name> <type>string</type> <value>:</value> </var> <var> <name>dataoptimization</name> <type>boolean</type> <value>false</value> </var> <var> <name>canbecompressed</name> <type>boolean</type> <value>false</value> </var> <var> <name>compressionLabelString</name> <type>string</type> <value>Compression Enabled:</value> </var> <var> <name>compressionLabel</name> <type>string</type> <value></value> </var> <var> <name>compressionValue</name> <type>string</type> <value></value> </var> </vars> <cards> <card> <id>diskfolder</id> <region>diskfolder</region> <regionstart>diskfolder</regionstart> <url>wiz/eng/html/questions/CreateVolume/Disks.htm</url> <tab>2</tab> <contextid>1</contextid> <code>setattr:$v.lastcard:diskfolder</code> <buttons> <menuitem> <defaultlabel>Continue</defaultlabel> <labelkey>3001</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>runlib:selectdisk</actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>redundancy</id> <region>redundancy</region> <regionstart>redundancy</regionstart> <url>wiz/eng/html/questions/CreateVolume/Redundancy.htm</url> <tab>1</tab> <contextid>1</contextid> <code>setattr:$v.lastcard:redundancy</code> <buttons> <menuitem> <defaultlabel>Non-Redundant</defaultlabel> <labelkey>0498</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>setattr:$v.diskFailureProtection:0| setattr:$v.dfPagepoolVector:nonredundantPagepools| setattr:$p.primetype:non-redundant| setattr:$p.diskFailureProtection:0| setattr:$v.storageTierText:$v.textValue2| runlib:checkNonRedundant| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> <menuitem> <defaultlabel>Redundant</defaultlabel> <labelkey>0499</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>setattr:$v.diskFailureProtection:1| setattr:$v.dfPagepoolVector:redundantPagepools| setattr:$p.primetype:redundant| setattr:$p.diskFailureProtection:1| setattr:$v.storageTierText:$v.textValue1| runlib:checkRedundant| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>selectpagepool</id> <region>selectpagepool</region> <regionstart>selectpagepool</regionstart> <url>wiz/eng/html/questions/CreateVolume/SelectPagepool.htm</url> <contextid>1</contextid> <code>setattr:$v.lastcard:selectpagepool</code> <buttons> <menuitem> <defaultlabel>Continue</defaultlabel> <labelkey>3001</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>runlib:selectPagepool|</actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>bpwait</id> <region>bpwait</region> <regionstart>bpwait</regionstart> <url>wiz/eng/html/questions/bpwait2.htm</url> <tab>1</tab> <contextid>1</contextid> <donecode>stopif:$w.doneEventSuccess:=:false| runbackground:postsave| </donecode> </card> <card> <id>pagepooldown</id> <region>pagepooldown</region> <regionstart>pagepooldown</regionstart> <url>wiz/eng/html/questions/CreateVolume/PagepoolDown.htm</url> <tab>1</tab> <contextid>1</contextid> <buttons> <menuitem> <defaultlabel>Close</defaultlabel> <labelkey>0112</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>return</actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> <menuitem> <defaultlabel>Retry</defaultlabel> <labelkey>3021</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>goto:diskfolder</actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>pagepooldown2</id> <region>pagepooldown2</region> <regionstart>pagepooldown2</regionstart> <url>wiz/eng/html/questions/CreateVolume/PagepoolDown.htm</url> <tab>1</tab> <contextid>1</contextid> <hideback>true</hideback> <buttons> <menuitem> <defaultlabel>Close</defaultlabel> <labelkey>0112</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>return</actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>size</id> <region>size</region> <regionstart>size</regionstart> <url>wiz/eng/html/questions/CreateVolume/DynamicSize.htm</url> <tab>1</tab> <contextid>1</contextid> <code>domethodsstop:85| jumpif:$u.DPPrompt:!=:true:CHECKCACHE| stop| label:CHECKCACHE| jumpif:$u.cacheprompt:!=:true:SKIP| stop| label:SKIP| goto:sizenoadvance| stop| </code> <buttons> <menuitem> <defaultlabel>Advanced</defaultlabel> <labelkey>3020</labelkey> <defaulttooltip>Change advanced settings for this Volume</defaulttooltip> <tooltipkey>3263</tooltipkey> <imagekey>0112</imagekey> <actioncommand>domethodsstop:13| refresh| jumpif:$m.expandsize:igt:$w.MaxVolBlockCount:TOOBIG| jumpif:$m.expandsize:ilt:$m.DataPageSize:TOOSMALL| goto:dp| stop| label:TOOBIG| getmsg:3269:$v.emsg:$w.MaxVolSizeStr| msgbox:$v.emsg:$w.title:E| stop| label:TOOSMALL| getmsg:3268:$v.sizeMsg:$m.minsize| msgbox:$v.sizeMsg:$w.title:W| stop| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> <menuitem> <defaultlabel>Continue</defaultlabel> <labelkey>3001</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>domethodsstop:13| refresh| jumpif:$m.expandsize:igt:$w.MaxVolBlockCount:TOOBIG| jumpif:$m.expandsize:ilt:$m.DataPageSize:TOOSMALL| runlib:checkprogression| goto:replay| stop| label:TOOBIG| concat:The maximum size of a Volume is~:$w.MaxVolSizeStr:$v.emsg| concat:$v.emsg:.:$v.emsg| msgbox:$v.emsg:$w.title:E| stop| label:TOOSMALL| getmsg:3268:$v.sizeMsg:$m.minsize| msgbox:$v.sizeMsg:$w.title:W| stop| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>sizeopt</id> <region>size</region> <regionstart>size</regionstart> <url>wiz/eng/html/questions/CreateVolume/DynamicSizeOpt.htm</url> <tab>1</tab> <contextid>1</contextid> <code>domethodsstop:85| jumpif:$u.DPPrompt:!=:true:CHECKCACHE| stop| label:CHECKCACHE| jumpif:$u.cacheprompt:!=:true:SKIP| stop| label:SKIP| goto:sizenoadvanceopt| stop| </code> <buttons> <menuitem> <defaultlabel>Advanced</defaultlabel> <labelkey>3020</labelkey> <defaulttooltip>Change advanced settings for this Volume</defaulttooltip> <tooltipkey>3263</tooltipkey> <imagekey>0112</imagekey> <actioncommand>domethodsstop:13| refresh| jumpif:$m.expandsize:igt:$w.MaxVolBlockCount:TOOBIG| jumpif:$m.expandsize:ilt:$m.DataPageSize:TOOSMALL| goto:dp| stop| label:TOOBIG| getmsg:3269:$v.emsg:$w.MaxVolSizeStr| msgbox:$v.emsg:$w.title:E| stop| label:TOOSMALL| getmsg:3268:$v.sizeMsg:$m.minsize| msgbox:$v.sizeMsg:$w.title:W| stop| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> <menuitem> <defaultlabel>Continue</defaultlabel> <labelkey>3001</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>domethodsstop:13| refresh| jumpif:$m.expandsize:igt:$w.MaxVolBlockCount:TOOBIG| jumpif:$m.expandsize:ilt:$m.DataPageSize:TOOSMALL| runlib:checkprogression| goto:replay| stop| label:TOOBIG| concat:The maximum size of a Volume is~:$w.MaxVolSizeStr:$v.emsg| concat:$v.emsg:.:$v.emsg| msgbox:$v.emsg:$w.title:E| stop| label:TOOSMALL| getmsg:3268:$v.sizeMsg:$m.minsize| msgbox:$v.sizeMsg:$w.title:W| stop| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>sizenoadvance</id> <region>size</region> <regionstart>size</regionstart> <url>wiz/eng/html/questions/CreateVolume/DynamicSize.htm</url> <tab>1</tab> <contextid>1</contextid> <code></code> <buttons> <menuitem> <defaultlabel>Continue</defaultlabel> <labelkey>3001</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand> copy:$m:$q| domethodsstop:13| refresh| jumpnull:$i:OKCOPY| jumpif:$i.type:!=:wizvar:OKCOPY| jumpif:$i.CopyVolume:=:false:OKCOPY| jumpif:$m.expandsize:igt=:$q.expandsize:OKCOPY| msgbox:The destination volume cannot be smaller than the source volume.:$w.title:E| stop| label:OKCOPY| jumpif:$m.expandsize:igt:$w.MaxVolBlockCount:TOOBIG| jumpif:$m.expandsize:ilt:$m.DataPageSize:TOOSMALL| runlib:checkprogression| goto:replay| stop| label:TOOBIG| concat:The maximum size of a Volume is~:$w.MaxVolSizeStr:$v.emsg| concat:$v.emsg:.:$v.emsg| msgbox:$v.emsg:$w.title:E| stop| label:TOOSMALL| getmsg:3268:$v.sizeMsg:$m.minsize| msgbox:$v.sizeMsg:$w.title:W| stop| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>sizenoadvanceopt</id> <region>size</region> <regionstart>size</regionstart> <url>wiz/eng/html/questions/CreateVolume/DynamicSizeOpt.htm</url> <tab>1</tab> <contextid>1</contextid> <code></code> <buttons> <menuitem> <defaultlabel>Continue</defaultlabel> <labelkey>3001</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand> copy:$m:$q| domethodsstop:13| refresh| jumpnull:$i:OKCOPY| jumpif:$i.type:!=:wizvar:OKCOPY| jumpif:$i.CopyVolume:=:false:OKCOPY| jumpif:$m.expandsize:igt=:$q.expandsize:OKCOPY| msgbox:The destination volume cannot be smaller than the source volume.:$w.title:E| stop| label:OKCOPY| jumpif:$m.expandsize:igt:$w.MaxVolBlockCount:TOOBIG| jumpif:$m.expandsize:ilt:$m.DataPageSize:TOOSMALL| runlib:checkprogression| goto:replay| stop| label:TOOBIG| concat:The maximum size of a Volume is~:$w.MaxVolSizeStr:$v.emsg| concat:$v.emsg:.:$v.emsg| msgbox:$v.emsg:$w.title:E| stop| label:TOOSMALL| getmsg:3268:$v.sizeMsg:$m.minsize| msgbox:$v.sizeMsg:$w.title:W| stop| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>dp</id> <region>dp</region> <regionstart>dp</regionstart> <url>wiz/eng/html/questions/CreateVolume/DataProgression.htm</url> <tab>1</tab> <contextid>1</contextid> <code>stopif:$u.DPPrompt:=:true| goto:advancedoptions| stop| </code> <buttons> <menuitem> <defaultlabel>Continue</defaultlabel> <labelkey>3001</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>runlib:checkprogression| goto:advancedoptions| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>advancedoptions</id> <region>advancedoptions</region> <regionstart>advancedoptions</regionstart> <url>wiz/eng/html/questions/CreateVolume/AdvancedOptions.htm</url> <tab>2</tab> <contextid>1</contextid> <code>jumpif:$v.SystemReadCacheWarning:!=::TWO| jumpif:$v.SystemWriteCacheWarning:!=::TWO| stopif:$u.cacheprompt:=:true| goto:replay| stop| label:TWO| goto:advancedoptions2| </code> <buttons> <menuitem> <defaultlabel>Continue</defaultlabel> <labelkey>3001</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>setattrint:$m.RCacheRAStatus:$m.RCacheStatus| goto:replay| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>advancedoptions2</id> <region>advancedoptions2</region> <regionstart>advancedoptions2</regionstart> <url>wiz/eng/html/questions/CreateVolume/AdvancedOptions2.htm</url> <tab>2</tab> <contextid>1</contextid> <code>stopif:$u.cacheprompt:=:true| goto:replay </code> <buttons> <menuitem> <defaultlabel>Continue</defaultlabel> <labelkey>3001</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>setattrint:$m.RCacheRAStatus:$m.RCacheStatus| goto:replay </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>replay</id> <region>replay</region> <regionstart>replay</regionstart> <url>wiz/eng/html/questions/CreateVolume/TemplateSelection.htm</url> <tab>1</tab> <contextid>1</contextid> <code>jumpnull:$l:LICENSED| jumpif:$l.Enabled^13:=:1:LICENSED| goto:save| stop| label:LICENSED| jumpif:$u.ReplayOption:i=:1:CONTINUE| jumpif:$u.ReplayOption:i=:0:SAVE| jumpif:$u.ReplayOption:i=:2:SAVE| jump:CONTINUE| label:SAVE| goto:save| stop| label:CONTINUE| </code> <buttons> <menuitem> <defaultlabel>Continue</defaultlabel> <labelkey>3001</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>goto:save| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>save</id> <region>save</region> <regionstart>save</regionstart> <url>wiz/eng/html/questions/CreateVolume/Save.htm</url> <adminurl>wiz/eng/html/questions/CreateVolume/SaveAdmin.htm</adminurl> <tab>1</tab> <contextid>1</contextid> <code></code> <buttons> <menuitem> <defaultlabel>Continue</defaultlabel> <labelkey>3001</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>jumpif:$w.userprivlevel:i=:5:ADMIN| jumpif:$m.parentobjectid:i!=:0:NOTROOT| getmsg:3397:$v.PrivWarning| msgbox:$v.PrivWarning:$w.title:W| stop| label:NOTROOT| label:ADMIN| setattr:$v.sizewarning:| setattr:$v.sizewarning2:| jumpif:$m.expandsize:ilt:4294967297:NONE| setattr:$v.sizewarning:Warning - Some operating systems do not support volumes greater than 2 TB.| setattr:$v.sizewarning2:Please verify that the server operating system supports volumes of this size.| label:NONE| jumpif:$v.skipfinish:=:true:SKIPFINISH| domethodsstop:$u:5| runlib:fixstoragelabels| runlib:fixcompressionlabels| goto:finish| stop| label:SKIPFINISH| return:$m:CREATE| stop| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> <card> <id>finish</id> <region>finish</region> <regionstart>finish</regionstart> <url>wiz/eng/html/questions/CreateVolume/FinishDP.htm</url> <tab>1</tab> <contextid>1</contextid> <code></code> <buttons> <menuitem> <defaultlabel>Create Now</defaultlabel> <labelkey>3002</labelkey> <defaulttooltip></defaulttooltip> <tooltipkey>-1</tooltipkey> <imagekey>0112</imagekey> <actioncommand>runlib:afterCreateVolumeDP| </actioncommand> <itemstate>ENABLED</itemstate> <sticky>0</sticky> <stickystate>0</stickystate> <priv>3</priv> </menuitem> </buttons> </card> </cards> <instructions> <lib> <name>start</name> <event>start</event> <code>setsize:800:630| runlib:setprimingdefaults| setattr:$v.diskgroupid:$u.diskgroupid| runlib:checktitle| jumpnull:$i:CONTINUE| jumpif:$i.type:!=:wizvar:CONTINUE| setobject:$i.sourcevolumeobject:$o| jumpnull:$o:CONTINUE| getstop:$o| setattr:$v.skiplinker:YES| setattr:$v.ExactDuplicate:$i.ExactDuplicate| setattr:$v.CopyVolume:$i.CopyVolume| setattr:$v.CopyReplaySchedules:$i.CopyReplaySchedules| setattr:$v.fromcmm:true| jumpif:$o.isSecure:=:false:NOSED| setattr:$v.sourcesecure:true| label:NOSED| setattr:$v.diskgroupid:$o.diskgroupid| runlib:checkduplicate| jumpif:$i.ExactDuplicate:=:true:EXACT| setattr:$m.name:$i.duplicatesname| jump:FINISH| label:EXACT| setattr:$m.name:$i.duplicatesname| setattr:$m.notes:$i.notes| setattr:$m.parentobjectid:$i.duplicatefolder| jumpif:$v.CopyReplaySchedules:!=:true:NOREPLAY| domethodsstop:$o:45| setattrobject:$v.importTemplate:$o.snapshotprofile| label:NOREPLAY| runlib:save| end| label:CONTINUE| jumpif:$v.InitialBlockCount:=::CONTINUE2| jumpif:$v.InitialBlockCount:=:0:CONTINUE2| // must be from Load/Restore VolumeFromExternalDevice| setattr:$v.fromload:true| setattr:$v.newname:$v.InitialDiskName| trim:$v.newname:64| jumpif:$v.newname:=::EMPTYNAME| setattr:$m.name:$v.newname| label:EMPTYNAME| setattr:$m.expandsize:$v.InitialBlockCount| setattr:$v.convertToBlocks:true| domethodsstop:$m:14| jumpif:$m.name:!=::FINISH| label:CONTINUE2| jumpif:$v.newname:=::EMPTYNAME2| setattr:$m.name:$v.newname| jump:FINISH| label:EMPTYNAME2| setattr:$v.basename:$u.VolumeBaseName| domethodsstop:15|//generate name| label:FINISH| getstop:$s| getstop:$u| setattr:$v.diskgroupid:$u.diskgroupid| runlib:fillreplayvectors| runlib:checkInput| runlib:setparent| runlib:setfirstcard| end| </code> </lib> <lib> <name>fillreplayvectors</name> <code>retrievetable:PITCRuleGroup:$g| vectorset:$g:$v.ReplayTemplateVector| jumpif:$v.fromcmm:=:true:SKIP| jumpif:$v.fromload:=:true:SKIP| jumpif:$u.ReplayOption:i=:0:SKIP| domethodsstop:$u:3| label:SKIP| </code> </lib> <lib> <name>setprimingdefaults</name> <code>setattr:$v.diskFailureProtection:1| setattr:$v.dfPagepoolVector:redundantPagepools| setattr:$p.primetype:redundant| setattr:$p.diskFailureProtection:1| </code> </lib> <lib> <name>setfirstcard</name> <code>jumpif:$v.skipdisks:=:YES:SKIPDF| jumpif:$u.diskgroupidprompt:=:true:DF| label:SKIPDF| jumpif:$u.redundantonly:=:false:REDUNDANCY| jump:RUNWIZARD| label:DF| setattr:$w.firstcard:diskfolder| stop| label:REDUNDANCY| setattr:$w.firstcard:redundancy| stop| label:RUNWIZARD| setattr:$w.firstcard:diskfolder| setattr:$v.diskFailureProtection:1| setattr:$v.dfPagepoolVector:redundantPagepools| setattr:$p.primetype:redundant| setattr:$p.diskFailureProtection:1| runlib:checkRedundant| stop| </code> </lib> <lib> <name>gotodiskfolder</name> <code>jumpif:$v.skipdisks:=:YES:SKIP| jumpif:$u.diskgroupidprompt:=:false:SKIP| goto:diskfolder| stop| label:SKIP| runlib:gotoredundancy| stop| </code> </lib> <lib> <name>gotoredundancy</name> <code>jumpif:$u.redundantonly:=:true:SKIP| goto:redundancy| stop| label:SKIP| setattr:$v.diskFailureProtection:1| setattr:$p.diskFailureProtection:1| runlib:checkRedundant| stop| </code> </lib> <lib> <name>checktitle</name> <code>setattr:$w.replacetitle:Create Volume| </code> </lib> <lib> <name>checkInput</name> <code>jumpnull:$i:INULL| jumpif:$i.type:=:diskfolder:DF| jumpif:$i.type:=:server:SERVER| label:INULL| jumpif:$u.AutoMap:=:true:MAP| jump:CONTINUE| label:SERVER| setattr:$v.runmap:true| setattr:$v.serverid:$i.objectid| jumpif:$u.AutoMap:=:true:MAP| jump:CONTINUE| label:DF| setattr:$v.diskgroupid:$i.objectid| setattr:$v.skipdisks:YES| jumpif:$u.AutoMap:=:true:MAP| jump:DONE| label:MAP| jumpif:$s.NewMappingEnabled:=:true:NEWMAP| jumpif:$u.DefaultServer:i=:0:CONTINUE| setattr:$v.runmap:true| setattr:$v.serverid:$u.DefaultServer| jumpif:$v.skipdisks:=:YES:DONE| jump:CONTINUE| label:NEWMAP| jumpif:$u.DefaultServer:=::CONTINUE| jumpif:$u.DefaultServer:=:0:CONTINUE| retrieveobject:$v.defaultServer:MappingServer:objectid:$u.DefaultServer| jumpnull:$v.defaultServer:CONTINUE| setattr:$v.runnewmap:true| jumpif:$v.skipdisks:=:YES:DONE| jump:CONTINUE| label:CONTINUE| domethodsstop:33| jump:DONE| label:DONE| </code> </lib> <lib> <name>setparent</name> <code>jumpnull:$i:X| jumpif:$i.type:!=:volumefolder:X| setattr:$m.parentobjectid:$i.objectid| stop| label:X| jumpif:$v.parentfolder:=::NOPARAM| jumpif:$v.parentfolder:i=:0:NOPARAM| setattr:$m.parentobjectid:$v.parentfolder| stop| label:NOPARAM| stopif:$w.userprivlevel:i=:5| findchild:0:volumesnode:$i| stopnull:$i| vectorgetchildren:$i:$g| loop:$g| jumpif:$g.type:!=:volumefolder:NEXT| setattr:$m.parentobjectid:$g.objectid| stop| label:NEXT| endloop:$g| stop| </code> </lib> <lib> <name>checkduplicate</name> <code>setattrobject:$v.volumetoduplicate:$o| domethodsstop:$m:6| </code> </lib> <lib> <name>selectdisk</name> <code>jumpif:$v.diskgroupid:=:0:MSG1| jumpif:$v.diskgroupid:=:1:MSG2| jumpif:$v.diskgroupid:=:69696969:MSG2| domethodserrorjump:$m:63:ERROR| jump:CONTINUE| label:ERROR| print:Error occurred resetting volume defaults when changing disk folder.| label:CONTINUE| runlib:gotoredundancy| end| label:MSG1| msgbox:You must select a Disk Folder for the volume.:$w.title:E| stop| label:MSG2| msgbox:You must select a folder other than "Unassigned" or "External Devices".:$w.title:E| stop| </code> </lib> <lib> <name>selectPagepool</name> <code>setobjectnull:$y| loop:$h| jumpif:$h.selected:=:false:NEXT| setobject:$h:$y| jump:OUT| label:NEXT| endloop:$h| label:OUT| jumpnull:$y:NOSELECTION| jumpif:$y.status:i!=:1:DOWN| jumpif:$y.xstatus:i!=:1:DOWN| runlib:checkPagepool| stop| label:DOWN| msgbox:Unable to use the selected storage type for volume creation because it is currently down.:$w.title:W| stop| label:NOSELECTION| msgbox:You must select a storage type for this volume.:$w.title:W| stop| </code> </lib> <lib> <name>checkRedundant</name> <code>runlib:getDiskFolder| jumpnull:$z:DFERROR| vectorget:$z.redundantPagepools:$h| runlib:checkPagepools| stop| label:DFERROR| msgbox:Error retrieving disk folder information.:$w.title:E| stop| </code> </lib> <lib> <name>checkNonRedundant</name> <code>runlib:getDiskFolder| jumpnull:$z:DFERROR| vectorget:$z.nonredundantPagepools:$h| runlib:checkPagepools| stop| label:DFERROR| msgbox:Error retrieving disk folder information.:$w.title:E| stop| </code> </lib> <lib> <name>checkDualRedundant</name> <code>runlib:getDiskFolder| jumpnull:$z:DFERROR| vectorget:$z.dualRedundantPagepools:$h| runlib:checkPagepools| stop| label:DFERROR| msgbox:Error retrieving disk folder information.:$w.title:E| stop| </code> </lib> <lib> <name>getDiskFolder</name> <code>newobject:diskfolder:$z| getstop:$z:$v.diskgroupid| jumpif:$v.sourcesecure:=:false:NOSED| jumpif:$z.DARP:i=:4:NOSED| msgbox:WARNING! Destination folder is not Secure Data protected. :$w.title:W| label:NOSED| </code> </lib> <lib> <name>checkPagepools</name> <code>jumpif:$h.count:=:0:ZERO| jumpif:$h.count:=:1:ONE| jumpif:$u.DisallowDataPageSizeChange:=:true:FIND2MB| loop:$h| jumpif:$h.DataPageSize:i=:4096:SELECT| setattr:$h.selected:false| jump:NEXT| label:SELECT| setattr:$h.selected:true| label:NEXT| endloop:$h| goto:selectpagepool| stop| label:FIND2MB| loop:$h| jumpif:$h.DataPageSize:i=:4096:FOUND| endloop:$h| goto:selectpagepool| stop| label:FOUND| setobject:$h:$y| runlib:checkPagepool| stop| label:ZERO| runlib:primeDiskFolder| stop| label:ONE| setobject:$h:$y| runlib:checkPagepool| </code> </lib> <lib> <name>primeDiskFolder</name> <code>jumpif:$w.userprivlevel:i!=:5:NOPRIV| setattr:$p.isPrimed:false| runwiz:PrimeStorage:$z| jumpif:$p.isPrimed:=:true:FOUND| setattr:$v.runningDP:false| runlib:cancelprime| end| label:FOUND| jumpif:$v.diskFailureProtection:i=:0:NONREDUNDANT| jumpif:$v.diskFailureProtection:i=:2:DUALREDUNDANT| runlib:checkRedundant| stop| label:NONREDUNDANT| runlib:checkNonRedundant| stop| label:DUALREDUNDANT| runlib:checkDualRedundant| stop| label:NOPRIV| getmsg:3267:$v.noprivmsg:$m.name| msgbox:$v.noprivmsg:$w.title:W| stop| </code> </lib> <lib> <name>checkPagepool</name> <code>geterrorjump:$y:ERROR| jumpif:$y.status:i!=:1:DOWN| jumpif:$y.xstatus:i!=:1:DOWN| setattr:$m.PagePoolIndex:$y.objectid| domethodserrorjump:$m:66:DEFAULTSERROR| jump:CONTINUE| label:DEFAULTSERROR| print:Error occurred resetting volume defaults when changing disk folder or storage type.| label:CONTINUE| runlib:createVolume| stop| label:DOWN| setattr:$v.runningDP:false| goto:pagepooldown| stop| label:ERROR| msgbox:Unable to retrieve storage type information. Storage type may no longer be available.:$w.title:E| stop| </code> </lib> <lib> <name>createVolume</name> <code>setattr:$p.diskFailureProtection:$v.diskFailureProtection| runlib:createVolumeDP| </code> </lib> <lib> <name>afterCreateVolumeDP</name> <code>setattrobject:$v.importTemplate:$m.snapshotprofile| runlib:checkPagepool2| </code> </lib> <lib> <name>checkPagepool2</name> <code>geterrorjump:$y:ERROR| jumpif:$y.status:i!=:1:DOWN| jumpif:$y.xstatus:i!=:1:DOWN| setattr:$v.runningDP:false| runlib:save| stop| label:DOWN| setattr:$v.runningDP:false| goto:pagepooldown2| stop| label:ERROR| msgbox:Unable to retrieve storage type information. Storage type may no longer be available.:$w.title:E| stop| </code> </lib> <lib> <name>cancelprime</name> <code>jumpif:$u.diskgroupidprompt:=:true:CHECKSKIPDISKS| jump:CHECKREDUNDANCY| label:CHECKSKIPDISKS| jumpif:$v.skipdisks:!=:YES:GOTODF| jump:CHECKREDUNDANCY| label:CHECKREDUNDANCY| jumpif:$u.redundantonly:=:false:GOTODF| return| label:GOTODF| goto:diskfolder| </code> </lib> <lib> <name>fixstoragelabels</name> <code>setattr:$v.pageclassmode:0| jumpif:$u.DPPrompt:=:false:NODP| runlib:fixdplabels| stop| label:NODP| setattr:$v.storageLabel1:| setattr:$v.storageValue1:| setattr:$v.storageLabel2:| setattr:$v.storageValue2:| stop| </code> </lib> <lib> <name>fixnodplabels</name> <code>setattr:$v.storageLabel1:$v.labelValue3| setattr:$v.storageValue1:$m.StorageTierDisplay| jumpif:$m.DiskFailureProtection:i=:1:REDUNDANT| setattr:$v.storageLabel2:| setattr:$v.storageValue2:| stop| label:REDUNDANT| setattr:$v.storageLabel2:$v.labelValue2| setattr:$v.storageValue2:$m.RaidTypesDisplay| </code> </lib> <lib> <name>fixdplabels</name> <code>setattr:$v.storageLabel1:$v.labelValue1| setattr:$v.storageValue1:$m.DPTemplateName| setattr:$v.storageLabel2:| setattr:$v.storageValue2:| </code> </lib> <lib> <name>fixcompressionlabels</name> <code>jumpif:$m.CompressionSupported:=:true:COMPRESSIONSUPPORTED| setattr:$v.compressionLabel:| setattr:$v.compressionValue:| stop| label:COMPRESSIONSUPPORTED| setattr:$v.compressionLabel:$v.compressionLabelString| jumpif:$v.dataoptimization:=:true:COMPRESSION| setattr:$v.compressionValue:No| stop| label:COMPRESSION| setattr:$v.compressionValue:Yes| </code> </lib> <lib> <name>save</name> <code>domethodsstop:71| //CMD_DISABLE_SSD_WRITE_CACHE| domethodsstop:84| cmdlistnew| cmdlistaddset:$m| cmdlistadddomethods:$m:69| setattr:$w.intervalsToWait:6000| concat:Create Volume~:$m.name:$v.processname| cmdlistrun:$v.processname| concat:Creating Volume ":$m.name:$w.asyncwaitmsg| concat:$w.asyncwaitmsg:".:$w.asyncwaitmsg| goto:bpwait| stop| </code> </lib> <lib> <name>postsave</name> <text>Refreshing Volume Information</text> <backcode>cmdlistretrieveobject:$m:volume| clearversion:History| clearversion:PITCVolumeRuleGroup| jumpnull:$m:SKIP| domethodsstop:$m:52| label:SKIP| refreshlist:com.compellent.scheduleviewer.MultiScheduleViewer| refreshnode:storagenode| </backcode> <code>jumpnull:$m:FOCUSI| jumpif:$m.objectid:i!=:0:CONTINUE| //msgbox:Could not find the created Volume.^^Click Refresh to confirm volume creation^has complete successfully.:$w.title:E| jump:FOCUSI| end| label:CONTINUE| jumpif:$v.dataoptimization:=:false:CONTINUE2| cmdlistnew| cmdlistadddomethods:$m:86| cmdlistrun| label:CONTINUE2| setlastref:$m| focusexplorer:$m| jumpif:$v.fromcmm:=:true:DUPLICATE| jumpif:$v.runnewmap:=:true:NEWMAP| jumpif:$v.runmap:=:true:MAP| jumpif:$v.skiplinker:=:YES:FROMLINKER| concat:Volume~:$m.name:$v.linkmsg| concat:$v.linkmsg:~has been created.:$v.linkmsg| jumpif:$v.fromlinker:=:YES:FROMLINKER| setattr:$p.DisplayMsg:$v.linkmsg| stopif:$v.linkerran:=:true| setattr:$v.linkerran:true| runwiz:Linker:$m:$o| return:$o| label:FROMLINKER| return:$m:$v.linkmsg| label:DUPLICATE| return:$m| label:MAP| newobject:wizvar:$p| setattr:$p.serverid:$v.serverid| stopif:$v.mapran:=:true| setattr:$v.mapran:true| runwiz:Map:$m| return| label:NEWMAP| newobject:wizvar:$p| setattrobject:$p.MapServer:$v.defaultServer| setattr:$p.SkipMapFinish:true| stopif:$v.mapran:=:true| setattr:$v.mapran:true| runwiz:CreateMapProfile:$m| return| stop| label:FOCUSI| jumpnull:$i:NULL| focusexplorer:$i| label:NULL| return| </code> </lib> <lib> <name>createVolumeDP</name> <code>runlib:checkdplicense| runlib:makecachewarnings| clearversion:PagePool| domethodsstop:91| jumpif:$v.canbecompressed:!=:true:SKIP2| goto:sizeopt| stop| label:SKIP2| goto:size| stop| </code> </lib> <lib> <name>checkdplicense</name> <code>setattr:$v.pageclassmode:0| stop| </code> </lib> <lib> <name>checkprogression</name> <code>domethodsstop:24| jumpif:$m.WritableClassMask:=:0x0:NEEDWRIT| jumpif:$m.HistoricalClassMask:=:0x0:NEEDHIST| stop| label:NEEDWRIT| msgbox:You must select at least one class of storage for writable data.:$w.title:E| end| label:NEEDHIST| msgbox:You must select at least one class of storage for replay data.:$w.title:E| end| </code> </lib> <lib> <name>makecachewarnings</name> <code>setattr:$v.SystemReadCacheWarning:| setattr:$v.SystemWriteCacheWarning:| getattrobject:$s.cache:$o| stopnull:$o| jumpif:$o.RCacheEnable:i=:2:RNOTENABLED| jumpif:$o.RCacheStatus:i=:2:RDOWN| jump:WRITE| label:RNOTENABLED| setattr:$v.SystemReadCacheWarning:WARNING - System read cache is not enabled.| jump:WRITE| label:RDOWN| setattr:$v.SystemReadCacheWarning:WARNING - System read cache is down.| label:WRITE| jumpif:$o.WCacheEnable:i=:2:WNOTENABLED| jumpif:$o.WCacheStatus:i=:2:WDOWN| stop| label:WNOTENABLED| setattr:$v.SystemWriteCacheWarning:WARNING - System write cache is not enabled.| stop| label:WDOWN| setattr:$v.SystemWriteCacheWarning:WARNING - System write cache is down.| stop| </code> </lib> <lib> <name>makevolumefolder</name> <code>newobject:wizvar:$p| setattr:$p.skipintro:YES| runwiz:CreateVolumeFolder::$o| stopnull:$o| stopif:$o.type:!=:volumefolder| refreshdata| setattr:$m.parentobjectid:$o.objectid| redraw| </code> </lib> <lib> <name>selectallcache</name> <code>setattr:$m.RCacheRAStatus:1| setattr:$m.RCacheStatus:1| setattr:$m.cachestatus:1| refresh| </code> </lib> <lib> <name>unselectallcache</name> <code>setattr:$m.RCacheRAStatus:2| setattr:$m.RCacheWStatus:2| setattr:$m.RCacheStatus:2| setattr:$m.cachestatus:2| refresh| </code> </lib> <lib> <name>changesystemcache</name> <code>runwiz:ConfigureSystemCache| runlib:makecachewarnings| goto:advancedoptions| stop| </code> </lib> <lib> <name>makereplaytemplate</name> <code>runwiz:CreateReplayTemplate::$z| clearversion:PITCRule| clearversion:PITCRuleGroup| retrievetable:PITCRuleGroup:$g| vectorset:$g:$v.ReplayTemplateVector| gnew| gadd:$z| vectorset:$g:$v.SelectedTemplatesVector| clearcache| redraw| </code> </lib> </instructions> </xml>在这里面的方法
最新发布
07-09
在处理XML文档时,若需查找与 `<xml>` 标签相关的内容或解析其中的方法信息,可结合 XML 解析库的功能来提取特定标签及其嵌套结构。例如,在 Java 环境中使用 DOM4J 或 XStream 等工具可以实现对 XML 数据的解析和操作。 ### 使用 DOM4J 提取 `<xml>` 标签内容 DOM4J 是一种行的 XML 处理库,其提供便捷的方法访问 XML 文档中的节点、属性和值。以下是一个基于 DOM4J 的示例代码,展示如何获取 `<xml>` 标签内的数据: ```java import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class XMLParser { public static void main(String[] args) throws Exception { SAXReader reader = new SAXReader(); Document document = reader.read("example.xml"); // 读取 XML 文件 Element root = document.getRootElement(); // 获取根元素 if ("xml".equals(root.getName())) { // 判断根元素是否为 <xml> System.out.println("找到 <xml> 标签"); for (Object obj : root.elements()) { // 遍历 <xml> 下的子元素 Element element = (Element) obj; System.out.println("子标签: " + element.getName() + ", 值: " + element.getText()); } } } } ``` 该方法通过 `SAXReader.read()` 构建 XML 源的 DOM4J 文档,并利用 `Document.getRootElement()` 获取根元素[^1]。如果根元素名称是 `<xml>`,则进一步遍历其子节点以提取信息。 ### 使用 XStream 解析并映射到对象 XStream 可用于将 XML 内容直接转换为 Java 对象,尤其适用于已知 XML 结构的情况。例如,若 `<xml>` 标签内包含特定格式的数据,可通过注解方式绑定字段: ```java import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class XMLToObject { public static void main(String[] args) { String content = "<xml><name>Alice</name><age>30</age></xml>"; XStream xstream = new XStream(new DomDriver()); // 初始化 XStream 实例 xstream.processAnnotations(XmlData.class); // 注册类注解 xstream.alias("XmlData", XmlData.class); // 设置别名 XmlData data = (XmlData) xstream.fromXML(content); // 将 XML 转换为对象 System.out.println(data.name + ", " + data.age); } static class XmlData { private String name; private int age; // Getter 和 Setter 方法 } } ``` 此方法通过 `xstream.fromXML()` 将字符串形式的 XML 转换为 Java 对象,从而简化了 `<xml>` 标签内部数据的访问过程[^3]。 ### MyBatis 中的 XML 标签处理 在 MyBatis 框架中,`<foreach>` 标签常用于动态构建 SQL 查询语句,适用于 `<xml>` 标签内涉及集合操作的情形。例如,当 `<xml>` 包含多个 ID 值时,可以通过 `<foreach>` 循环拼接查询条件: ```xml <select id="findUserList" parameterType="map" resultType="User"> SELECT * FROM USER <where> <if test="ids != null and ids.size > 0"> <foreach collection="ids" item="user_id" open="AND (" close=")" separator=" OR "> id=#{user_id} </foreach> </if> </where> </select> ``` 该方法展示了如何在 MyBatis 的 XML 配置文件中,利用 `<foreach>` 标签循环处理 `<xml>` 中的集合型数据[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值