IO流Properties配置文件

news2024/12/26 0:10:37

目录

输入流和输出流

File文件增删

常用IO流类及其分类

FileInputStream/FileOutputStream

ObjectInputStream/ObjectOutputStream

BufferedInputStream/BufferedOutputStream

FileReader/FileWriter

BufferedReader/BufferedWriter

InputStreamReader/InputStreamWriter

Properties读取配置文件


输入流和输出流

在学习IO编程之前,需要先清楚输入流和输出流之间的关系:输入流和输出流是相对于程序来讲的,如下图所示:

File文件增删

File新建文件构建文件对象有三种常用方式:

  • public File(String filePath)
  • public File(File parent,String child)
  • public File(String parent,String child)
    任选其中一种在指定的路径下通过createNewFile方法创建文件,通过mkDir(创建单层目录)、mkDirs(创建多层目录)创建目录:
    @Test
    public void createFile() throws IOException {
        String filePath = "E:\\IOStream\\FileInputStreamFiles\\hello.txt";
        String filePathOfDir = "E:\\IOStream\\FileInputStreamFiles\\helloDir";
        File file = new File(filePath);
        File fileDir = new File(filePathOfDir);
        try {
            if(file.createNewFile()) {  //返回值boolean类型
                System.out.println("创建成功");
            } else {
                System.out.println("创建失败");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        if (fileDir.mkdir()) {
            System.out.println("目录创建成功");
        } else {
            System.out.println("目录创建失败");
        }
    }

Delete删除空目录或者文件

删除上面创建的文件以及目录:

@Test
public void deleteFile() {
    String filePath = "E:\\IOStream\\FileInputStreamFiles\\hello.txt";
    String pathOfDir = "E:\\IOStream\\FileInputStreamFiles\\helloDir";
    File file = new File(filePath);
    File fileDir = new File(pathOfDir);
    if(file.delete()) { //删除文件
        System.out.println(file.getName() + "文件删除成功");
    } else {
        System.out.println(file.getName() + "文件删除失败");
    }
    if(fileDir.delete()) { //删除目录
        System.out.println(fileDir.getName() + "目录删除成功");
    } else {
        System.out.println(fileDir.getName() + "目录删除失败");
    }
}

常用IO流类及其分类

在Java程序中,输入流和输出流分为字节输入/输出流以及字符输入/输出流。字节输入输出流以InputStream和OutputStream作为其抽象基类;字符输入输出流以Reader和Writer作为其抽象基类。常见的IO流类及其继承关系如下:

 FileInputStream/FileOutputStream

使用字节输入流FileInputStream读取文件

import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.IOException;
public void readFile() {
    String filePath = "E:\\IOStream\\FileInputStreamFiles\\hello.txt";
    FileInputStream fileInputStream = null;
    /*使用read一次读取单个字节
    try {
        int byte_ = 0;
        fileInputStream = new FileInputStream(filePath);
        while ((byte_ = fileInputStream.read()) != -1) {
            System.out.print((char) byte_);
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    } finally {
        try {
            fileInputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }*/
    //使用字节数组方式一次读取byte.length个字节
    try {
        byte[] byte_ = new byte[4];
        int readLength = 0;
        fileInputStream = new FileInputStream(filePath);
        while ((readLength = fileInputStream.read(byte_)) != -1) {   //read(byte)返回读取到的字节个数
            System.out.println(new String(byte_, 0, readLength));
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    } finally {
        try {
            fileInputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

使用字节输出流FileOutputStream写文件

import org.junit.jupiter.api.Test;

import java.io.FileOutputStream;
import java.io.IOException;
/**
 * 使用FileOutputStream写文件
 * 创建FileOutputStream时,如果没有这个文件会自动创建,如果有且append属性为false时会清空该文件
 * 在写入文件后没有关闭继续写时,会继续将内容追加文件末尾
 */
@Test
public void writeFile() {
    String filePath = "E:\\IOStream\\FileInputStreamFiles\\hello.txt";
    FileOutputStream fileOutputStream = null;
    try {
        fileOutputStream = new FileOutputStream(filePath, false);//true代表再次写入数据时追加原数据
//            fileOutputStream.write('ad');//向hello.txt中写入单个字节
        String str = "hello,world";
        //getBytes将字符转换成一个字节数组
        fileOutputStream.write(str.getBytes());
        System.out.println("写入成功");
    } catch (IOException e) {
        throw new RuntimeException(e);
    } finally {
        try {
            fileOutputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

应用:拷贝文件

/**
 * 使用输入输出流完成文件的拷贝,在读/写文件时使用字节数组提高读取和写入效率
 */
@Test
public void copy() {
    FileInputStream fileInputStream = null;
    FileOutputStream fileOutputStream = null;

    try {
        fileInputStream = new FileInputStream("E:\\IOStream\\FileInputStreamFiles\\Copy.txt");
        fileOutputStream = new FileOutputStream("E:\\IOStream\\FileInputStreamFiles\\copyFinish.txt");
        int temp = 0;
        int readLength = 0;
        //创建字符数组,提高文件的读取效率
        byte[] byte_ = new byte[1024];
        while ((readLength = fileInputStream.read(byte_)) != -1) {
            fileOutputStream.write(byte_, 0, readLength);
        }
        System.out.println("复制完成");
    } catch (IOException e) {
        throw new RuntimeException(e);
    } finally {
        try {
            if(fileInputStream != null) {
                fileInputStream.close();
            }
            if(fileOutputStream != null) {
                fileOutputStream.close();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

ObjectInputStream/ObjectOutputStream

与FileReader和FileWriter类似,对象输入/输出流ObjectInputStream和ObjectOutputStream也为处理流。用于保存数据的类型和值,并且能够按照特定的序列恢复出元数据类型和值。
序列化和反序列化:

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

使用对象输入输出流进行文件的读写:

//Dog类
package objectstream;

import java.io.Serializable;
/**
 * Dog类实现了Serializable接口,表明其可以被序列化
 */
public class Dog implements Serializable {
    private String name;//String类默认实现了Serializable接口
    private int age;
    public Dog(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public String toString() {
        return "[" +  this.name + " " + this.age +"]";
    }
}

//ObjectOutputStream_类
public class ObjectOutputStream_ {
    public static void main(String[] args) {
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("E:\\IOStream\\objectStream\\object.dat"));
            //序列化对应的数据时,要求该数据的数据类型是可序列化的,即实现了Serializable或Externalizable接口
            oos.writeInt(7);
            oos.writeUTF("hello");
            oos.writeObject(new Dog("小黑",7));
            System.out.println("序列化完成(文件写入完成)");
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (oos != null) {
                try {       //序列化结束后关闭流
                    oos.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }

    }
}

//ObjectInputStream_类
import java.io.*;
public class ObjectInputStream_ {
    public static void main(String[] args) {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("E:\\IOStream\\objectStream\\object.dat"));
            System.out.println(ois.readInt());
            System.out.println(ois.readUTF());
            System.out.println(ois.readObject());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (ois != null) {  //结束后记得关闭流
                try {
                    ois.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

对象输入输出流使用的注意事项:

  • 序列化的文件是以(.dat)的方式进行存储的
  • 数据的序列化和反序列化的顺序要一致,否则会抛出java.io.OptionalDataException异常
  • 序列化或者反序列化的对象,都需要实现Serializable或者Externalizable接口
  • 序列化的类中建议添加SerialVersionUID,提高版本的兼容性
  • 序列化类中的成员属性时,除了static和transient修饰的属性,其他属性都会被序列化
  • 序列化自定义对象在取出时,如果要调用自定义对象中的自定义方法,需要进行向下转型并且确保自定义对象是能够被访问的

BufferedInputStream/BufferedOutputStream

注意事项:
使用BufferedOutputStream处理流进行文件内容的输出结束后,应当关闭文件,否则内容不能在写入成功。

FileReader/FileWriter

使用字符输入流FileReader读取文件:

import java.io.fileReader;

public class BufferedReader {

    public static void main(String[] args) {
        FileReader fileReader = null;
        try {
            fileReader = new FileReader("E:\\IOStream\\FileInputStreamFiles\\temp.txt");
            char[] chars = new char[1024];
            int readLen = 0;
            while((readLen = fileReader.read(chars)) != -1) {
                System.out.print(new String(chars,0,readLen));
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if(fileReader != null) {
                    fileReader.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

使用字符输出流FileWriter写文件:

  • 注意事项:
    使用FileWriter进行文件的写入时,只有在写入完成后关闭文件才能成功将内容写入。当在创建FileWriter对象时,如果不指定append属性为false,那么当文件打开进行写入时将以覆写的方式覆盖原文件的数据。
import org.juint.jupiter.api.test;

@Test
public void writeFile() {
    FileWriter fileWrtier = null;
    String path = "E:\\IOStream\\FileInputStreamFiles\\temp.txt";
    try {
        fileWrtier = new FileWriter(path);
        fileWrtier.write("你好,川藏318");
        //fileWrtier.write(int c);
        //fileWrtier.write(str,start,end);
        //fileWrtier.write(char[] chars,start,end);
    } catch (IOException e) {
        throw new RuntimeException(e);
    } finally {
        try {
            fileWrtier.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

BufferedReader/BufferedWriter

节点流和处理流:

  • 节点流可以从一个特定的数据源进行数据的读取,如FileReader,FIleWriter
  • 处理流也成包装流,连接已存在的流之上,为程序提供更为强大的读写功能吗,如BufferedReader,BufferedWriter

BufferedWriter处理流进行文件的写入:

  • 注意事项:
    使用BufferedReader进行文件的写入时,只有在写入完成后关闭文件才能成功将内容写入。当在创建BufferedReader对象时,如果不指定append属性为false,那么当文件打开进行写入时将以覆写的方式覆盖原文件的数据。
    使用BufferedReader和BufferedWriter进行文件的拷贝时,避免拷贝二进制文件(声音,图像,视频,word,pdf),拷贝结束打开时会发生异常。
public class BufferedWriter__ {
    public static void main(String[] args) throws IOException {
        BufferedWriter bufferedWriter = null;
        //设置append属性:在传入BufferedWriter对象中封装的Writer对象中指定
        bufferedWriter = new BufferedWriter(new FileWriter("E:\\IOStream\\FileReaderFiles\\files\\temp.java",true));
        bufferedWriter.write("hello");
        bufferedWriter.newLine();//换行
        if(bufferedWriter != null) {
            bufferedWriter.close();
        }
    }
}

InputStreamReader/InputStreamWriter

InputStreamReader和InputStreamWriter又称为转换流,能够将字节处理流转换为字符处理流并且指定特定的编码格式

引出:使用字节处理流读取gbk编码文件出现中文乱码,为了解决这种问题,可以使用InputStreamReader将对应的字节处理流包装成字符处理流,并且指定特定的编码格式在进行读取。

public class BufferedReader_ {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\java代码\\IO_Stream_21\\io\\read.txt"),"GBK"));//在进行转换时指定待读取文件的编码格式,防止出现乱码问题
        String str = null;
        while((str = br.readLine()) != null) {
            System.out.println(str);
        }
    }
}
public class OutputStreamWriter_ {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\java代码\\IO_Stream_21\\io\\read.txt",true),"gbk");//指定的编码格式进行内容的写入
        osw.write(" hello世界 ");
        System.out.println("文件写入成功");
        osw.close();
    }
}

注意事项:

转换流InputStreamReader和OutputStreamWriter可以解决乱码问题,但在使用时应当注意编码格式的对应。

Properties读取配置文件

后缀.properties的文件通常作为Java的配置文件,文件内的数据格式以键值对的方式进行存放。使用properties配置文件提高了程序的灵活性。

使用Properties操作文件的相关操作:

public class Properties_ {
    public static void main(String[] args) {
        Properties pro = new Properties();
        try {
            pro.load(new FileInputStream("src\\mysql.properties"));
            System.out.println(pro.getProperty("username"));
            System.out.println(pro.getProperty("ip"));
            System.out.println(pro.get("username"));
            pro.setProperty("active", "good");
            pro.setProperty("state", "stable");
            pro.setProperty("active", "silence");
            pro.setProperty("uio", "玛利亚");
            pro.store(new FileOutputStream("src\\mysql.properties"), "good");
            System.out.println(pro.getProperty("uio"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

注意事项:

在idea中保存信息到配置文件,如果信息含有中文,会存储为对应的unicode编码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为啥devc++程序运行正确返回不为0?而返回了一个特别大的数,详解。

例如运行以下程序: #include #include typedef char ElemType; typedef struct BiTNode{ char data; struct BiTNode *lchild; struct BiTNode *rchild; int DescNum;}BiTNode ,*BiTree; void CreateBiTree(BiTree *T) { char ch; scanf("%c",&ch); if(ch ){…

时序预测 | MATLAB实现IWOA-LSTM和LSTM时间序列预测(改进的鲸鱼算法优化长短期记忆神经网络)

时序预测 | MATLAB实现IWOA-LSTM和LSTM时间序列预测(改进的鲸鱼算法优化长短期记忆神经网络) 目录时序预测 | MATLAB实现IWOA-LSTM和LSTM时间序列预测(改进的鲸鱼算法优化长短期记忆神经网络)预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现IWOA-LSTM和…

使用React做一个音乐播放器

目录介绍先决条件和设置环境依赖关系播放器.js进口播放和暂停音频使用音频的当前时间和持续时间添加音频时间线输出附加的功能结论介绍 任何正在学习 React 并想使用 React 构建项目的人。有各种博客和文章可以为开发人员指导此类项目。我确实浏览过这些文章,但其中…

Java集合框架【三Map接口、Iterator送代器、Collections工具类】

文章目录双例模式一 Map接口简介1.1 常用方法1.2 演示二 HashMap的存储结构简介三 TreeMap容器类3.1 TreeMap的比较规则3.2 元素自身实现比较规则3.3 通过比较器实现比较规则四 Iterator迭代器4.1 Iterator送代器接口介绍4.2 栗子五 Collections工具类5.1 Collections工具类简介…

关于node代码如何丝滑执行多条命令行这件事

最近写脚本比较多,然后经常写命令行相关的代码,记录一下以备万一。 首先,node使用命令行依赖于child_process,这个是node原生支持的,我用的最多就是exec。 按顺序执行多个命令 因为写脚本需要执行多个语句,所以写了…

[Python图像识别] 五十一.水书图像识别之利用数据增强扩充图像数据集

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~ 上一篇文章…

五、传输层(三)TCP

目录 3.0 TCP特点补充 3.1 TCP报文段首部格式 3.2 TCP连接管理 3.2.1 三报文握手 3.2.2 四报文挥手 3.3 TCP的流量控制和可靠传输 3.4 TCP拥塞控制 3.4.1 接收窗口、拥塞窗口、发送窗口关系 3.4.2 慢开始和拥塞避免 3.4.3 快重传和快恢复 3.0 TCP特点补…

Java项目:springboot超市订单管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 该超市订单管理毕业设计基于jdk8版本开发,在部署时需要使用jdk8以上的版本。使用了目前流行的框架组合springbootmybatis的框架技术…

DispatcherServlet初始化过程源码分析 | SpringMVC源码分析

一、继承或实现关系 public class DispatcherServlet extends FrameworkServlet public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware public abstract class HttpServletBean extends HttpServlet implements Environment…

聊聊Go语言并发之道

写在前面 2007年,Go语言诞生于Google公司,2009年开源,2012年推出1.0版本,曾两次获得TIOBE年度语言。2012年起,全球大量的开源项目开始使用Go语言开发,目前Go语言已成为云计算领域事实上的标准语言&#xff…

深度学习常见概念字典(感知机、全连接层、激活函数、损失函数、反向传播、过拟合等)

这一章的所有内容均是为了进入深度学习具体的某某网络而准备的,简单但是非常有必要。 1. 神经网络(neural networks)的基本组成 1.1 神经元(neuron) 神经元(neuron) 是神经网络(n…

slf4j常用配置文件读取

slf4j常用配置文件读取 log4j2读取配置文件 日志现在一般都是使用slf4j作为接口、底层实现一般是用log4j2或者logback。 我们先看下log4j2是如何读取配置文件的。 implementation org.apache.logging.log4j:log4j-slf4j-impl:2.19.0如果使用gradle的话。上面的代码就会导入sl…

VS coda C++、python运行与Dbug配置

首先新建终端 一次性使用C方法 检查C编译器是否存在 which g可见位置存在于:/usr/bin/g 一次性命令格式: 使用json配置文件 运行C方法(推荐): 根据你查找的g的位置来决定 使用配置好的tasks.json(C的…

QT入门-UI-信号槽

目录 一、QWidget类(重点) 二、子组件(掌握) 三、样式表(熟悉) 一、什么是信号槽? 二、信号槽的连接方式 2.1 自带信号→自带槽 2.2 自带信号→自定义槽 2.3 自定义信号 三、传参方式 3.1 成员变…

C#语言实例源码系列-伪装文件

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中…

Redis分布式锁存在的问题

假设有这样一个场景,在一个购票软件上买一张票,但是此时剩余票数只有一张或几张,这个时候有几十个人都在同时使用这个软件购票。在不考虑任何影响下,正常的逻辑是首先判断当前是否还有剩余的票,如果有,那么…

Spring5.3.0源码下载

目录源码下载环境配置import into idea修改配置gradle-wapper.propertiesbuild.gradleSetting Gradlerefresh Gradle写一个小dome源码研究心得源码下载 Spring5.3.0 Download Address 我们只需要下载zip就行了, 如果忘记了这个地址,可以在Spring Offici…

网络技术——网络运维工程师必会的网络知识(3)(详细讲解)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.网络层协议与应用 1.网络层的功能 2.IP数据包格式 3.广播与…

100天精通Python(数据分析篇)——第70天:Pandas常用排序、排名方法(sort_index、sort_values、rank)

文章目录每篇前言一、按索引排序:sort_index()1. Series类型排序1)升序2)降序2. DataFrame类型排序1)按行索引排序2)按列索引排序二、按值排序:sort_values()1. Series类型排序1)升序2&#xff…

冻结集合:不可能增删frozenset()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 冻结集合:不可能增删 frozenset() 选择题 对于以下python代码表述错误的一项是? a{1,2} print("【显示】a",a) a.add(3) print("【执行】a.add(3)【显示】a"…