当前位置: 首页 > news >正文

Java学习之路 —— IO、特殊文件

文章目录

  • 1. I/O
    • 1.1 常用API
    • 1.2 I/O流
      • 1.2.1 字节流
      • 1.2.2 try-catch-finally和try-with-resource
      • 1.2.3 字符流
      • 1.2.4 其他的一些流
  • 2. I/O框架
  • 3. 特殊文件
    • 3.1. Properties
    • 3.2 XML

1. I/O

1.1 常用API

// 1. 创建文件对象
        File file = new File("E:\\ComputerScience\\java\\IO\\test.txt");

        // 2. 是否存在路径
        System.out.println(file.exists());
        // 3. 判断是否是文件
        System.out.println(file.isFile());
        // 4. 判断是否是文件夹
        System.out.println(file.isDirectory());
        // 5. 获取文件的名称(包括后缀)
        System.out.println(file.getName());
        // 6. 获取文件大小
        System.out.println(file.length());
        // 7. 获取文件最后修改时间
        System.out.println(file.lastModified());
        // 8. 获取创建文件对象时,使用的路径
        System.out.println(file.getPath());
        // 9. 获取绝对路径
        System.out.println(file.getAbsolutePath());
        
		File[] files = file.listFiles();
		        for (File file : files) {
		            System.out.println(file);
		}

1.2 I/O流

  • I称为输入流:负责把数据读到内存中去
  • O称为输出流:负责写数据出去

按流中数据的最小单位:

  • 字节流:适合操作所有类型的文件
    • 字节输入流:InputStream
    • 字节输出流:OutputStream
  • 字符流:只适合操作纯文本文件
    • 字符输入流:Reader
    • 字符输出流:Writer

1.2.1 字节流

FileInputStream
把磁盘文件中的数据以字节的形式读入到内存中去。
在这里插入图片描述

FileOutputStream
在这里插入图片描述

1.2.2 try-catch-finally和try-with-resource

finally是用于在程序执行完后进行资源释放的操作,即便出现了异常,也会执行finally的代码(专业级做法)

IDEA的快捷键是ctrl + alt + t

try {
   test4();
} catch (Exception e) {
   e.printStackTrace();
} finally {
   System.out.println("执行结束");
}

try-with-resource是JDK7后有的,更加简洁,不需要写finally这个臃肿的代码块。即不需要我们去写一些close代码了,只需要在try的时候放到小括号里面。

static void test4() throws Exception {
		// 注意,括号里面只能放置资源对象
        try (
                OutputStream os = new FileOutputStream("test2.txt", true);
        ) {
            byte[] bytes = "我爱你中国".getBytes();
            os.write(97);
            os.write(bytes);
            // 换行
            os.write("\r\n".getBytes());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

1.2.3 字符流

字节流适合复制文件,但不适合读写文本文件;而字符流更适合读写文本文件内容。

字符流读文件,会把每一个字母、函字看成一个字符,所以不会出现乱码的问题。

FileReader(文件字符输入流)
在这里插入图片描述

static void test1() {
        try (
                Reader fr = new FileReader("test.txt");
        ) {
            // 1. 一个一个的读取
//            int c;  // 记住每次读取的字符编号
//            while ((c = fr.read()) != -1) {
//                System.out.print((char) c);
//            }
            // 2. 读取多个字符
            int len;
            char[] buf = new char[3];
            while((len = fr.read(buf)) != -1) {
                System.out.print(new String(buf, 0, len));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

FileWriter

字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效!!!
在这里插入图片描述

1.2.4 其他的一些流

还有一些其他的流,就不一一列举了。

  • 字节缓冲流
    • 作用:提高字节流读写数据的性能
    • 原理:字节缓冲输入流自带了8KB缓冲池,字节缓冲输出流自带了8KB缓冲池
  • 转换流InputStreamReader/OutputStreamWriter
    • 作用:解决不同编码时,字符流读取文本内容乱码的问题
    • 解决思路:先获取文件的原始字节流,再将其按照真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了
  • 打印流PrintStream/PrintWriter
    • 作用:可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去
  • 数据流DataInputStream/DataOutputStream
    • 允许把数据和其类型一并写出去
  • 序列化流
    • 对象序列化:把Java对象写入到文件中去
    • 对象反序列化:把文件里的Java对象读出来
    • 注意:对象如果要参与序列化,必须实现序列化接口(java.io.Serializable)

2. I/O框架

Commons-io是apache提供的一组有关IO操作的小框架,目的是提高IO流的开发效率。需要去Apache官网下载。
在这里插入图片描述

3. 特殊文件

3.1. Properties

  • 是一个Map集合(Json类似)
  • 核心作用:Properties用来代表属性文件,通过Properties可以读写属性文件里的内容
    在这里插入图片描述
public class Properties_Demo1 {
    public static void main(String[] args) throws Exception {
        // 1. 创建一个Properties对象
        Properties properties = new Properties();
        // 2. 加载属性文件的键值对到对象中
        properties.load(new FileReader("src\\users.properties"));
        System.out.println(properties);
        // 3. 根据键取值
        System.out.println(properties.getProperty("张无忌"));
        properties.forEach((k, v) -> {
            System.out.println(k + "  " + v);
        });
    }
}

3.2 XML

  • XML本质是一种数据格式,可以存储复杂的数据结构,和数据关系。
  • 应用场景:经常用来作为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。
<?xml version="1.0" encoding="UTF-8" ?>
<!--以上抬头声明必须放在第一行,必须有!-->
<!--根标签只能有一个-->
<users>
    <user id = "1">
        <name>JehanRio</name>
        <sex></sex>
        <password>123456</password>
    </user>
    <user id = "2">
        <name>Bjergsen</name>
        <sex></sex>
        <password>654321</password>
    </user>
</users>

相关文章:

  • SpringBoot请求参数与响应返回值,ResponseEntity<T>自定义响应
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • Postman+Newman+Jenkins实现接口测试持续集成
  • C#中.NET 7.0 Windows窗体应用通过EF访问新建数据库
  • Java NIO 详解
  • 蓝牙耳机仓设计的单芯片解决方案
  • C++中tuple数据结构使用
  • 编译中的 CMP0148 警告
  • 基于STC12C5A60S2系列1T 8051单片机的数模芯片DAC0832实现数模转换应用
  • Python---函数的作用,定义,使用步骤(调用步骤)
  • 《C++避坑神器·二十二》VS能正常运行程序,但运行exe程序无响应解决办法
  • Spring条件注解@Conditoinal+ Profile环境切换应用@Profile
  • SQL之开窗函数
  • Git常用操作-MD
  • 基于pytest-bdd的项目目录结构和命名规范
  • Jmeter 性能测试基础!
  • Vertx-EventBus篇
  • 如何通过数据治理来提升业务价值——业务场景治理
  • AI视频检索丨历史视频标签化,助力重要事件高效溯源
  • oracle 不支持的字符集 orai18n.jar ZHS16GBK 异常问题解决
  • 董军在第六届联合国维和部长级会议上作大会发言
  • 沪指跌0.68%报3380.82点,创指跌1.92%:券商、军工跌幅靠前
  • 现场丨在胡适施蛰存等手札与文献间,再看百年光华
  • 全国人大常委会今年将初次审议检察公益诉讼法
  • 终于越过萨巴伦卡这座高山,郑钦文感谢自己的耐心和专注
  • 上海虹桥国际咖啡文化节周五开幕,来看Coffeewalk通关攻略