JavaSE-常用API-IO&特殊文件

发布时间:2024年01月22日

各种流

2.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("拷贝完成");
    }
}

  • 嵌套版本
package com.czxy.d4_io_many;

import java.io.*;
import java.nio.charset.StandardCharsets;

public class TestIO04_char_buf2 {
    public static void main(String[] args) throws Exception {
        //0 确定位置

        //1 创建流
        // 1.1 输入input字节流-->输入input缓存字节流-->输入input转换字符-->输入input字符缓存流
        BufferedReader br = new BufferedReader(new InputStreamReader(new BufferedInputStream(new FileInputStream(new File("a.txt"))), StandardCharsets.UTF_8));

        // 1.2 输出output字节流-->输出output缓存字节流-->输出output转换字符-->输出output字符缓存流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(new File("b.txt"))), "UTF-8"));


        //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.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();

    }
}

2.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);
    }
}

2.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());
    }
}

3. 特殊文件

  • 按照要求编写的文件,称为特殊文件。
  • 常见的特殊文件:properties文件、xml文件 等

3.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);
    }
}

3.2 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);
        }



    }
}

4)约束(听过)

  • xml约束:规定xml文件如何编写的文件

  • 常见约束文件2种:

    • dtd :老版本,约束内容单一(少)
      • 官网:https://www.w3school.com.cn/dtd/index.asp
    • schema:新版本,约束内容复杂(多)
      • 官网:https://www.w3school.com.cn/schema/index.asp
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        schema

在这里插入图片描述
在这里插入图片描述

文章来源:https://blog.csdn.net/qiuyeyyy/article/details/135729444
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。