Java文件与IO操作

1. 文件与IO操作

1.1 文件

什么是文件:  文件,对我们并不陌生,文件是保存数据的地方,比如大家经常使用的word文档,txt文件.excel文件...都是文件。它既可以保存一张图片,也可以保持视频,声音.…

1.1.1 文件流:

1.1.2 常用的文件操作:

创建文件对象相关构造器和方法:

案例:请在e盘下,创建文件news1.txt、news2.txt、news3.txt,用三种不同方式创建
 

 import org.junit.jupiter.api.Test;import java.io.*;
public class FileCreate{public static void main(String[]args){}//方式1newFile(String pathname)@Testpublic void create01() {String filePath = "e:\\news1.txt";File file = new File(filePath);try {file.createNewFile();System.out.println("文件创建成功");} catch (IOException e) {e.printStackTrace();} }//方式2newFile(File parent,String child) //根据父目录文件+子路径构建
//e:\\news2.txt@Testpublic void create02() {File parentFile = new File("e:\\");String fileName = "news2.txt";//这里的file 对象,在java程序中,只是一个对象
//只有执行了createNewFile 方法,才会真正的,在磁盘创建该文件File file = new File(parentFile, fileName);
try {file.createNewFile();System.out.println("创建成功~");} catch (IOException e) {e.printStackTrace();} }//方式3newFile(String parent,String child) //根据父目录+子路径构建
@Testpublic void create03() {//String parentPath = "e:\\";String parentPath = "e:\\";String fileName = "news4.txt";File file = new File(parentPath, fileName);try {file.createNewFile();System.out.println("创建成功~");} catch (IOException e) {e.printStackTrace();} }//下面四个都是抽象类//InputStream//OutputStream//Reader//字符输入流
//Writer //字符输出流
}

获取文件的相关信息:

案例:如何获取到文件的大小,文件名,路径,父File,是文件还是目录(目录本质也是文件,一种特殊的文件).是否存在.
 

 import org.junit.jupiter.api.Test;import java.io.File;public class FileInformation {public static void main(String[] args) {}//获取文件的信息
@Testpublic void info() {//先创建文件对象File file = new File("e:\\news1.txt");//调用相应的方法,得到对应信息System.out.println("文件名字=" + file.getName());//getName、getAbsolutePath、getParent、length、exists、isFile、isDirectorySystem.out.println("文件绝对路径=" + file.getAbsolutePath());System.out.println("文件父级目录=" + file.getParent());System.out.println("文件大小(字节)=" + file.length());System.out.println("文件是否存在=" + file.exists());//TSystem.out.println("是不是一个文件=" + file.isFile());//TSystem.out.println("是不是一个目录=" + file.isDirectory());//F
}}

1.1.3 目录的操作和文件删除

1.2  IO流原理及流的分类

1.2.1 Java IO 流原理

1. I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输。如读/写文件,网络通讯等。
2. Java程序中,对于数据的输入/输出操作以”流(stream)”的方式进行。
3.  java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据
4. 输入input:读取外部数据 (磁盘、光盘等存储设备的数据)到程序(内存)中。
5. 输出output:将程序(内存)  数据输出到磁盘、光盘等存储设备中

1.2.2 流的分类

按操作数据单位不同分为: 字节流(8 bit)二进制文件,字符流(按字符)文本文件
按数据流的流向不同分为: 输入流,输出流
按流的角色的不同分为: 节点流,处理流/包装流

1) Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的。
2) 由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

1.3  IO 流体系图-常用的类

1.3.1  IO 流体系图-常用的类

1.3.2  文件 VS 流

1.3.3 FileInputStream介绍

案例:请使用FileInputStream读取hello.txt文件,并将文件内容显示到控制台

 import org.junit.jupiter.api.Test;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;public class FileInputStream_{public static void main(String[]args){}/*** 演示读取文件...* 单个字节的读取,效率比较低*-> 使用 read(byte[] b)*/@Testpublic void readFile01() {String filePath = "e:\\hello.txt";int readData = 0;FileInputStream fileInputStream = null;try {//创建 FileInputStream 对象,用于读取 文件fileInputStream = new FileInputStream(filePath);//从该输入流读取一个字节的数据。 如果没有输入可用,此方法将阻止。//如果返回-1, 表示读取完毕while ((readData = fileInputStream.read()) !=-1) {System.out.print((char)readData);//转成 char 显示}} catch (IOException e) {e.printStackTrace();} finally {//关闭文件流,释放资源
try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();} } }/*** 使用 read(byte[] b) 读取文件,提高效率*/@Testpublic void readFile02() {String filePath = "e:\\hello.txt";//字节数组byte[] buf = new byte[8]; //一次读取 8 个字节.int readLen = 0;FileInputStream fileInputStream = null;try {//创建 FileInputStream 对象,用于读取 文件fileInputStream = new FileInputStream(filePath);//从该输入流读取最多b.length字节的数据到字节数组。 此方法将阻塞,直到某些输入可用。//如果返回-1, 表示读取完毕//如果读取正常, 返回实际读取的字节数while ((readLen = fileInputStream.read(buf)) !=-1) {System.out.print(new String(buf, 0, readLen));//显示}} catch (IOException e) {e.printStackTrace();} finally {//关闭文件流,释放资源.try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();} } } }

1.3.4  FileOutputStream 介绍

案例:要求: 请使用FileOutputStream 在 a.txt 文件,中写入 “hello,world”, 如果文件不存在,会创建文件(注意:前提是目录已经存在.)

 import org.junit.jupiter.api.Test;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class FileOutputStream01 {public static void main(String[] args) {}/*** 演示使用FileOutputStream 将数据写到文件中,* 如果该文件不存在,则创建该文件
*/@Test
public void writeFile() {//创建 FileOutputStream 对象String filePath = "e:\\a.txt";FileOutputStream fileOutputStream = null;try {//得到 FileOutputStream 对象 对象//说明//1. new FileOutputStream(filePath) 创建方式,当写入内容是,会覆盖原来的内容//2. new FileOutputStream(filePath, true) 创建方式,当写入内容是,是追加到文件后面fileOutputStream = new FileOutputStream(filePath, true);//写入一个字节//fileOutputStream.write('H');////写入字符串String str = "zak,world!";//str.getBytes() 可以把 字符串-> 字节数组//fileOutputStream.write(str.getBytes());/*write(byte[] b, int off, int len) 将 len 字节从位于偏移量 off 的指定字节数组写入此文件输出流*/fileOutputStream.write(str.getBytes(), 0, 3);} catch (IOException e) {e.printStackTrace();} finally {try {fileOutputStream.close();}catch(IOExceptione){e.printStackTrace();} } }}

1.3.5 FileReader 和 FileWriter 介绍

1.3.6 FileReader相关方法:

1) new FileReader(File/String)
2) read: 每次读取单个字符,返回该字符,如果到文件末尾返回-1
3) read(charD): 批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1
相关API:
1) new String(char:将char[ ] 转换成String
2) new String(char[ ],off,len): 将char[ ] 的指定部分转换成String

1.3.7 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),否则写入不到指定的文件!

1.3.8 FileReader和FileWriter应用案例

要求:
1) 使用FileReader从story.txt读取内容,并显示

 import org.junit.jupiter.api.Test;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class FileReader_ {public static void main(String[] args) {}/*** 单个字符读取文件
*/@Testpublic void readFile01() {String filePath = "e:\\story.txt";FileReader fileReader = null;int data = 0;//1. 创建FileReader 对象
try {fileReader = new FileReader(filePath);//循环读取 使用read, 单个字符读取while ((data = fileReader.read()) !=-1) {System.out.print((char) data);}
} catch (IOException e) {e.printStackTrace();} finally {try {if (fileReader != null) {fileReader.close();}} catch (IOException e) {e.printStackTrace();} } }/*** 字符数组读取文件
*/@Testpublic void readFile02() {System.out.println("~~~readFile02 ~~~");String filePath = "e:\\story.txt";FileReader fileReader = null;int readLen = 0;char[] buf = new char[8];//1. 创建FileReader 对象
try {fileReader = new FileReader(filePath);//循环读取 使用read(buf), 返回的是实际读取到的字符数//如果返回-1, 说明到文件结束while ((readLen = fileReader.read(buf)) !=-1) {System.out.print(new String(buf, 0, readLen));}} catch (IOException e) {e.printStackTrace();} finally {try {if (fileReader != null) {fileReader.close();}} catch (IOException e) {e.printStackTrace();} } } }

2) 使用FileWriter 将 “风雨之后,定见彩虹” 写入到 note.txt 文件中, 注意细节.

import java.io.FileWriter;import java.io.IOException;public class FileWriter_ {public static void main(String[] args) {String filePath = "e:\\note.txt";//创建FileWriter 对象FileWriter fileWriter = null;char[] chars = {'a', 'b', 'c'};try {fileWriter = new FileWriter(filePath);//默认是覆盖写入//3) write(int):写入单个字符fileWriter.write('H');// 4) write(char[]):写入指定数组fileWriter.write(chars);//  5) write(char[],off,len):写入指定数组的指定部分fileWriter.write("zak".toCharArray(), 0, 3);//  6) write(string):写入整个字符串fileWriter.write(" 你好北京~");fileWriter.write("风雨之后,定见彩虹");7) write(string,off,len):写入字符串的指定部分fileWriter.write("上海天津", 0, 2);//在数据量大的情况下,可以使用循环操作.} catch (IOException e) {e.printStackTrace();} finally {//对应FileWriter , 一定要关闭流,或者flush才能真正的把数据写入到文件//看源码就知道原因./*看看代码private void writeBytes() throws IOException {this.bb.flip();int var1 = this.bb.limit();int var2 = this.bb.position();assert var2 <= var1;if (var3 > 0) {int var3 = var2 <= var1 ? var1- var2 : 0;if (this.ch != null) {assert this.ch.write(this.bb) == var3 : var3;} else {this.out.write(this.bb.array(), this.bb.arrayOffset() + var2, var3);} }this.bb.clear();}*/try {//fileWriter.flush();//关闭文件流,等价 flush()+ 关闭fileWriter.close();} catch (IOException e) {e.printStackTrace();} }System.out.println("程序结束...");} }

1.4 节点流和处理流

1.4.1 基本介绍

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

2. 处理流(也叫包装流)是“连接”在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,也更加灵活,如BufferedReader、BufferedWriter 

1.4.2 节点流和处理流一览图

1.4.3 节点流和处理流的区别和联系

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

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

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

1.4.5 处理流- BufferedReader 和 BufferedWrite

        BufferedReader和 BufferedWriter属于字符流,是按照字符来读取数据的关闭时处理流,只需要关闭外层流即可

案例:  1. 使用BufferedReader读取文本文件,并显示在控制台

 import java.io.BufferedReader;import java.io.FileReader;public class BufferedReader_{public static void main(String[]args)throwsException{String filePath="e:\\a.java";//创建bufferedReaderBufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
//读取String line; //按行读取, 效率高
//说明//1. bufferedReader.readLine() 是按行读取文件//2. 当返回null 时,表示文件读取完毕while ((line = bufferedReader.readLine()) != null) {System.out.println(line);}//关闭流, 这里注意,只需要关闭 BufferedReader ,因为底层会自动的去关闭 节点流//FileReader。
/*public void close() throws IOException {synchronized (lock) {if (in == null)return;try {} finally {in.close();//in 就是我们传入的 new FileReader(filePath), 关闭了.in = null;cb = null;} } }
*/bufferedReader.close();} }

2. 使用BufferedWriter将”hello,zak",写入到文件中.

 import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;public class BufferedWriter_{public static void main(String[]args)throwsIOException{StringfilePath="e:\\ok.txt";//创建BufferedWriter//说明://1.newFileWriter(filePath,true)表示以追加的方式写入//2.newFileWriter(filePath),表示以覆盖的方式写入BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));bufferedWriter.write("hello,zak");bufferedWriter.newLine(); //插入一个和系统相关的换行bufferedWriter.write("hello2,zak");bufferedWriter.newLine();bufferedWriter.write("hello3,zak");bufferedWriter.newLine();//说明:关闭外层流即可,传入的newFileWriter(filePath),会在底层关闭bufferedWriter.close();} }

3. 综合使用BufferedReader 和 BufferedWriter 完成文本文件拷贝,注意文件编码

import java.io.*;public class BufferedCopy_{public static void main(String[] args) {//说明//1. BufferedReader 和 BufferedWriter 是安装字符操作//2. 不要去操作 二进制文件[声音,视频,doc,pdf], 可能造成文件损坏//BufferedInputStream//BufferedOutputStreamString srcFilePath = "e:\\a.java";String destFilePath = "e:\\a2.java";// String srcFilePath = "e:\\0245_zak Java_引出 this.avi";// String destFilePath = "e:\\a2 zak.avi";BufferedReader br = null;BufferedWriter bw = null;String line;try {br = new BufferedReader(new FileReader(srcFilePath));bw = new BufferedWriter(new FileWriter(destFilePath));//说明: readLine 读取一行内容,但是没有换行while ((line = br.readLine()) != null) {//每读取一行,就写入bw.write(line);//插入一个换行bw.newLine();
}System.out.println("拷贝完毕...");} catch (IOException e) {e.printStackTrace();} finally {//关闭流
try {if(br != null) {}br.close();if(bw != null) {bw.close();}} catch (IOException e) {e.printStackTrace();} } } }

1.4.6 处理流- BufferedInputStream 和 BufferedOutputStream

1.4.7 BufferedOutputStream

        BufferedOutputStream是字书流,实现缓冲的输出流,可以将多个字节写入底层输出流中,而不必对每次字节写入调用底层系统
案例:要求:编程完成图片/音乐的拷贝(要求使用Buffered..流).

import java.io.*;/*** @author * @version 1.0* 演示使用BufferedOutputStream 和 BufferedInputStream 使用* 使用他们,可以完成二进制文件拷贝.* 思考:字节流可以操作二进制文件,可以操作文本文件吗?当然可以
*/public class BufferedCopy02 {public static void main(String[] args) {//String srcFilePath = "e:\\Koala.jpg";//String destFilePath = "e:\\zak.jpg";//String srcFilePath = "e:\\0245_zak Java_引出 this.avi";// String destFilePath = "e:\\zak.avi";String srcFilePath = "e:\\a.java";String destFilePath = "e:\\a3.java";//创建BufferedOutputStream 对象 BufferedInputStream 对象BufferedInputStream bis = null;BufferedOutputStream bos = null;try {//因为 FileInputStream 是 InputStream 子类bis = new BufferedInputStream(new FileInputStream(srcFilePath));bos = new BufferedOutputStream(new FileOutputStream(destFilePath));//循环的读取文件,并写入到 destFilePathbyte[] buff = new byte[1024];int readLen = 0;//当返回-1 时,就表示文件读取完毕while ((readLen = bis.read(buff)) !=-1) {bos.write(buff, 0, readLen);}System.out.println("文件拷贝完毕~~~");} catch (IOException e) {e.printStackTrace();} finally {//关闭流 , 关闭外层的处理流即可,底层会去关闭节点流
try {if(bis != null) {bis.close();}if(bos != null) {bos.close();}} catch (IOException e) {e.printStackTrace();
} } } }

1.4.8 对象流- ObjectInputStream 和 ObjectOutputStream

需求:
1. 将 int num = 100这个 int数据保存到文件中,注意不是100数字,而是 int 100,并且,能够从文件中直接恢复int 100
2. 将Dog dog = new Dog(“小黄”,3) 这个 dog对象保存到文件中,并且能够从文件恢复.
3. 上面的要求,就是能够将基本数据类型或者对象进行序列化和反序列化操作
序列化和反序列化:
1. 序列化就是在保存数据时,保存 数据的值 和 数据类型
2. 反序列化就是在恢复数据时,恢复 数据的值 和 数据类型
3. 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该
    类必须实现如下两个接口之一:
        serializable //这是一个标记接口,没有方法
        Externalizable //该接口有方法需要实现,因此我们一般实现上面的 Serializable接口

1.4.9 对象流介绍

功能:提供了对基本类型或对象类型的序列化和反序列化的方法
ObjectOutputStream  提供 序列化功能
ObjectInputStream  提供 反序列化功能

案例:  1. 使用ObjectOutputStream序列化基本数据类型和一个 Dog对象(name, age),并保存到data.dat文件中

import java.io.FileOutputStream;import java.io.ObjectOutputStream;import java.io.Serializable;
/*** @author 
* @version 1.0* 演示ObjectOutputStream 的使用, 完成数据的序列化
*/public class ObjectOutStream_ {public static void main(String[] args) throws Exception {//序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存String filePath = "e:\\data.dat";ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));//序列化数据到 e:\data.datoos.writeInt(100); // int-> Integer (实现了 Serializable)oos.writeBoolean(true);// boolean-> Boolean (实现了 Serializable)oos.writeChar('a');// char-> Character (实现了 Serializable)oos.writeDouble(9.5);// double-> Double (实现了 Serializable)oos.writeUTF("zak");//String//保存一个dog对象oos.writeObject(new Dog("旺财", 10, "日本", "白色"));oos.close();System.out.println("数据保存完毕(序列化形式)");} }

2. 使用ObjectlnputStream读取data.dat 并反序列化恢复数据

 //1.创建流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src\\data.dat"));//2.读取,注意顺序System.out.println(ois.readInt());System.out.println(ois.readBoolean());System.out.println(ois.readChar());System.out.println(ois.readDouble());System.out.println(ois.readUTF());System.out.println(ois.readObject());System.out.println(ois.readObject());System.out.println(ois.readObject());//3.关闭ois.close();System.out.println("以反序列化的方式读取(恢复)ok~");

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

1.4.10 标准输入输出流

介绍:
                                                类型                          默认设备
System.in 标准输入                lnputStream                键盘
System.out 标准输出              PrintStream                显示器

1.4.11 转换流- InputStreamReader 和 OutputStreamWriter

文件乱码问题:

import java.io.*;/*** @author * @version 1.0* 看一个中文乱码问题
*/public class CodeQuestion {public static void main(String[] args) throws IOException {//读取e:\\a.txt 文件到程序//思路//1.创建字符输入流 BufferedReader[处理流]//2. 使用 BufferedReader 对象读取a.txt//3. 默认情况下,读取文件是按照 utf-8 编码String filePath = "e:\\a.txt";BufferedReader br = new BufferedReader(new FileReader(filePath));String s = br.readLine();System.out.println("读取到的内容: " + s);br.close();//InputStreamReader//OutputStreamWriter} }

介绍:
1. InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成(转换)Reader(字符流)
2. OutputStreamWriter:Writer的子类,实现将OutputStream(字节流) 包装成Writer(字符流)
3. 当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,,所以建议将字节流转换成字符流
4. 可以在使用时指定编码格式(比如utf-8, gbk , gb2312, ISO8859-1等)

案例:1. 编程将字节流FilelnputStream 包装成(转换成)字符流InputStreamReader,对文件进行读取(按照utf-8/gbk格式),进而在包装成 BufferedReader。

 import java.io.*;/***@author*@version1.0*演示使用InputStreamReader转换流解决中文乱码问题*将字节流FileInputStream转成字符流InputStreamReader,指定编码gbk/utf-8*/public class InputStreamReader_{public static void main(String[]args)throwsIOException{String filePath ="e:\\a.txt";//解读//1.把FileInputStream转成InputStreamReader//2. 指定编码 gbk//InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "gbk");//3. 把 InputStreamReader 传入 BufferedReader//BufferedReader br = new BufferedReader(isr);//将 2 和 3 合在一起BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(filePath), "gbk"));//4. 读取String s = br.readLine();System.out.println("读取内容=" + s);//5. 关闭外层流br.close();} }

2. 编程将字节流 FileOutputStream包装成(转换成)字符流OutputStreamWriter,对文件进行写入(按照gbk格式,可以指定其他,比如utf-8)

// 1.创建流对象
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d:\\a.txt"), "gbk");
//2.写入
osw.write("hello,zak~");//3.关闭
osw.close();System.out.println("保存成功~");

1.5 打印流-PrintStream和PrintWriter

实例:打印流只有输出流,没有输入流
 

 import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;/***@author
* @version 1.0* 演示 PrintWriter 使用方式
*/public class PrintWriter_ {public static void main(String[] args) throws IOException {//PrintWriter printWriter = new PrintWriter(System.out);PrintWriter printWriter = new PrintWriter(new FileWriter("e:\\f2.txt"));
 import java.io.IOException;import java.io.PrintStream;/*** @author 
* @version 1.0* 演示PrintStream (字节打印流/输出流)
*/public class PrintStream_ {public static void main(String[] args) throws IOException {PrintStream out = System.out;//在默认情况下,PrintStream 输出数据的位置是 标准输出,即显示器/*public void print(String s) {if (s == null) {s = "null";}write(s);}*/out.print("john, hello");//因为print 底层使用的是write, 所以我们可以直接调用write进行打印/输出
out.write("zak,你好".getBytes());out.close();//我们可以去修改打印流输出的位置/设备
//1. 输出修改成到 "e:\\f1.txt"//2. "hello, zak" 就会输出到 e:\f1.txt//3. public static void setOut(PrintStream out) {
// checkIO();
// setOut0(out); // native 方法,修改了 out
// }System.setOut(new PrintStream("e:\\f1.txt"));System.out.println("hello, zak");} }print Writer.print("hi, 北京你好~~~~");prin tWriter.close(); //flush + 关闭流, 才会将数据写入到文件..
} }

1.6 Properties 类

1.6.1 需求:

import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;/*** @author 
* @version 1.0*/public class Properties01 {public static void main(String[] args) throws IOException {//读取mysql.properties 文件,并得到 ip, user 和 pwdBufferedReader br = new BufferedReader(new FileReader("src\\mysql.properties"));String line = "";while ((line = br.readLine()) != null) { //循环读取String[] split = line.split("=");//如果我们要求指定的ip值if("ip".equals(split[0])) {System.out.println(split[0] + "值是: " + split[1]);} }br.close();}

1.6.2 基本介绍

1) 专门用于读写配置文件的集合类
        配置文件的格式:        键=值                键=值
2) 注意: 键值对不需要有空格,值不需要用引号一起来。默认类型是String
3) Properties的常见方法
load: 加载配置文件的键值对到Properties对象
list: 将数据显示到指定设备
getProperty(key): 根据键获取值
setProperty(key,value): 设置键值对到Properties对象
store: 将Properties中的键值对存储到配置文件,在idea中,保存信息到配置文件,如果含有中文,            会存储为unicode码

案例:
1. 使用Properties类完成对 mysql.properties的读取
2. 使用Properties类添加key-val到新文件mysql2.properties中
3. 使用Properties类完成对mysq12.properties 的读取,并修改某个key-val

 import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.Properties;/***@author* @version 1.0*/public class Properties02 {public static void main(String[] args) throws IOException {//使用Properties 类来读取mysql.properties 文件//1. 创建Properties 对象Properties properties = new Properties();//2. 加载指定配置文件properties.load(new FileReader("src\\mysql.properties"));//3. 把 k-v 显示控制台properties.list(System.out);//4. 根据key 获取对应的值String user = properties.getProperty("user");String pwd = properties.getProperty("pwd");System.out.println("用户名=" + user);System.out.println("密码是=" + pwd);} }
import java.io.FileNotFoundException;
import java.io.FileOutputStream;import java.io.IOException;import java.util.Properties;/*** @author 
* @version 1.0*/public class Properties03 {public static void main(String[] args) throws IOException {//使用Properties 类来创建 配置文件, 修改配置文件内容Properties properties = new Properties();//创建//1.如果该文件没有key 就是创建//2.如果该文件有key,就是修改
/*public synchronized V put(K key, V value) {Properties 父类是 Hashtable , 底层就是Hashtable 核心方法// Make sure the value is not nullif (value == null) {throw new NullPointerException();}// Makes sure the key is not already in the hashtable.Entry<?,?> tab[] = table;int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length;@SuppressWarnings("unchecked")Entry<K,V> entry = (Entry<K,V>)tab[index];for(; entry != null ; entry = entry.next) {if ((entry.hash == hash) && entry.key.equals(key)) {Vold = entry.value;entry.value = value;//如果 key 存在,就替换return old;} }addEntry(hash, key, value, index);//如果是新 k, 就 addEntryreturn null;}*/properties.setProperty("charset", "utf8");properties.setProperty("user", "汤姆"); //注意保存时,是中文的 unicode 码值properties.setProperty("pwd", "888888")//将 k-v 存储文件中即可
properties.store(new FileOutputStream("src\\mysql2.properties"), null);System.out.println("保存配置文件成功~");
}}

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

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

相关文章

NeRF算法

目录 算法介绍 基本原理 1. 体渲染 2. 多层感知机&#xff08;MLP&#xff09; 3. 位置编码 4. 两阶段层次化体采样 实验展示 代码解析 算法介绍 NeRF&#xff08;Neural Radiance Fields&#xff09;是一种用于从2D图像中重建3D场景的神经网络模型。它通过训练一个深度…

SAP-ABAP-视图

1、什么是视图&#xff1f; 当需要查询多个表中的某些字段的数据时&#xff0c;就可以使用视图。视图不影响数据库中的数据&#xff0c;仅作为查询手段或工具。 2、视图类型&#xff1a; 数据库视图和维护视图经常使用。 3、创建视图SE11 3.1、数据库视图 可以直接输入表名…

Linux 文件

文章目录 文件操作回顾(C/C)系统调用接口 管理文件认识一切皆文件C/C的文件操作函数与系统调用接口的关系……重定向与缓冲区 -- 认识重定向与缓冲区 -- 理解使用重定向缓冲区实现一个简单的Shell(加上重定向)标准输出和标准错误(在重定向下的意义) 磁盘文件磁盘存储文件操作系…

【BUUCTF】[RoarCTF 2019]Easy Java1

工具&#xff1a;hackbar发包&#xff0c;bp抓包。 解题步骤&#xff1a;【该网站有时候send不了数据&#xff0c;只能销毁靶机重试】 这里的登录界面是个天坑【迷魂弹】 直接点击help&#xff0c;然后进行打开hackbar——通过post请求&#xff0c;再通过bp抓包&#xff0c;…

....comic科学....食用手册....

1.点击链接后&#xff0c;保存漫画至夸克网盘&#xff0c;若是新用户需要用手机注册. 2.在应用商店下载夸克APP. 3.登录APP下载已保存的漫画. 3.1 进入APP点击 夸克网盘 3.2 点击“转存的内容”后&#xff0c;长按 漫画文件夹&#xff0c;点击下载&#xff0c;下载速度400K左…

桥田汉诺威工业展观察:走好脚下更需着眼未来

2024年4月21日&#xff0c;桥田创始人刘小平携核心团队6人共赴“制造业展会天花板”——德国汉诺威工业博览会参观学习&#xff0c;此次参访&#xff0c;是桥田智能组队出海的第二次学习之旅&#xff0c;未来&#xff0c;我们将组织更多优秀员工出海交流学习&#xff0c;让每一…

一套C语言VC + MSSQL开发PACS系统源码 带三维重建和还原的PACS医学影像全套系统源码

一套C语言VC MSSQL开发PACS系统源码 带三维重建和还原的PACS医学影像全套系统源码 本套PACS系统成品源码&#xff0c;自主版权。集成三维影像后处理功能&#xff0c;包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等功…

03-单片机商业项目编程,从零搭建低功耗系统设计

一、本文内容 上一节《02-单片机商业项目编程&#xff0c;从零搭建低功耗系统设计-CSDN博客》引出了伪时间片的概念&#xff0c;这也是再低功耗系统设计中必须使用的程序设计逻辑&#xff0c;本文着重来讲解如何利用伪时间片来设计伪多任务&#xff0c;以及伪时间片多任务内核设…

Abp框架,EF 生成迁移文件时,自动添加表和字段注释内容

在使用 abp 框架&#xff0c;或者ef 的时候都会遇到一个问题&#xff0c;就是建实体后要将实体描述生成到数据库中&#xff0c;就需要手动去添加 [Comment("注释内容")] 注解&#xff0c;这样相当于手动写两次注释&#xff08;即使你是 Ctrl C&#xff09;&#x…

景源畅信电商:抖音小店有哪些比较热门的宣传方法?

抖音小店的热门宣传方法&#xff0c;是许多商家关注的焦点。在数字化营销时代&#xff0c;有效的宣传手段不仅能提升品牌知名度&#xff0c;还能吸引潜在消费者&#xff0c;促进销售。以下是针对抖音小店热门宣传方法的详细阐述&#xff1a; 一、短视频内容营销 作为抖音的核心…

【进程等待】阻塞等待 | options非阻塞等待

目录 waitpid 阻塞等待 options&非阻塞等待 pid_t返回值 阻塞等待VS非阻塞等待 waitpid 回顾上篇&#xff1a; pid_ t waitpid(pid_t pid, int *status, int options); 返回值&#xff1a; 当正常返回的时候waitpid返回收集到的子进程的进程ID&#xff1b;如果设置了…

PSCA电源管理软件栈示例

安全之安全(security)博客目录导读 目录 1、移动通讯系统 2、基础设施系统 本博客就PSCA电源管理软件栈进行举例&#xff0c;主要以移动通讯系统和基础设施系统为例来说明。 1、移动通讯系统 图3.4显示了一个可以在基于Linux的移动设备中实现的电源管理堆栈示例。 在Linux…

使用WPF中的Trigger实现按钮样式动态更改

使用WPF中的Trigger实现按钮样式动态更改 在Windows Presentation Foundation (WPF)中&#xff0c;Trigger 是一种强大的机制&#xff0c;它可以基于控件的属性值来动态更改控件的样式。这篇博客将介绍如何使用Trigger实现按钮在鼠标悬停时样式动态更改的效果。我们将详细讨论为…

Faiss核心解析:提升推荐系统的利器【AI写作免费】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

STM32使用L9110驱动电机自制小风扇

1.1 介绍&#xff1a; 该电机控制模块采用L9110电机控制芯片。该芯片具有两个TTL/CMOS兼容输入端子&#xff0c;并具有抗干扰特性&#xff1a;具有高电流驱动能力&#xff0c;两个输出端子可直接驱动直流电机&#xff0c;每个输出端口可提供750800mA动态电流&#xff0c;其峰值…

【适用全主题】WordPress原创插件:弹窗通知插件 支持内容自定义

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 适用于所有WordPress主题的弹窗插件 一款WordPress原创插件&#xff1a;弹窗通知插件 支持内容自定义 二、效果展示 1.部分代码 代码如下&#xff08;示例&#xff09;&#xff1…

【java.io.IOException: java.lang.IllegalArgumentException: db.num is null】

默认用户名&#xff1a;nacos 密码&#xff1a;nacos解决方法&#xff1a; a)在conf目录下将nacos-mysql.sql脚本创建完成&#xff1b; b)修改application.properties&#xff0c;在内容里添加如下内容 spring.datasource.platformmysql db.num1 db.url.0jdbc:mysql://localho…

有刷电机、无刷电机

阅读引言&#xff1a; 最近在备赛&#xff0c; 自己之前虽然用过电机&#xff0c; 但是发现在一些高要求的应用场景&#xff0c; 发现自己对电机的知识理解得不是很透彻&#xff0c; 所以写下这篇文章。 目录 一、 有刷电机内部原理 二、有刷电机一些关键参数 三、无刷电机内…

机器学习初学者 6 个核心算法!建议收藏,反复观看!

今天再来介绍机器学习算法的基本概念和适用场景&#xff01; 首先&#xff0c;引用一句英国统计学家George E. P. Box的名言&#xff1a;All models are wrong, but some are useful. 没有哪一种算法能够适用所有情况&#xff0c;只有针对某一种问题更有用的算法。 也就是说&…

STM32理论 —— μCOS-Ⅲ(新)

文章目录 1. 任务调度器1.1 抢占式调度 μCos-Ⅲ全称是Micro C OS Ⅲ&#xff0c;由Micriμm 公司发布的一个基于C 语言编写的第三代小型实时操作系统(RTOS)&#xff1b; RTOS 与裸机相比最大的优势在于多任务管理与实时性&#xff0c;它提供了多任务管理和任务间通信的功能&a…