首页 > 编程语言 >java IO

java IO

时间:2024-01-26 20:34:41浏览次数:34  
标签:file java String filePath File IO new 序列化

I/O流

  • 什么事文件

文件就是保存数据的地方

  • 文件流

文件在程序中是以流的方式来操作的

image-20231208222408963

流: 数据在数据源(文件) 和 程序(内存之间)经历的路径

输入流 : 数据从数据源(文件) 到程序(内存)的路径

输出流 : 数据从程序(内存) 到数据源文件的路径

1. 常用创建文件的操作

  • 创建文件对象相关的构造器的方法
new File(String pathName) // 根据路径构建一个 file 对象
new File(File parent, String child) // 根据 父目录文件 + 子路径构建
new File(String Parent, String Child) // 根据 父目录 + 子路径构建

image-20231208223403987

image-20231208223431559

package com.wxledu.file_;

import org.junit.Test;

import java.io.File;

/**
 * @author XXX
 * @version 1.0
 */
public class Directory_ {
    public static void main(String[] args) {

    }

    @Test
    public void m1(){
        String filePath = "d:\\news02";
        File file = new File(filePath);

        if (file.exists()){
            if (file.delete()){
                System.out.println(filePath + "删除成功");
            } else {
                System.out.println(filePath + "删除失败");
            }
        } else {
            System.out.println("该文件不存在");
        }
    }


    // 判断 D:\\demo02 是否存在,存在就删除,否则就提示不存在
    // 我们这里需要体会到,在java 编程中,目录也可以当做文件
    @Test
    public void m2(){
        String filePath = "D:\\demo02";
        File file = new File(filePath);
        if (file.exists()){
            if (file.delete()){
                System.out.println(filePath + "删除成功");
            } else {
                System.out.println(filePath + "删除失败");
            }
        } else {
            System.out.println(filePath + "目录不存在");
        }
    }


    // 判断 D:\\demo\\a\\b\\c 目录是否存在,如果存在就提示存在,不存在就创建
    // 创建一级目录 mkdir()  创建多级目录 mkdirs()
    @Test
    public void m3(){
        String directoryPath = "D:\\demo\\a\\b\\c";
        File file = new File(directoryPath);
        if (file.exists()){
            System.out.println(directoryPath + "目录存在");
        } else {
            if (file.mkdirs()){
                System.out.println(directoryPath + " 该目录创建成功");
            } else {
                System.out.println(directoryPath + "创建失败");
            }
        }
    }
}

image-20231230154703172

2. InputeStream 字节输入流

InputStream 常用子类

  1. FileInputeStream 文件输入流
  2. BufferedInputStream 缓冲字节输入流
  3. ObjectInputStream 对象字节输入流
package com.wxledu.outputStream_;

import org.junit.Test;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author xxx
 * @version 1.0
 */
public class OutputStream01 {
    public static void main(String[] args) {

    }

    /**
     * 演示使用 FileOutputStream 写入文件中
     * 如果文件不存在,就创建文件
     */
    @Test
    public void writeFile(){

        String filePath = "D:\\a.txt";
        // 创建 FileOutputStream 对象
        FileOutputStream fileOutputStream = null;

        try {
            // 得到 fileOutPutStream 对象

            // 1. new FileOutputStream(filePath) 创建方式,写入的内容是,会覆盖原来的内容
            // 2. new FileOutPutStream(filePath, true) 创建方式,写入的内容是,追加到文件的后面
            fileOutputStream = new FileOutputStream(filePath, true);
            // char - > int
            // 写入一个字节
            // fileOutputStream.write('H');

            // 写入一个字符串
            // str.getBytes() 可以把字符串 - > 字节数组
            String str = "hello,world!";
            // fileOutputStream.write(str.getBytes());

            /*
            write(byte[] b, int off, int len)
            将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。
             */

            fileOutputStream.write(str.getBytes(), 0, str.length());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

3. I/O 流体系图-常用类

FileReader FileWriter 介绍

FileReader

  1. new FileReader(file/String)
  2. read: 每次读取单个字符,返回该字符,如果到文件末尾返回 -1
  3. read(char[]) : 批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回 -1

相关 API

1)new String(char[]) 将 char[] 转换成 String

2)new String(char[], off, len): 将 char[] 的指定部分转换成 String

FileWriter

  1. new FileWriter(File / String) : 覆盖模式, 相当于流的指针在首端
  2. new FileWriter(File / String, true) 追加模式,相当于流的指针在行尾
  3. write(int) : 写入单个字符
  4. write(char[]) 写入指定数组
  5. write(char[], off, len) : 写入数组的指定部分
  6. write(String) 写入整个字符串
  7. write(string, off, len) 写入字符串的指定部分

相关 API

String 类 toCharArray : 将 String 转换成 char[]

注意: FileWriter 使用后, 必须要关闭 close 或 刷新 flush 否则写入不到指定文件

4. 节点流和处理流

节点流:节点流可以从一个特定的数据源读写数据,如 FileReader FileWriter

数据源就是存放数据的地方

image-20240106222729816

处理流(也叫包装流) 是 “连接” 在已存在的流(节点流或处理流) 之上, 为程序提供更为强大的读写功能, 如 BufferedReader BufferedWriter 对节点流进行包装让我们这个流更强大

image-20240110195007268

BufferedReader 类中有属性 Reader , 即可以封装一个节点流 该节点流可以是任意的

image-20240110195117247

image-20240110195408006

image-20240110195718055

4.1 节点流和处理流的区别于联系

  • 节点流是 底层流 / 低级流, 直接跟数据源相连
  • 处理流包装节点流,既可以消除不同节点流之间的额差异,也可以提供更方便的方法来完成输入输出[源码理解]
  • 处理流(也叫包装流)对节点流进行包装,使用了修饰设计器设计模式,不会直接与数据源相连

4.2 处理流的功能主要体现在以下两方面

  • 性能的提高 : 主要以增加缓冲的方式来提高输入输出效率
  • 操作的便捷: 处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活

image-20240110202957171

5. 序列化 和 反序列化

  • 序列化就是在保存数据时,保存数据的数据类型

  • 反序列化就是在恢复数据时,恢复数据的值和数据类型

  • 需要让某个对象支持序列化机制,则必须让其他类是可序列化的,为了让某个类是可序列化的,该类还必须实现如下两个接口之一:

    Serializable 这是一个标记接口

    Externlizable 该接口有方法需要实现,一般实现上面的

细节

  • 读写顺序一致
  • 要求实现序列化和反序列化的对象,需要实现 Serializable
  • 序列化的类中建议添加 SerialVersionUID 为提高版本的兼容性
  • 序列化对象时,默认将里面的所有属性都进行序列化,但除了 static 或 transient 修饰的成员
  • 序列化对象时,要求里面的属性类型也实现序列化接口
  • 序列化具备可继承性,也就是如果某类已经实现了序列化,则他的所有子也默认实现序列化

Properties

image-20240125222938281

  • 专门用来读取配置文件的集合类

​ 配置文件格式

​ 键=值

  • 注意:键值对不需要有空格,值不需要用引号引起来,默认类型就是 String

Properties 的常见方法

  1. load: 加载配置文件到 Properties 对象
  2. list : 将数据显示在指定设备
  3. getProperty(key) 根据键获取值
  4. setProperty(key, value) 设置键值对到 Properties 对象
  5. store 将 Properties 中的键值对存储在配置文件,在 idea 中,保存信息到配置文件,如果含有中文,会存储为unicode

http://tool.chinaz.com/tools/unicode.aspx unicode 码查询工具

标签:file,java,String,filePath,File,IO,new,序列化
From: https://www.cnblogs.com/tomlove/p/17990629

相关文章

  • Error: EPERM: operation not permitted, mkdir 'F:\'——因权限不够报错
      我的报错内容如上图在网上找了很多解决办法,如下:下面的方案我都试过了,最终是成功了方案一:以管理员身份运行 方案二:重新配置环境变量将npm安装的全局模块所在的路径,以及缓存cache的路径放在其他目录中【试了,再执行方案一成功了】因为我没有截图,把我搜到的解决方法链......
  • php session反序列化
    关于SessionSession,在汉语中表示通话、会话、对话(期)、话路[对谈时间]的意思,其本来的含义一个终端用户与交互系统进行通信的时间(间隔),通常是指从注册(进入系统)到注销(退出系统)之间所经过的时间。比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个Session......
  • 1.JAVA基础-JDK的介绍
    Java语言语言:人与人交流沟通的表达方式。计算机语言:人与计算机之间进行信息交流沟通的一种特殊语言。Java语言是美国Sun公司(StanfordUniversityNetwork)在1995年推出的计算机语言。Java之父:詹姆斯·高斯林(JamesGosling)。Java语言的三个版本⚫JavaSE⚫JavaME......
  • Google浏览器Provisional headers are shown. Disable cache to see full headers.
    Google浏览器Provisionalheadersareshown.Disablecachetoseefullheaders.问题解决方法勾选禁用缓存,刷新成功......
  • esp8266 no matching function for call to 'Ticker::Ticker()'
    这个错误表明在尝试创建一个Ticker对象时,编译器找不到适合当前调用的构造函数。Ticker可能是Arduino框架中的一个类,用于处理定时事件。解决方法:确认你已经包含了正确的头文件。例如,对于ArduinoESP8266核心库,你需要包含Ticker.h#include<Ticker.h> 确认......
  • 使用debezium-connector-jdbc组件完成数据同步(io.debezium.connector.jdbc.JdbcSinkCo
    1.情景展示在网络上几乎找不到关于debezium-connector-jdbc插件的博客文章,基本上都在吹io.confluent.connect.jdbc.JdbcSinkConnector,由于一开始对数据同步插件并不了解,导致自己走了不少弯路。生产数据组件:debezium-connector-mysql、debezium-connector-oracle等数据库组件,通......
  • Educational Codeforces Round 159 (Rated for Div
    EducationalCodeforcesRound159(RatedforDiv.2)ABinaryImbalance题目大意给定一个长度为n的一个01字符串,我们执行以下操作:当s[i]!=s[i+1]在中间插入0问:是否可以实现0的个数大于1的个数解题思路由题意可以明显看出只要有0就可以实现。下面简单分析下:0的个数大......
  • Educational Codeforces Round 160 (Rated for Div
    ARatingIncreas题目大意给定一个数字,让我们拆分成两个数,这两个数满足以下条件:a<b.两个数没有前缀0.问:输出满足条件的数a,b.解题思路直接暴力循环这个数的位数次,若满足a<b,再判断两个数的位数和是否与拆分前相同.代码#include<bits/stdc++.h>#defin......
  • Educational Codeforces Round 161 (Rated for Div
    ATrickyTemplate题目描述给一个数字n和三个长度为n的字符串a,b,c。找一个模板使得字符串a,b匹配,而c不匹配,是否存在这样一个模板.匹配的定义是:当模板字母为小写时,两个字符串字符相同,为大写时,两个字符不同,这样的两个字符串则匹配解题思路我们可以直接得出当a字符串......
  • java集合知识
    集合概述Java集合概览Java集合,也叫作容器,主要是由两大接口派生而来:一个是Collection接口,主要用于存放单一元素;另一个是Map接口,主要用于存放键值对。对于Collection接口,下面又有三个主要的子接口:List、Set和Queue。说说List,Set,Queue,Map四者的区别?List(对付......