一、各种流
1.字符&字节
代码部分:
package com.czxy.d4_io_many;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class TestIO04_char_buf {
public static void main(String[] args) throws Exception {
//0 确定位置
File aFile = new File("a.txt");
File bFile = new File("b.txt");
//1 创建流
// 1.1 输入input字节流-->输入input缓存字节流-->输入input转换字符-->输入input字符缓存流
InputStream is = new FileInputStream(aFile);
BufferedInputStream bis = new BufferedInputStream(is);
Reader reader = new InputStreamReader(bis, StandardCharsets.UTF_8); //使用常量替换UTF-8
BufferedReader br = new BufferedReader(reader);
// 1.2 输出output字节流-->输出output缓存字节流-->输出output转换字符-->输出output字符缓存流
OutputStream os = new FileOutputStream(bFile);
BufferedOutputStream bos = new BufferedOutputStream(os);
Writer writer = new OutputStreamWriter(bos, "UTF-8");
BufferedWriter bw = new BufferedWriter(writer);
//2 拷贝: 拷贝时使用【字符数组】
char[] buf = new char[1024];
int len;
while( (len = br.read(buf)) != -1) {
bw.write(buf, 0, len);
}
//3 释放
bw.close();
br.close();
System.out.println("拷贝完成");
}
}
2.打印流
package com.czxy.d4_io_many;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
public class TestIO5_print {
public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
PrintStream ps = new PrintStream("c.txt", "UTF-8");
ps.print(97);
ps.println("哈哈");
//默认打印到控制台
//System.setOut(ps); //System.out内容输出到指定文件
System.out.println("输出完成");
ps.close();
}
}
3.数据流
package com.czxy.d4_io_many;
import java.io.*;
public class TestIO6_data {
public static void main(String[] args) throws IOException {
//写操作
OutputStream os = new FileOutputStream(new File("data.txt"));
DataOutputStream dos = new DataOutputStream(os);
dos.writeInt(97);
dos.writeDouble(99.5);
dos.writeBoolean(true);
dos.writeUTF("嘿嘿");
dos.close();
//读操作
InputStream is = new FileInputStream(new File("data.txt"));
DataInputStream dis = new DataInputStream(is);
int i = dis.readInt();
double d = dis.readDouble();
boolean b = dis.readBoolean();
String s = dis.readUTF();
System.out.println(i);
System.out.println(d);
System.out.println(b);
System.out.println(s);
}
}
4.序列化流
package com.czxy.d4_io_many;
import java.io.*;
public class TestIO7_object_user {
public static void main(String[] args) throws Exception {
//准备数据
User user = new User();
user.setUsername("jack");
System.out.println(user);
//1 序列化:写操作 (内存中的对象,写入到硬盘文件中)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));
oos.writeObject(user);
oos.close();
//2 反序列化:读操作(从硬盘文件读数据,并封装到内存对象中)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));
Object obj = ois.readObject();
ois.close();
User u2 = (User)obj;
System.out.println(u2);
System.out.println(u2.getUsername());
}
}
二. 特殊文件
按照要求编写的文件,称为特殊文件。
常见的特殊文件:properties文件、xml文件 等
1.properties文件
(1)基本语法
-
属性文件:记录者一对一对的数据
-
文件名:自定义
-
扩展名:*.properties
-
内容:一行一对,每一对用=分割“key=value”
#注释内容 username=jack password=1234 age=18
-
key命名:一般建议使用.进行分割名。例如:jdbc.username、jdbc.password 等
-
-
注意:properties文件默认不支持中文,如果需要写中文,将其转换成Unicode码
(2)程序读取
package com.czxy.d5_properties;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class TestProperties {
public static void main(String[] args) throws IOException {
//0准备
File file = new File("./day031_io/src/com/czxy/d5_properties/user.properties");
//1 创建properties对象
Properties properties = new Properties();
//2 加载文件
properties.load(new FileInputStream(file));
//3 获得内容
String username = properties.getProperty("username");
String password = properties.getProperty("password");
String age = properties.getProperty("age");
System.out.println(username);
System.out.println(password);
System.out.println(age);
String jdbcUsername = properties.getProperty("jdbc.username");
System.out.println(jdbcUsername);
}
}
三、XML文件
(1)基本语法
-
XML:eXtensible Markup Language 可扩展标记语言 。一种数据格式。使用标签进行标记存储。
-
特点:
-
XML中的
<标签名>
称为一个标签或者一个元素,一般是成对出现的。 -
XML中的标签名可以自己定义(可扩展),但是必须要正确的嵌套。
-
XML中只能有【一个根标签】。
-
XML标准中可以有属性
-
XML必须第一行有一个文档声明,格式是固定的
<?xml version="1.0" encoding="UTF-8"?>
-
XML文件必须是以.xml为后缀结尾
-
-
实例:
<?xml version="1.0" encoding="UTF-8"?> <根元素名> <元素名 属性名="属性值" 属性名2="属性值2"> </元素名> </根元素名>
(2)注意事项
转义符:
< 表示 <
> 表示 >
& 表示 &
' 表示 '
" 表示 "
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1" desc="一个用户">
<name>张三</name>
<age>18</age>
<地址>江 < > & ' " 苏</地址>
</user>
<user id="2">
<name>李四</name>
<age>21</age>
<地址>沭阳</地址>
</user>
</users>
CDATA区:批量编写特殊符号的区域
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1" desc="一个用户">
<name>张三</name>
<age>18</age>
<地址>江 < > & ' " 苏</地址>
</user>
<user id="2">
<name>李四</name>
<age>21</age>
<地址>沭阳</地址>
<code><![CDATA[
<user id="1" desc="一个用户">
<name>张三</name>
<age>18</age>
<地址>江 < > & ' " 苏</地址>
</user>
]]></code>
</user>
</users>
(3)解析(了解)
-
使用Java程序读取xml文件(固定代码)
-
Java提供了很多解析xml的技术,有的是JDK提供的,有的是第三方提供。
-
比较有名的第三方工具:dom4j
-
-
搭建环境:导入第三方jar包
编写代码:
package com.czxy.d6_xml;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class TestXml {
public static void main(String[] args) throws Exception {
//确定文件的位置:
File file = new File("./day031_io/src/com/czxy/d6_xml/users.xml");
//使用dom4j解析指定的xml
//1 创建核心工具类
SAXReader saxReader = new SAXReader();
//2 通过工具类,解析xml,获得整个文档 Document
Document document = saxReader.read(file);
//3 通过文档获得根元素 Element users
Element rootElement = document.getRootElement();
System.out.println(rootElement.getName()); //元素名:users
//4 通过根元素获得所有的user元素
List<Element> userElementList = rootElement.elements("user");
//5 遍历所有 user元素
for(Element userElement : userElementList) {
//5.1 获得id属性的值
String id = userElement.attributeValue("id");
System.out.println(id);
//5.2 获得desc属性的值
Attribute descAttribute = userElement.attribute("desc");
if(descAttribute != null) { //如果属性不存在,对象为null
String descValue = descAttribute.getValue();
System.out.println(descValue);
}
//5.3 获得name子元素的值
String nameText = userElement.elementText("name");
System.out.println("name: " + nameText);
//5.4 获得age子元素的值
Element ageElement = userElement.element("age");
String ageText = ageElement.getText();
System.out.println("age: " + ageText);
//5.5 获得地址子元素的值
String address = userElement.elementText("地址");
System.out.println("地址:" + address);
//5.6 获得code子元素的值
String code = userElement.elementText("code");
System.out.println("code:" + code);
}
}
}