Java读写类

合集下载

xml基本写法和dtdschema的用法,JAVA读写XML

xml基本写法和dtdschema的用法,JAVA读写XML

xml基本写法和dtdschema的⽤法,JAVA读写XML1. 标记语⾔ 标记语⾔,是⼀种⽂本(Text)以及⽂本相关的其他信息结合起来,展现出关于⽂档结构和数据处理细节的电脑⽂字编码.当今⼴泛使⽤的标记语⾔是超⽂本标记语⾔(Hyper Text Markup Language,HTML)和可扩展标记语⾔(eXtensible Markup Language,XML). 标记语⾔⼴泛应⽤于⽹页和⽹络应⽤程序.1) 超⽂本标记语⾔HTML(Hyper Text Markup Language)写法格式: <a href="link.html">link</a>关注数据的展⽰与⽤户体验标记是固定的,不可扩展(如<a></a>表⽰超连接)2) 可扩展的标记语⾔XML(eXtensible Markup Language)写法格式:同html样式<a>link</a>仅关注数据本⾝标记可扩展,可⾃定义3) Xml 和 Html语⾔由同⼀种⽗语⾔SGML(Standard Generalized Markup language,标准通⽤标记语⾔)发展出来.4)解析器专业解析器(⽐如:XML SPY 专⽤于解析XML⽂件)浏览器MyEclipse5)W3C(World Wide Web Consortium)W3C:开源的语⾔协会,万维⽹联盟(World Wide Web Consortium)HTML 和 XML 都是W3C制定的语⾔规则官⽹:学习⽹站:2.xml语法规则2.1 xml的声明:xml的声明必须写在⽂件第⼀⾏Encoding(字符集)属性可以省略,默认的字符集是utf-8例⼦:1<?xml version="1.0" encoding="UTF-8"?>2<书>3<武侠⼩说 isbn="1001">4<书名>天龙⼋部</书名>5<作者>⾦庸</作者>6<价格>50</价格>7<简介>⼀本好书</简介>8</武侠⼩说>9<计算机>10<书名>疯狂java</书名>11<作者>李刚</作者>12<价格>50</价格>13<简介>⼀本好书</简介>14</计算机>15</书>常见错误写法:1) "?"和xml之间不能有空格2) 声明必须顶头写,不能有空⾏或空格(⽤FireFox浏览器打开)3) 等号左右不要多写空格(java程序员的习惯)浏览器不会报错,但是在xml解析时会出问题2.2 标记1)诸如<书名></书名>,这样格式的被称为标记2)标记必须成对出现3)标记包含开始标记和结束标记<书名>天龙⼋部</书名>注意:标记⼤⼩写敏感2.3元素(Element)1) 元素: 元素= 标记 + 其中内容 ,如<书名>天龙⼋部</书名>2) 根元素: 最外层的元素 (如 <书></书>)3) 叶⼦元素: 最⾥层(没有⼦元素的)的元素 (如,<书名></书名>,<价格></价格>)4) 空元素: 没有内容的元素叫空元素,⽐如:<a></a> ,<br></br>,可以简写为<a/> <br/>5) 元素必须遵循的语法规则a. 所有的标记都必须有结束b.开始标记和结束标记必须成对出现c.元素必须正确嵌套<a><b>c</b></a> (正确)<a><b>c</a></b> (错误)d.标记的⼤⼩写敏感Hello 和 hello不是同⼀个标记e.有且只能有⼀个根元素2.4 实体引⽤(转义字符)1) ⼩于号(<) : less then --> &lt;2) ⼤于号(>) : great than --> &gt;3) And符号(&) : &amp;4) 双引号 ( ") : &quot;5) 单引号( ') : &apos;注意这些转义字符都是以&开头,以 ; 结尾例如:想给天龙⼋部加上书名号<<天龙⼋部>><?xml version="1.0" encoding="UTF-8"?><书><武侠⼩说 isbn="1001"><书名>&lt;&lt;天龙⼋部&gt;&gt;</书名><作者>⾦庸</作者><价格>50</价格><简介>⼀本好书</简介></武侠⼩说></书>2.5属性(定义在开始标记中的键值对)1)格式: 属性="属性值"如<武侠⼩说 isbn="1234"></武侠⼩说>isbn是武侠⼩说的属性,值是12342)要求:属性必须有值属性值必须⽤引号引起来,单引号或双引号都可以,但必须⼀致2.6 CDATA 类型的数据:特殊标签1) 格式: <![CDATA[⽂本内容]]>2) 特殊标签中的实体引⽤都被忽略,所有内容被当成⼀整块⽂本数据对待例如<书><武侠⼩说 isbn="1235" lang="zh"><书名 hot="true">笑笑江湖</书名><作者>⾦庸</作者><价格>45</价格><简介><![CDATA[⼀本好书,没有<<笑傲江湖>>好看]]></简介></武侠⼩说></书>2.8 注释(xml和html相同)1)格式: <!-- 这是⼀段注释 -->2) 编译器将忽略注释3) Html和xml注释⽅式相同例⼦:1<?xml version="1.0" encoding="UTF-8"?>2<书>3<!-- 这是⼀段注释 -->4<武侠⼩说 isbn="1001">5<书名>&lt;&lt;天龙⼋部&gt;&gt;</书名>6<作者>⾦庸</作者>7<价格>50</价格>8<简介>⼀本好书</简介>9</武侠⼩说>10</书>2.8 规则⼩结1) 必须有唯⼀的根元素2) xml标记⼤⼩写敏感3) 标记必须配对出现,有开始有结束4) 元素必须被正确嵌套5) 属性必须有值,值必须⽤引号引起来6) 如果遵循全部上述规则,称作well-formed⽂件(格式良好的xml⽂件) 2.9 使⽤XML⽂件描述数据的例⼦1) 早期属性⽂件描述数据的⽅式url = jdbd:oracle:thin@192.168.0.205:1521:dbsiddbUser = openlabdbPwd = open1232) 现在使⽤xml表⽰⽅式<?xml version="1.0" encoding="UTF-8"?><书><!-- 这是⼀段注释 --><武侠⼩说 isbn="1001"><书名>&lt;&lt;天龙⼋部&gt;&gt;</书名><作者>⾦庸</作者><价格>50</价格><简介>⼀本好书</简介></武侠⼩说></书>3. DTD/Schema1) DTD/Schema:⽤来规范XML的标记规则2)有效的xml⽂件(valid xml file) = 格式良好的xml⽂件 + 有DTD或Schema规则 + 遵循DTD或Schema规则3.1 DTD/Schema的作⽤⾏业交换数据时要求xml⽂件格式相同,所以需要⼤家遵守规范的xml⽂件格式,⽐如两份xml⽂件要有相同的元素嵌套关系,相同的属性定义,相同的元素顺序,元素出现相同次数等3.2⽂档类型定义DTD(Document Type Difinition)1) DTD⽂档⽤来定义XML⽂件的格式,约束XML⽂件中的标记规则2) DTD类型PUBLIC(⾏业共⽤的)SYSTEM(⼩范围⾃定义的)3.2.1 DTD中的定义规则必须列出所有节点,⼀个都不能少1)元素"*"星号表⽰可以出现0-n次"+"加号表⽰可以出现1-n次"|" 表⽰或(只能出现⼀个)如(phone|mobile)表⽰固话或⼿机⼆选⼀"?"问号: 表⽰出现0或1此#PCDATA 表⽰字符串2)属性:定义在开始标记中的键值对dtd 规则_属性1) <!ATTLIST 标记名称属性名称属性类型>2) isbn CDATA #REQUIRED: 表⽰isbn属性是必须的3) isbn CDATA #IMPLIED: 表⽰isbn属性不是必须的4) hot CDATA"false" :表⽰hot默认值是false例⼦3.2.1⾸先是dtd⽂件book.dtd<!ELEMENT 书 (武侠⼩说, br)*><!ELEMENT 武侠⼩说 (书名,作者+,价格,简介)><!ELEMENT 书名 (#PCDATA)><!ELEMENT 作者 (#PCDATA)><!ELEMENT 价格 (#PCDATA)><!ELEMENT 简介 (#PCDATA)><!ELEMENT br EMPTY><!ATTLIST 武侠⼩说 isbn CDATA #REQUIREDlang CDATA #IMPLIED><!ATTLIST 书名 hot CDATA #IMPLIED>在XML中使⽤<?xml version="1.0"?><!DOCTYPE 书 SYSTEM "book.dtd"><书><武侠⼩说 isbn="1234" lang="zh"><书名 hot="false">&lt;&lt;天龙⼋部&gt;&gt;</书名><作者>⾦庸</作者><作者>古龙</作者><价格>45</价格><简介>⼀本好书</简介></武侠⼩说><br></br><武侠⼩说 isbn="1235" lang="zh"><书名 hot="true">笑笑江湖</书名><作者>⾦庸</作者><价格>45</价格><简介><!-- 这是⼀段注释 --><![CDATA[⼀本好书,没有<<笑傲江湖>>好看CDATA中的所有特殊字符都不解释(原样显⽰)]]></简介></武侠⼩说><br></br></书>3.3 Schema ,DTD的升级版与DTD的区别1)命名空间(NameSpace)XML⽂件允许⾃定义标记,所以可能出现来⾃不同源DTD或Schema⽂件的同名标记,为了区分这些标记,就需要使⽤命名空间.命名空间的⽬的是有效的区分来⾃不同DTD的相同标记⽐如xml中⽂件中使⽤了命名空间区分开"表格"和"桌则":<html:table><line><column>这是⼀个表格</column></line></html;table><product:table><type>coff table</type><product:table>2) 因为DTD⽆法解决命名冲突,所以出现Schema,它是DTD 的替代者,dtd和Schema的功能都是描述xml结构的3) Schema使⽤xml语法实现(Schema本⾝就是xml⽂件)因为⽤于规范和描述xml⽂件的定义⽂件(schema)本⾝也是xml⽂件,所也xml也被称为⾃描述的语⾔4) Schema ⽂件的扩展名xds: XML Schema Difinition(简称XSD,遵循W3C标准)5) Schema中的名词:复杂元素(有⼦元素的元素)简单元素(叶⼦元素)例⼦:email.xsd<?xml version="1.0" encoding="UTF-8"?><schema xmlns="/2001/XMLSchema" targetNamespace="/email" xmlns:tns="/email" elementFormDefault="qualified"> <element name="email"><complexType><sequence><element name="from" type="string"/><element name="to" type="string"/><element name="subject" type="string"/><element name="body" type="string"/></sequence></complexType></element></schema>被规范的⽂件email.xml<?xml version="1.0" encoding="UTF-8"?><tns:email xmlns:tns="/email" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/email email.xsd "><tns:from>赵敏</tns:from><tns:to>张⽆忌</tns:to><tns:subject>HIHI</tns:subject><tns:body>看泰坦尼克号</tns:body></tns:email>3.4 根据DTD或者Schema来写xml⽂件的⽅法在MyEclipse中右键New --> xml (Basic Templates) -->输⼊⽂件名-->next-->选择是DTD还是Schema4. java API 解析XML⽂件(读xml⽂件)1) Java 与xml有很多共同点(⽐如跨平台,与⼚商⽆关),⽬前位置java对xml的解析较其他语⾔更完善2) 两种解析⽅式:DOM(Document Object Model ⽂档对象模型)关键字:树(Document)优点: 把xml⽂件在内存中构造树形结构,可以遍历和修改节点缺点: 如果⽂件⽐较⼤,内存有压⼒,解析的时间会⽐较长SAX(Simple API for Xml基于XML的简单API)关键字:流(Stream)把xml⽂件作为输⼊流,触发标记开始,内容开始,标记结束等动作优点:解析可以⽴即开始,速度快,没有内存压⼒缺点:不能对节点做修改3) JDOM/DOM4J : ⽬前市场上常⽤的两种解析XML⽂件的API dom4j-1.6.1.jar 结合了DOM和SAX两种解析⽅式的优点DOM4j解析xml⽂件步骤1) 创建项⽬XMLDemo2) 加⼊dom4j的jar包(dom4j-1.6-1.jar)3) 将要解析的xml⽂件放在路径src/下4) 新建ReadXMLDemo.java4-1)构造document对象SAXReader reader = new SAXReader();Document doc = reader.read(file);4-2)取根元素:Element root = doc.getRootElement();4-3)常⽤⽅法Element elmt;elmt.elements("标记名称"):取出所有指定标记名称的元素elmt.element("标记名称"):取出第⼀个指定标记名称元素elmt.elementText("标记名称"):取elmt指定名字的⼦元素elmt.getText();取当前元素的内容Iterator it = elmt.elementsIterator("标记名称") 返回⼀个Iterator String 属性值 = elmt.attattributeValue("属性名")例⼦:ReadBookdemo源代码package day1;import java.io.*;import java.util.*;import org.dom4j.*;import org.dom4j.io.*;/*** 读⼊book.xml⽂件,取出数据并打印* @author soft01**/public class ReadBookdemo {public static void main(String[] args) {readBook("book.xml");}/*** 读⼊指定的xml⽂件,取出数据并打印* @param string*/private static void readBook(String filename) {//1..读⼊指定的⽂件,构造Document对象File file = new File(filename);SAXReader reader = new SAXReader();//XML⽂件解析器try {Document doc = reader.read(file);//解析器开始解析xml⽂件//2.获得根元素Element root = doc.getRootElement();//3.递归搜索⼦元素/* List<Element> list = root.elements("武侠⼩说");//迭代武侠⼩说的元素集合Iterator<Element> it = list.iterator(); */Iterator<Element> it = root.elementIterator("武侠⼩说");while(it.hasNext()){Element bookElmt = it.next(); //bookEmlt是武侠⼩说元素//取武侠⼩说的⼦元素System.out.println(bookElmt.elementText("书名"));//取⼦元素书名的内容 List<Element> authorList = bookElmt.elements("作者");for (Element element : authorList) {//打印作者元素内容System.out.println(element.getText());}System.out.println(bookElmt.elementText("价格"));System.out.println(bookElmt.elementText("简介"));//取武侠⼩说的属性String isbnValue = bookElmt.attributeValue("isbn");//取武侠⼩说的 lang元素String langValue = bookElmt.attributeValue("lang");System.out.println("isbn="+isbnValue);System.out.println("lang="+langValue);//取⼦元素中的属性Element nameElmt = bookElmt.element("书名");System.out.println(nameElmt.attributeValue("hot"));System.out.println("-----------------");}} catch (DocumentException e) {e.printStackTrace();}}}book.xml如下<?xml version="1.0"?><书><武侠⼩说 isbn="1234" lang="zh"><书名 hot="false">&lt;&lt;天龙⼋部&gt;&gt;</书名><作者>⾦庸</作者><作者>古龙</作者><价格>45</价格><简介>⼀本好书</简介></武侠⼩说><br></br><武侠⼩说 isbn="1235" lang="zh"><书名 hot="true">笑笑江湖</书名><作者>⾦庸</作者><价格>45</价格><简介><!-- 这是⼀段注释 --><![CDATA[⼀本好书,没有<<笑傲江湖>>好看CDATA中的所有特殊字符都不解释(原样显⽰)]]></简介></武侠⼩说><br></br></书>5 DOM4j API解析XML⽂件(⽣成)1)常⽤API⽅法:给元素增加⼦元素: elmt.addElement("标记名称");给元素增加属性: elmt.addAttribute("属性名","属性值");给叶⼦元素设值: elmt.setText("元素值");例如:要⽣成以下xml⽂件<book isbn="1001" catalog = "科幻"><name>阿⾥波特</name><author>罗林</author><price>60</price><year>2005</year></book>步骤:1.构造空的Document2.构造根元素3.递归构造⼦元素4.输出WriteBookDemo源代码package day1;import java.io.*;import org.dom4j.*;import org.dom4j.io.*;/*** 利⽤DOM4J写出xml⽂件* @author soft01**/public class WriteBookDemo {static String [][] data={{"1001", "科幻", "阿⾥波特", "罗林","60", "2005","en"},{"1002", "迷幻", "⼩波特", "罗4林","60", "2005","zh"},{"1003", "⽞幻", "中波特", "罗3林","60", "2005","en"},{"1004", "奇幻", "⼤波特", "罗2林","60", "2005","zh"}};public static void main(String[] args) {writeBook("mybook.xml");}/*** 把书的数据⽣成到指定名字的xml⽂件中* @param filename*/public static void writeBook(String filename){// 1.构造空的DocumentDocument doc = DocumentHelper.createDocument();// 2.构造根元素Element rootElmt = doc.addElement("booklist");// 3.递归构造⼦元素for(String[] book:data){Element bookElmt = rootElmt.addElement("book");//book 元素增加属性bookElmt.addAttribute("isbn", book[0]);bookElmt.addAttribute("catalog", book[1]);Element nameElmt = bookElmt.addElement("name");nameElmt.setText(book[2]);//给name 加属性nameElmt.addAttribute("lang", book[6]);Element authorElmt = bookElmt.addElement("author");authorElmt.setText(book[3]);Element priceElmt = bookElmt.addElement("price");priceElmt.setText(book[4]);Element yearElmt = bookElmt.addElement("year");yearElmt.setText(book[5]);}// 4.输出outputXml(doc,filename);}public static void outputXml(Document doc,String filename){try {//定义输出流的⽬的地FileWriter fw = new FileWriter(filename);//定义输出格式和字符集OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");//定义⽤于输出xml⽂件的XMLWriter对象XMLWriter xmlWriter = new XMLWriter(fw,format);xmlWriter.write(doc);xmlWriter.close();} catch (IOException e) {e.printStackTrace();}}}注意:运⾏程序⽣成的mybooks.xmlpackage day1;不⾃动装载,需要刷新⼀下程序运⾏通过后,在项⽬上点击右键"refreash"(或F5)如果是从别的⼯作区导⼊的项⽬,需要去别的⼯作区⽬录下找⽣成的XML⽂件6XPath(w3c的标准)1) XPath:在XML⽂件中查找或定位信息的语⾔,相当于SQL中的 selectXPath 可以通过元素/属性/值来定位或导航2) 节点(Node):相当于xml⽂件中的元素3) 指定条件定位元素的⽅式例⼦:package day1;import java.io.*;import java.util.*;import org.dom4j.*;import org.dom4j.io.*;/*** 测试XPath的功能* @author soft01**/public class XPathDemo {public static void main(String[] args) {findBook("mybook.xml");}public static void findBook(String filename){SAXReader reader = new SAXReader();try {//获得⽂档对象Document doc = reader.read(new File(filename));Node node =doc.selectSingleNode("/booklist");//查找所有的catalog="奇幻"的书2//String sql = "book[@catalog ='奇幻']";//价格>50的书//String sql = "book[price>50]";//作者等于罗林的书,并且价格⼤于50//String sql ="book[author='罗林' and price>50]";//价格⼤于50,且语⾔是zhString sql = "book[price>50 and name[@lang='zh']]"; List<Element> books = node.selectNodes(sql);for(Element e:books){System.out.println(e.getStringValue());}} catch (DocumentException e) {e.printStackTrace();}}}。

java 顺序读写文件的原理

java 顺序读写文件的原理

java 顺序读写文件的原理Java顺序读写文件的原理顺序读写文件是一种常见的文件操作方式,特别是用于处理大型文件或者需要按照固定顺序访问文件内容的情况。

Java提供了多种API和技术来实现顺序读写文件,下面将介绍其原理。

1. 读取文件(顺序读取):顺序读取文件主要通过FileInputStream类来实现。

以下是其原理:- 使用FileInputStream类的构造函数创建一个文件输入流对象,并指定要读取的文件路径。

- 创建一个字节数组或者字符数组作为缓冲区,用来存放从文件中读取的数据。

- 使用read方法从文件输入流中读取数据,并将数据存入缓冲区。

read方法会返回读取的字节数或者字符数,如果已经读取到文件末尾,则返回-1。

- 重复执行上述步骤,直到读取完整个文件内容。

2. 写入文件(顺序写入):顺序写入文件主要通过FileOutputStream类来实现。

以下是其原理:- 使用FileOutputStream类的构造函数创建一个文件输出流对象,并指定要写入的文件路径。

- 创建一个字节数组或者字符数组作为缓冲区,用来存放待写入的数据。

- 使用write方法将缓冲区中的数据写入文件输出流。

write方法会将数据写入文件并返回写入的字节数或者字符数。

- 重复执行上述步骤,直到写入完所有数据。

- 使用close方法关闭文件输出流,确保所有数据都被写入文件。

需要注意的是,顺序读写文件时要合理设置缓冲区的大小。

缓冲区太小会导致频繁的IO操作,影响性能;缓冲区太大则会占用过多内存。

因此,根据实际情况调整缓冲区大小以达到最佳性能。

另外,为了保证顺序读写文件的稳定性和可靠性,建议在读写文件时使用try-catch-finally或者try-with-resources语句块,确保资源能够被正确释放。

总结:顺序读写文件是通过Java的FileInputStream和FileOutputStream类来实现的。

java poi excel 读写

java poi excel 读写

java poi excel 读写摘要:1.Java POI 简介2.Java POI Excel 读写功能3.使用Java POI 读取Excel 文件4.使用Java POI 写入Excel 文件5.总结与展望正文:Java POI 是一个开源的Java 库,它允许Java 开发人员操作Microsoft Office 文档,如Word、Excel、PowerPoint 等。

其中,Java POI Excel 提供了读取和写入Excel 文件的功能。

1.Java POI 简介Java POI 是一个基于Apache License 2.0 协议的开源项目,它为Java 开发人员提供了一种操作Microsoft Office 文档的方法。

Java POI 支持读取和写入多种Office 文档格式,包括Excel、Word、PowerPoint 等。

通过使用Java POI,开发人员可以在不安装Microsoft Office 的情况下,对Office 文档进行操作。

2.Java POI Excel 读写功能Java POI Excel 提供了丰富的API,允许Java 开发人员对Excel 文件进行读取和写入操作。

Excel 文件主要包括两种类型:XLS 和XLSX。

Java POI 支持这两种文件格式,同时还支持读取和写入XML 格式的Excel 文件。

3.使用Java POI 读取Excel 文件使用Java POI 读取Excel 文件主要包括以下几个步骤:(1) 导入相关的Java POI 库:```javaimport ermodel.*;import ermodel.XSSFWorkbook;import java.io.FileInputStream;import java.io.IOException;```(2) 创建一个Workbook 对象,表示Excel 文件:```javaWorkbook workbook = new XSSFWorkbook(new FileInputStream("example.xlsx"));```(3) 获取工作表:```javaSheet sheet = workbook.getSheetAt(0);```(4) 遍历工作表中的行和列,获取单元格数据:```javafor (Row row : sheet) {for (Cell cell : row) {String cellValue = getCellValue(cell);System.out.print(cellValue + "t");}System.out.println();}```4.使用Java POI 写入Excel 文件使用Java POI 写入Excel 文件主要包括以下几个步骤:(1) 创建一个新的Excel 文件:```javaWorkbook workbook = new XSSFWorkbook();```(2) 添加一个新的工作表:```javaSheet sheet = workbook.createSheet("Sheet1");```(3) 创建行:```javaRow row = sheet.createRow(0);```(4) 创建单元格,并设置单元格数据:```javaCell cell = row.createCell(0);cell.setCellValue("Hello, World!");```(5) 将数据写入Excel 文件:```javatry (FileOutputStream fileOut = newFileOutputStream("output.xlsx")) {workbook.write(fileOut);} catch (IOException e) {e.printStackTrace();}```5.总结与展望Java POI 是一个功能强大的Java 库,它允许Java 开发人员轻松地操作Microsoft Office 文档,如Excel、Word、PowerPoint 等。

Java的RandomAccessFile对文件内容进行读写

Java的RandomAccessFile对文件内容进行读写

Java的RandomAccessFile对⽂件内容进⾏读写RandomAccessFile是Java提供的对⽂件内容的访问,她既可以读⽂件,也可以写⽂件,并且RandomAccessFile⽀持随机访问⽂件,也就是说他可以指定位置进⾏访问。

我们知道Java的⽂件模型,⽂件硬盘上的⽂件是byte byte byte的字节进⾏存储的,是数据的集合。

下⾯就是⽤这个类的步骤。

(1)打开指定的⽂件,有两种模式“rw”(读写) “r”(只读),创建对象,并且指定file和模式,例如:RandomAccessFile ac=new RandomAccessFile(file,”rw”);因为它⽀持随机访问⽂件,所以他引⼊了指针,可以通过指针来写⼊写出在指定的位置。

⽂件指针,打开⽂件时指针在开头pointer=0 (2)RandomAccessFile的往⽂件中写的⽅法(还有其他的写⽅法)Ac.write(int)----->只能写⼀个字节(后⼋位),同时⽂件指针也会移动,指向下⼀个位置。

(3)RandomAccessFile读的⽅法(还有其他的读⽅法)int b=ac.read()--->读⼀个字节(4)⽂件读写完毕后必须要把他关闭,调⽤close()的⽅法。

下⾯就是例⼦://创建相对路径的⽂件,就是在这个项⽬中创建⼀个⽂件夹File file=new File("random");if(!file.exists()) {file.mkdir();}File fileName=new File(file,"javaio.txt");if(!fileName.exists()) {fileName.createNewFile();//创建⽂件}//创建⼀个RandomAccessFile的对象,并指定模式rw,能读能写,//注意:必须是⽂件,不能是路径RandomAccessFile raf=new RandomAccessFile(fileName,"rw");//获取此时的⽂件指针的位置,起始位置为0System.out.println(raf.getFilePointer());//向⽂件中写⼊字符A,字符类型有两个字节,但她写⼊的是后⼋位的字节//字符A正好可以⽤后⼋位的字节表⽰出来raf.write('A');//字符的位置会⾃动向后移动,⽂件指针会向后⾃动移动System.out.println("输⼊⼀个字符之后,⽂件指针的位置"+raf.getFilePointer());raf.write('B');//每次write只能写⼊⼀个字节,如果要把i写进去,就需要写四次int i=0x7fffffff;raf.write(i>>>24 & 0xff);//写⼊⾼⼋位的raf.write(i>>>16 & 0xff);raf.write(i>>>8 & 0xff);raf.write(i);//写⼊低⼋位System.out.println("写⼊整数的时候⽂件指针的位置是"+raf.getFilePointer());/*** writeInt()的内置⽅法* public final void writeInt(int v) throws IOException {write((v >>> 24) & 0xFF);write((v >>> 16) & 0xFF);write((v >>> 8) & 0xFF);write((v >>> 0) & 0xFF);//written += 4;}*///也可以直接写⼊int整数raf.writeInt(i);//写⼊⼀个汉字,汉字为两个字节String str="欢迎学习java";byte[] b=str.getBytes("gbk");raf.write(b);System.out.println("此时的长度为"+raf.length());//读⽂件必须将⽂件指针放在开头位置raf.seek(0);byte[] buf=new byte[(int)raf.length()];raf.read(buf);//将内容写⼊buf字节数组中String str1=new String(buf,"gbk");System.out.println("⽂件中的内容为"+str1); raf.close();。

java读写word文档 完美解决方案

java读写word文档 完美解决方案

java读写word文档完美解决方案Java读写Word文档:完美解决方案Word文档是一种广泛使用的文件格式,用于创建和编辑文本文档。

在Java编程中,读写Word文档是一个常见的需求。

本文将介绍一种完美解决方案,帮助您在Java中实现对Word文档的读写操作。

一、引入依赖要在Java中读写Word文档,我们需要使用Apache POI库。

Apache POI是一个Java类库,可用于读取和编写Microsoft Office文件格式,包括Word文档。

在您的Java项目中,您需要将以下依赖项添加到您的构建文件中,以便使用Apache POI库:```java<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>```二、读取Word文档要读取一个Word文档,您可以使用Apache POI提供的XWPFDocument类。

以下是一个简单的示例代码,演示如何使用XWPFDocument读取Word文档:```javaimport ermodel.XWPFDocument;import org.apache.poi.xwpf.extractor.XWPFWordExtractor;import java.io.FileInputStream;import java.io.IOException;public class ReadWordDocument {public static void main(String[] args) {try {FileInputStream fis = newFileInputStream("path/to/your/word/document.docx");XWPFDocument document = new XWPFDocument(fis);XWPFWordExtractor extractor = new XWPFWordExtractor(document);String content = extractor.getText();System.out.println(content);fis.close();} catch (IOException e) {e.printStackTrace();}}}```在上面的代码中,您需要将"path/to/your/word/document.docx"替换为您实际的Word文档路径。

Java读写键值对

Java读写键值对

Java读写键值对Properties类(读⼊写出键值对)是Map⼦类 Map⽅法都能⽤public static void main(String[] args) throws IOException {//读出Properties pro=new Properties();FileInputStream fis = new FileInputStream("F:\\Demo.properties");//FileReader fr=new FileReader("F:\\Demo.properties");pro.load(fis);//读取键值对 pro.load(fr);String str=pro.getProperty("name");//取值fis.close(); //fr.close();//写⼊Properties pro=new Properties();//创建集合pro.setProperty("name","lisi");//写⼊键值对pro.setProperty("hobby","eat");pro.setProperty("hobby","sleep");//替换值String str=pro.getProperty("name");//取值Set<String> set=pro.stringPropertyNames();//像keySet获取键值集合for(String key:set){//遍历System.out.println(key+"..."+pro.getProperty(key));}FileOutputStream fos=new FileOutputStream("F:\\aaa.properties",true);//FileWriter fw = new FileWriter("F:\\aaa.properties",true);pro.store(fos, "person information"); //(⽂件路径,添加理由)//pro.store(fw,"save data");fos.close();//5,关闭流}//⽗类⽅法:Properties prop = new Properties();prop.put("CZBK001", "zhangsan");//添加映射关系Set<Object> keys = prop.keySet();for (Object key : keys) {Object value = prop.get(key);System.out.println(key + "=" + value);}Set<Map.Entry<Object,Object>> entrys = prop.entrySet();for (Map.Entry<Object, Object> entry : entrys) {Object key = entry.getKey();Object value = entry.getValue();System.out.println(key + "=" + value);}PrintWriter pw = new PrintWriter("d.txt");//打印流对象prop.list(pw);pw.close();//释放资源Properties类 JDBC从⽂件读取信息public static Connection getConn(){Connection conn=null; //不是局部Properties pro=new Properties();try{FileInputStream fis=new FileInputStream("src/pro.properties");pro.load(fis); //相对路径正斜杠Class.forName(pro.getProperty("driverClass"));//点出try catchString url=pro.getProperty("url");String username=pro.getProperty("username");String password=pro.getProperty("password");// 空conn=DriverManager.getConnection(url, username, password);//点 add catch}catch (ClassNotFoundException e) {e.printStackTrace();}catch (SQLException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}return conn;}src/pro.properties⽂件://⽆空格密码空串(空格)driverClass=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/guanjiapo?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull username=rootpassword=。

java程序里实现读写分离的方法

java程序里实现读写分离的方法

java程序里实现读写分离的方法Java是一种广泛使用的编程语言,可以用于开发各种类型的应用程序。

在一些大型的应用场景中,为了提高系统的读写性能,常常会采用读写分离的方法。

本文将介绍如何在Java程序中实现读写分离。

读写分离是指将数据库的读操作和写操作分别分配给不同的数据库节点来处理,从而提高系统的并发性能。

一般来说,读操作比写操作更为频繁,因此将读操作分配给多个节点可以有效提高系统的读取性能。

而写操作则通常只需要一个节点来处理,以保证数据的一致性。

在Java程序中实现读写分离,可以借助数据库中间件来完成。

数据库中间件是位于应用程序和数据库之间的一层软件,可以通过负载均衡和数据复制等技术,将读操作和写操作分别分配给不同的数据库节点。

一种常见的数据库中间件是MySQL Proxy,它可以拦截应用程序和数据库之间的通信,根据请求的类型将其分配给不同的数据库节点。

对于读操作,MySQL Proxy可以将请求发送给多个节点,并将结果合并后返回给应用程序。

而对于写操作,则将请求发送给单个节点,以保证数据的一致性。

另一种常见的数据库中间件是MyCat,它可以将数据库分片为多个逻辑数据库,并将其分配给不同的物理数据库节点。

对于读操作,MyCat可以将请求发送给多个节点,并将结果合并后返回给应用程序。

而对于写操作,则将请求发送给单个节点,并将写操作同步到其他节点,以保证数据的一致性。

除了使用数据库中间件,还可以通过编写代码来实现读写分离。

一种常见的方法是使用数据库连接池来管理数据库连接。

在读操作中,从连接池中获取一个读连接,并执行查询操作。

而在写操作中,从连接池中获取一个写连接,并执行更新操作。

通过合理配置连接池,可以将读操作和写操作分配给不同的数据库节点。

另一种方法是使用数据库的主从复制功能来实现读写分离。

主从复制是指将主数据库的更新操作同步到从数据库上,从数据库可以用于处理读操作。

在Java程序中,可以通过配置数据库连接的URL 来指定读写分离的策略。

java读写yml文件,修改文件内容保持原格式

java读写yml文件,修改文件内容保持原格式

java读写yml⽂件,修改⽂件内容保持原格式我理解的yml⽂件在我们学习过springboot项⽬的同学对这个⽂件肯定是特别熟悉,通常我们都是⽤它来修改保存我们的项⽬配置,最简单的就是数据库的配置,然后就是资源读取配置,redies配置,缓存配置,以及jwt的配置等等,因为yml⽂件主要⽤于我们的项⽬配置,所以⼀个特点就是易于⼈们阅读,修改;即使⼀个刚接触yml⽂件的⼈加上简单的注释,肯定也能够看懂打部分内容的;我总结的特点就是:1. 直观,易于阅读,修改2. 可以把对象的层次结构展现得很直观3. ⽤key:value的⽅式属性4. ⽤空格数量表⽰层级关系我⼯作中遇到的问题⼤家估计在spring中主要都是读取yml⽂件,所以对于写yml⽂件的过程经历不太多,我的项⽬系统是⾃⼰的java框架,然后要集成另外的⼀个spring项⽬,当我的项⽬修改数据库信息的时候同时也要修改这个springboot项⽬的数据库配置信息,那么就存在⼀个对yml的读和写的过程,我经过百度后加上⾃⼰的代码,就得到了⾃⼰想要的效果;主要⽤到了ymal这个开源⼯具类;maven依赖<dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.25</version></dependency>读取关键代码,ymal⼯具⾃动将yml⽂件转换为map结构的对象//解析yml⽂件的关键类Yaml yml =null;try (FileInputStream in = new FileInputStream(file)){yml = new Yaml();obj = (Map)yml.load(in);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}Map<String,Object> springMap =(Map)obj.get("spring");写⼊关键代码,try (FileWriter writer = new FileWriter(file)) {//writer.write(yml.dump(obj));writer.write(yml.dumpAsMap(obj));//writer.write(yml.dumpAs(obj, Tag.MAP, DumperOptions.FlowStyle.BLOCK));//可以⾃定义写⼊格式//writer.write(yml.dumpAs(obj, Tag.MAP, DumperOptions.FlowStyle.FLOW));} catch (IOException e) {e.printStackTrace();}我⽤的是dumpAsMap⽅法,这个⽅法能够⾃动把map结构的对象转为yml⽂件的key:value的结构,map层级⽤两个空格表⽰,但是我的这个项⽬⽤了4个空格,所以后⾯我还得重新特殊处理⼀下;完整代码,因为我的主要⽬的是修改数据库配置信息,由于项⽬系统⽀持了很多类型的数据库,所以我要适配各种数据库;@SpringBootTestpublic class DemoTest {@Testpublic void readYmlTest() {//要读的⽂件路径String filePath ="C:"+File.separator+"Users"+File.separator+"17247"+File.separator+"Desktop"+File.separator+"application-exclusive.yml";Map<String,Object> obj =null;File file = new File(filePath);//解析yml⽂件的关键类Yaml yml =null;try (FileInputStream in = new FileInputStream(file)){yml = new Yaml();obj = (Map)yml.load(in);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}Map<String,Object> springMap =(Map)obj.get("spring");String url = "jdbc:oracle:thin:@127.0.0.1:1521/orcl";//String url = "jdbc:dm://127.0.0.1:5236/DMSERVER?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8"; String usesrname = "poc";String pwd = "ENC(w2PXuzg+U60Zs2MA/FouyQ==)";AEDatasourceFactory AeDatasourceFactory = new AEDatasourceFactory(url,usesrname,pwd);//根据不同数据库更新模板AeDatasourceFactory.updateDatasourceTemplet(springMap);try (FileWriter writer = new FileWriter(file)) {//writer.write(yml.dump(obj));//writer.write(yml.dumpAsMap(obj));writer.write(yml.dumpAs(obj, Tag.MAP, DumperOptions.FlowStyle.BLOCK));//writer.write(yml.dumpAs(obj, Tag.MAP, DumperOptions.FlowStyle.BLOCK));} catch (IOException e) {e.printStackTrace();}//重新读取⽂件调整空格StringBuffer buffer = new StringBuffer();String newLine =System.lineSeparator();try (BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(file), "utf-8"));) {String line;while ((line = input.readLine()) != null) {String lineTrim = line.trim();String pre ="";if(line.startsWith(" ")){int length = line.length()-lineTrim.length();pre = this.getSpaceByNum(length*2);}if(lineTrim.startsWith("- ")){//有横杠的需要再加4个空格pre = pre+this.getSpaceByNum(4);}buffer.append(pre+lineTrim);buffer.append(newLine);}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath, false), "utf-8"))) {writer.write(buffer.toString());} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//获取指定数量的空格private String getSpaceByNum(int num){StringBuffer buffer = new StringBuffer();for(int i=0;i<num;i++){buffer.append(" ");}return buffer.toString();}private String getAEEncryptPassword(String input) {return input ;}}适配数据库⼯⼚类import java.util.LinkedHashMap;import java.util.Map;/*** AE数据源模板⼯⼚类*/public class AEDatasourceFactory {//oracle数据库private final String ORACLE_TYPE="jdbc:oracle";//sqlserver数据库类型private final String SQLSERVER_TYPE="jdbc:oracle";//db2数据库private final String DB2_TYPE="jdbc:db2";//达梦数据库private final String DM_TYPE="jdbc:dm";//pg数据库private final String PG_TYPE="dbc:postgresql";//⾼斯数据库private final String GAUSS_TYPE="jdbc:zenith";String url;String username;String password;public AEDatasourceFactory(String url, String username, String password) {this.url=url;ername=username;this.password=password;}/*** 获取更新数据源模板* @param springMap*/public void updateDatasourceTemplet(Map<String,Object> springMap){Map<String,Object> dataSource = (Map<String,Object>)springMap.get("datasource");Map<String,Object> jpaMap = (Map<String,Object>)dataSource.get("jpa");if(jpaMap==null){//应该是jpa和datasource同级的,// 但是他们提供的可能是不同级的jpaMap = springMap.get("jpa")!=null?(Map<String,Object>)springMap.get("jpa"):new LinkedHashMap<>(); }dataSource.clear();Map<String,Object> hikari = new LinkedHashMap<>();hikari.put("auto-commit",false);if(url.startsWith(ORACLE_TYPE) || url.startsWith(SQLSERVER_TYPE)){dataSource.put("type","com.zaxxer.hikari.HikariDataSource");dataSource.put("url",url);dataSource.put("username",username);dataSource.put("password",getAEEncryptPassword(password));dataSource.put("hikari",hikari);}else if(url.startsWith(DM_TYPE)){dataSource.put("url",url);dataSource.put("username",username);dataSource.put("password",getAEEncryptPassword(password));dataSource.put("driver-class-name","dm.jdbc.driver.DmDriver");}else if(url.startsWith(DB2_TYPE)){dataSource.put("type","com.zaxxer.hikari.HikariDataSource");dataSource.put("driver-class-name","com.ibm.db2.jcc.DB2Driver");dataSource.put("hikari",hikari);}else if(url.startsWith(GAUSS_TYPE)){dataSource.put("url",url);dataSource.put("username",username);dataSource.put("password",getAEEncryptPassword(password));dataSource.put("driver-class-name","com.huawei.gauss.jdbc.ZenithDriver");}else if(url.startsWith(PG_TYPE)){dataSource.put("type","com.zaxxer.hikari.HikariDataSource");dataSource.put("url",url);dataSource.put("username",username);dataSource.put("password",getAEEncryptPassword(password));dataSource.put("hikari",hikari);//pg没有jpajpaMap=null;}if(jpaMap!=null){getJpaTemplet(jpaMap);springMap.put("jpa",jpaMap);}}private void getJpaTemplet(Map<String,Object> jpaMap){if(jpaMap==null){return;}jpaMap.clear();Map<String,Object> properties = new LinkedHashMap<>();if(url.startsWith(ORACLE_TYPE) || url.startsWith(SQLSERVER_TYPE)){jpaMap.put("database-platform","org.hibernate.dialect.Oracle12cDialect");jpaMap.put("database","ORACLE");jpaMap.put("show-sql",false);properties.put("hibernate.id.new_generator_mappings",true);properties.put("hibernate.connection.provider_disables_autocommit",true);properties.put("e_second_level_cache",false);properties.put("e_query_cache",false);properties.put("hibernate.generate_statistics",false);jpaMap.put("properties",properties);}else if(url.startsWith(GAUSS_TYPE)){//不知道为啥要⽤oracle的properties.put("hibernate.dialect","org.hibernate.dialect.Oracle12cDialect");jpaMap.put("properties",properties);}else if(url.startsWith(DM_TYPE)){properties.put("hibernate.dialect","org.hibernate.dialect.DmDialect");jpaMap.put("properties",properties);}else if(url.startsWith(PG_TYPE)){}else if(url.startsWith(DB2_TYPE)){properties.put("hibernate.dialect","com.diwork.intelliv.workbench.auth.dialect.CustomDB2Dialect");properties.put("hibernate.auto_quote_keyword",true);jpaMap.put("properties",properties);jpaMap.put("show-sql",true);Map<String,Object> hibernate = new LinkedHashMap<>();Map<String,Object> naming = new LinkedHashMap<>();naming.put("physical-strategy","org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl"); hibernate.put("naming",naming);jpaMap.put("hibernate",hibernate);}}//密码加密⽅法private String getAEEncryptPassword(String input) {return input ;}}这样修改了指定的内容,⽽且还保证了⽂件的原格式,但有个问题是⽂件的注释会丢失;。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

读取控制台输入:
BufferedReader(Reader inputReader);
Reader是抽象类,其一个子类为InputStreamReader,负责将字节转换为字符InputStreamReader(InputStream inputStream);
InputStream的一个对象为System.in
Read()读取一个字符返回一个整数,与结束符返回-1
想控制台输出:
可以用System.out对象
可以使用PrintWrite类:
PrintWrite(OutputStream outputStream , Boolean fulshOnNewline); OutputStream的一个对象是System.out
文件读写
常用流:
FlileInputStream(String filename); 读文件
FlileOutputStream(String filename); 写文件
read();读一个字节,与结束符返回-1
write();写一个字节
applet是在Internet服务中被访问的。

Objref instanceof type:判断objred对象是否能转化为tyep类的一个对象
File类:
IsFile()判断是否为文件
IsDiretory()判断是否为目录
String[] list() 获得目录下的所有文件盒子目录
String [] list (FilenameFilter ffobj); 通过ffobj限定列出的文件格式FilenameFilter接口的一个是现实为OnlyExt类,
例如:FilenameFilter only=new OnlyExt(“html”);
File [] listFile();
File [] listFile(FilenameFilter ffobj);
File [] listFile(FileFilter fobj);返回是定路径的文件
缓冲字节流:
BufferedInputStream (InputStream inputStream);
BufferedInputStream (InputStream inputStream,int bufsize);
BufferedOutputStream (OutputStream outputStream);
BufferedOutputStream (OutputStream outputStream,int bufsize);
PrintStream类提供了所有的输出功能
PrintStream(OutputStream outputStream);
PrintStream(OutputStream outputStream,boolean flushOnNewline)PrintStream(OutputStream outputStream,boolean flushOnNewline,String charset)
RandomAccessFile类可随机存取文件
Seek(long newpos);newpos指定文件指针距离文件开头的新位置,一字节为单位。

SetLength(long len);设置文件的长度为len。

字符流
抽象类:Reader / Writer
FileReader类读文件内容
FileReader (String filepath);
FileReader (File file);
FileWriter类
FileWriter (String filepath);
FileWriter (String filepath, boolean append);
FileWriter (File file);
FileWriter (File file, boolean append);
BufferedReader类
BufferedReader (Reader inputStream);
BufferedWriter (WriteroutputStream);
PrintWriter类
printWriter (OutputStream outputStream);
printWriter (OutputStream outputStream, Boolean flushOnNewline);printWriter (Writer outputStream);
printWriter (Writer outputStream, Boolean flushOnNewline);printWriter(File outputFile);
printWriter(File outputFile, String charset);
printWriter(String outputFileName);
printWriter(String outputFileName, String charset);
Console类读写控制台
Console con=System.console();
con.readLine();
con.readLine(String str); 显示str并读取键盘
con.printf(); 类似于c语言printf()。

相关文档
最新文档