Java常用API-IO&特殊文件(XML文件、各种流、特殊文件)

一、各种流

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)注意事项

转义符:

&lt;  表示 <
&gt;  表示 >
&amp; 表示 &
&apos; 表示 '
&quot; 表示 "

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user id="1" desc="一个用户">
        <name>张三</name>
        <age>18</age>
        <地址>江 &lt; &gt; &amp; &apos; &quot; 苏</地址>
    </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>
        <地址>江 &lt; &gt; &amp; &apos; &quot; 苏</地址>
    </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);
        }



    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值