I/O和XML

来源:互联网 发布:腾讯电脑管家 linux 编辑:程序博客网 时间:2024/05/04 00:12

1 I/O

1.1 File类:

File类定义了一系列与操作系统无关的方法来操作文件和目录。一个File对象可以代表一个文件,也可以代表一个目录。创建一个File类对象后,如果是目录可以显示目录清单、新建或删除目录;如果是文件,可以查阅文件的属性和路径信息,也可以输出和改名。可以通过查阅API帮助文档了解更多的相关内容。

1.2 I/O系统

Java编程中,I/O系统主要负责文件的读写,一般在运行程序时,Java I/O程序将源磁盘、文件或网络上的数据通过输入流类的相应方法读入到内存中,然后通过输出流类的相应方法将处理完的数据写回目标文件、磁盘或网络资源指定位置。

I/O系统类库位于java.io包中,提供了全面的I/O接口,包括文件读写、标准设备输出等。JavaI/O是以流为基础进行输入和输出,所有数据被串行化写入输出流,或者从输入流读入。

1.2.1 流的概念

流(Stream)是一个抽象的概念。代表一串数据的集合,当Java程序需要从数据源读取数据时,就需要开启一个到数据源的流。同样,当程序需要输出数据到目的地时,也需要开始一个流。流的创建是为了方便地处理数据的输入和输出。

可以把数据流想象成现实生活中的水流,每户人家中要用自来水,就需要在家和自来水厂之间一根水管,这样水厂的水才能通过水管流到用户家中。同样,要把河流中的水引导导自来水厂中,也需要在河流和水厂之间街上一根水管,这样河流中的水才能流到水厂中去。水管相当于流,水相当于数据源。

Java程序中,想要获取数据源中的数据,需要在程序和数据源之间建立一个数据输入的通道,这样就能从数据源中获取数据。如果要在程序中把数据写到数据源中,也需要在程序和数据源之间建立一个数据输出通道。在程序中创建输入流对象时就会自动建立这个数据输入通道,而创建输出流对象时就会自动建立这个数据的输出通道。

Java程序(读取数据)《====输入流=====数据源

Java程序(写出数据)=======输出流===》数据源

 

1.2.2 流的分类

Java中的流可以按如下方式分类:

1)按数据流向

输入流:程序可以向其中读取数据的流

输出流:程序可以向其中输出数据的流

2)按数据传输的单位

字节流:以字节为单位传输数据的流(主要用于处理可直接读取bytes的数字)

字符流:以字符为单位传输数据的流(主要用于处理文本)

3)按流的功能

节点流:用于直接操作数据流的流。

过滤流:也叫处理流,是对一个已存在流的链接和封装,来提供更为强大、灵活读写功能

1.2.3 I/O流的使用

抽象类

字节流  字符流

输入流 InputStream     Reader

输出流 OutputStream  Writer

InputStreamOutputStream都是以字节为单位的抽象流类,他们规定了字节流所有输入和输出的基本操作。InputStreamOutputStream抽象类不能直接使用,而是使用子类(具体类)完成不同的功能。

ReaderWriter抽象类都是以字符为单位的抽象类。他们规定了所有字符流输入和输出的基本操作。ReaderWriter抽象类不能直接使用,而是使用子类(具体类)完成不同的功能。

 

 

1.2.4 I/O具体类(实现类)

1FileInputStreamFileOutputStream:是以字节为操作单位的文件输入流和文件输出流,利用这两个类可以对文件进行读写操作。

注意:FileInputStream读取中文字符会出现乱码,原因是在Unicode编码中,一个英文字符是用一个字节编码,而一个中文字符则是用两个字节编码,而用字节流读取中文时,是一个一个字节读取,所以会出现编码错误。

注意:FileOutputStream往文件中写入的中文字符没有乱码,原因是程序先把中文字符转成了字节数组,打开文件时文件编辑器(如Windows记事本)能自动识别成中文字符。

2FileReaderFileWriter:是以字符为操作单位的文件输入流和文件输出流。利用这连个类可以对字符文本进行读写操作。

注意:FileReader读取中文字符不会出现乱码。

3)BufferedInputStreamBufferedOutputStream:针对字节的缓冲输入流和输出流。利用这两个类可以提高数据读写的速度。因为他们会创建一个内部缓冲区数组,所有读取或写入的字节都会先填充这个缓冲区,然后一次性读取或写入到目标数据源中。

4BufferedReaderBufferedWriter:针对字符的缓冲输入流和输出流。利用这两个类可以提高数据读写的速度。BufferedReader还支持读取整行数据。

注意:在操作字节文件或字符文件时,建议使用带缓冲功能的输入流和输出流,以提高程序的效率。

5)其他输入流和输出流

ZipInputStreamZipOutputStream:实现ZIP压缩文件的读写功能:

RandomAccessFile:实现在文件的任何地方读写数据。

PrintSteamPrintWriter:实现提供一系列的printprintln方法。

System.out.println中的System.out就是PrintStream的实例。

DatainputStreamDataOutputStream:实现从文本读取和写入文本的基本类型的数据。

InputStreamReaderOutputStreamWriter:实现字节流和字符流之间的转换

1.2.5 对象的序列化和反序列化

JDK提供了ObjectOutputStreamObjectInputStream两个类用于存储和读取基本数据类型或对象.它最强大之处就是可以吧Java中的对象写入到数据源中,也能把对象从数据源中还原回来.

ObjectOutputStream类存储基本类型数据或对象的机制叫做序列化;

ObjectInputStream类读取基本类型数据或对象的机制叫反序列化;

特点:

1)能被序列化的对象所对应的类必须要实现java.io.Serializable这个标示性接口(这个接口中没有抽象方法).凡是实现该接口的类都有一个表示序列化版本标识的静态变量.

private static final long serialVersionUID;//用来表明类的不同版本的兼容性

可以通过Eclipse自动添加.

2)在序列化过程中,其所属类的static属性和方法代码不能被序列化处理.

3)对于个别不希望被序列化的非静态属性可以在属性声明时使用transient关键字进行标明.


2 XML

2.1  

XML(eXtended Markup Language) 可扩展标记语言的缩写,是一种类似HTML的标记。

XML是被设计用来描述数据,能够用纯文本的形式表现各种结构复杂的数据,易于在各平台上构造和解析,因此在跨品台网络数据交换,数据存储等方面得到广泛的应用。

可扩展:指程序员可以定义自己需要的标记,创建自己的标记语言,但定义标记时必须遵守XML规范。

标记语言:也称为置标语言,是一种将文本以及文本相关的其他信息结合起来,展现出关于文本结构和数据处理细节的电脑文字编码。当今广泛使用的标记语言有超文本标记语言(HyperText Markup LanguageHTML)和扩展标记语言(XML)。标记语言广泛应用于网页和网络应用程序等。

XML文档的组成由序言(XML声明,处理指令,文档类型定义,注释)和文档元素(根元素,元素,属性,文本)。

XML声明一般是XML文档的第一行,由以下几个部分组成

-version--文档符合XML1.0规范,现在只有1.0

-encoding--文档字符编码,默认为“UTF-8

-standalone--文档定义是否在一个文件内

 ·standalone="yse"

 ·standalone="no"

<?xmlversion="1.0" encoding="UTF-8" standalone="yes"?>

<!--这是一个注释-->

注释内容中不要出现--;

不要把注释放在标记中间;

注释不恩能够嵌套;

可以再除标记以外的任何地方放注释.

处理指令用于XML解析器传递信息到应用程序.

-XML解析器是读取并保存XML文档内容的软件模块

-应用程序是从解析器获取文档内容并处理和现实这些内容的独立软件模块

-IE同事提供XML解析器和应用部分

格式:<?处理指令名称 处理指令信息?>

-<?xml:stylesheet type="text/xsl" href="example.xsl"?>

-指明了与其所属文档配套使用的样式表的类型为XSL.如果没有指定样式表,则浏览器按照自己默认的样式显示文档内容.

                                                 

2.2 XML元素

<TITLE> lovoinfo.com </TITLE>

   ↑      ↑         ↑

元素开始  文本     元素结束

<TITLE/>   <TITLE></TITLE>  <TITLE ID="101"/>空元素

元素之间的关系:子元素父元素  祖先后代

元素内容的类型嵌套元素/字符数据/实体引用/CDATA/处理指令/注释

2.2.1 XML根元素

每个XML文档必须有且只有一个根元素

根元素是一个完全包括文档中其他所有元素的元素

根元素的起始标记要放在所有元素的起始标记之前

根元素的结束标记要放在所有元素的结束标记之后

2.2.2 XML实体

XML中预定义的符号如"<"  ">" 可以使用预定义的实体来代替

< <

> >

& &

" "

' '

2.2.3 XML元素属性

<Student ID="100">

 <Name>TOM</Name>

</Student>

属性值用双引号或单引号分割

一个元素可以有多个属性,它的基本格式为:<元素名 属性名="属性值">

特定的属性名称在同一个元素标记中只能出现一次

属性值不能包括<>&

2.2.4 CDATA

用于把争端文本解释为纯字符数据而不是标记的情况.包含大量<>&"字符.CDATA节中的所有字符都会被当作元素字符数据的常量部分,而不是XML标记

CDATA是不被解析器解析的文本.文本内的标签不会被当做标记,实体不会被展开.

语法<![CDATA[

------------..........

]]>

可以输入任意字符除]]>外 ,不能嵌套

2.2.5 语法规范

-必须有XML声明语句

<>xml version="1.0" ebcoding="gb2312"?>

gb2312 简体中文

-必须有且仅有一个根元素

-标记大小写敏感

-属性值用引号

-标记成对

-空标记关闭

-元素正确嵌套

2.3 XML技术体系概述

本当描述与校验技术DTDSchema都是用于定义XML结构,并且用于校验我们书写的XML文档是否符合要求的技术.

文档转换技术(XSL/XSLT)

文档查询技术(XPath/XQuery)

文档解析技术(XML DOM/SAX)

文档链接和定位技术(XLink/XPointer)

2.3.1 XML解析技术

文档对象模型(DOM) 一种基于树结构的API

XML简单API(SAX)一种时间驱动的API

2.3.2 DOMSAX的区别

DOM核心是按树的结构处理XML数据,DOM解析器读取XML文档并在内存中建立一个文档树结构,通过操作此结构来处理XML文档.DOM优点是编程容易,可以从上到下多次遍历;缺点是由于DOM解析时需要将XML文档整个读入内存,所以占用内存大,不适合大型XML文档的解析.

SAX核心是事件驱动处理机制,它采用逐行扫描文档,一边扫面一边解析的方式.由于SAX不需要将XML文档整个读入内存,所以有点是占用内存少,效率高,适合大型XML文档的解析;缺点是事件触发是有序的,文档只能遍历一次.

0 0