Tips:样式蚂蚁森林浇水get

IO流(字节流、字符流)

IO概述

什么是IO

  当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。
我们把这种数据的传输可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为 输入input 输出output ,即流向内存是输入流流出内存的输出流
  JavaI/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据

IO的分类

  1、根据数据的流向分为:输入流和输出流

  输入流:把数据从其他设备上读取内存中的流

  输出流:把数据从内存写到其他设备上的流

  2、根据数据的类型分为:字节流和字符流

  字节流:字节为单位,读写数据的流

  子符流:字符为单位,读写数据的流

  1个字符 = 2个字节  1个字节 = 8个二进制位

IO的流向说明图解

 

 

 

顶级父类们

字节流

一切皆为字节

  一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据 

字节输出流(OutputStream)

  java.io.OutputStream 抽象类是表示字节输出流的所有类的超类将指定的字节信息写出到目的地

  定义了字节输出流的基本共性功能方法:

  public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
  public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
  public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
  public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
  public abstract void write(int b) :将指定的字节输出流。

  注意:

  close()方法,当完成流的操作时,必须调用此方法,释放系统资源

FileOutputStream类

  public FileOutputStream(File file):创建一个指定File对象表示的文件中 写入数据的文件输出流

  public FileOutputStream(String name):创建一个具有指定名称的文件中 写入数据的输出文件流

  参数:写入数据的目的地

  file    :目的地是一个文件夹  

  String name:目的地是一个文件

  构造方法的作用:

  1.创建一个FileOutputStream对象

  2.会根据构造方法中传递的文件/文件路径,创建一个空的文件

  3.会把FileOutputStream对象 指向创建好的文件

package day10;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class FileOutput {
    public static void main(String[] args) throws FileNotFoundException {
        //使用文件创建流对象
        File file = new File("a.txt");
        FileOutputStream fos0 = new FileOutputStream(file);
        
        //使用文件名称创建流对象
        FileOutputStream fos1 = new FileOutputStream("b.txt");
    }
}
FileOutputStream

  注意:

  当创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件会创建该文件。如果有这个文件会清空这个文件的数据

写出字节数据

  写入数据的原理:(内存-->硬盘)

  Java程序-->JVM(Java虚拟机)-->OS(操作系统)-->OS调用写数据的方法-->把数据写入到文件中

  字节输出流的使用步骤:(重点)

  1.创建FileOutputStream对象,构造方法中传递写入数据的目的地

  2.调用FileOutputStream对象中的write()方法,把数据写入文件中

  3.释放资源close()

  1、写出字节

  写出字节write(int b)方法每次可以写出一个字节数据

package day10;

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

public class Xieru {
    public static void main(String[] args) throws IOException {
        //1.创建FileOutputStream对象,构造方法中传递写入数据的目的地
        FileOutputStream fos = new FileOutputStream("C:\\Users\\YIAN\\Desktop\\File\\a.txt");
        //2.调用FileOutputStream对象中的write()方法,把数据写入文件中
        fos.write(97);//此处写入的数据为ASCall码--->a
        //3.释放资源close()
        fos.close();
    }
}
fos.write(int b) --十进制 to 二进制

  2、写出字节数组

  public void write(byte[] b)

package day10;

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

public class XieRuByteArr {
    public static void main(String[] args) throws IOException {
        //1.创建FileOutputStream对象,构造方法中传递写入数据的目的地
        FileOutputStream fos = new FileOutputStream("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
        //2.调用FileOutputStream对象中的write()方法,把数据写入文件中
        //创建byte数组
        byte[] bytes = {65,66,67,68,69};//ABCDE
        fos.write(bytes);
        //3.释放资源close()
        fos.close();
    }
}
fos.write(byte[] b)

  在文件中显示100,需要写几个字节

package day10;

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

public class XieRuByteArr {
    public static void main(String[] args) throws IOException {
        //1.创建FileOutputStream对象,构造方法中传递写入数据的目的地
        FileOutputStream fos = new FileOutputStream("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
        //2.调用FileOutputStream对象中的write()方法,把数据写入文件中
        //创建byte数组
//        byte[] bytes = {65,66,67,68,69};//ABCDE
        byte[] bytes = {49,48,48};
        fos.write(bytes);
        //3.释放资源close()
        fos.close();
    }
}
100(3个字节)  

  注意:一次写多个字节

  如果第一个字节是正数(0-127):那么显示的时候会查Ascall码表

package day10;

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

public class XieRuByteArr {
    public static void main(String[] args) throws IOException {
        //1.创建FileOutputStream对象,构造方法中传递写入数据的目的地
        FileOutputStream fos = new FileOutputStream("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
        //2.调用FileOutputStream对象中的write()方法,把数据写入文件中
        //创建byte数组
        byte[] bytes = {65,66,67,68,69};//ABCDE
        fos.write(bytes);
        //3.释放资源close()
        fos.close();
    }
}
写入正数

  如果第一个字节是负数    :那么第一个字节和第二个字节,两个字节会组成一个中文显示,查询系统默认码表(GBK)

package day10;

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

public class XieRuByteArr {
    public static void main(String[] args) throws IOException {
        //1.创建FileOutputStream对象,构造方法中传递写入数据的目的地
        FileOutputStream fos = new FileOutputStream("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
        //2.调用FileOutputStream对象中的write()方法,把数据写入文件中
        //创建byte数组
        byte[] bytes = {-65,66,67,-68,69};//緽C糆
        fos.write(bytes);
        //3.释放资源close()
        fos.close();
    }
}
写入负数

  3、写出指定长度字节数组

  public void write(byte[] b, int off, int len)

  参数说明:

  byte[]:byte数组

  int off:数组的开始索引

  int len:写几个字节

package day10;

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

public class XieRuByteArr {
    public static void main(String[] args) throws IOException {
        //1.创建FileOutputStream对象,构造方法中传递写入数据的目的地
        FileOutputStream fos = new FileOutputStream("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
        //2.调用FileOutputStream对象中的write()方法,把数据写入文件中
        //创建byte数组
        byte[] bytes = {65,66,67,68,69};
        fos.write(bytes,2,2);//CD
        //3.释放资源close()
        fos.close();
    }
}
fos.write(byte[] byte,int off,int len)  

  3.1、补充--写入字符串

package day10;

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

public class XieruString {
    public static void main(String[] args) throws IOException {
        //1.创建FileOutputStream对象,构造方法中传递写入数据的目的地
        FileOutputStream fos = new FileOutputStream("C:\\Users\\YIAN\\Desktop\\File\\c.txt");
        //2.调用FileOutputStream对象中的write()方法,把数据写入文件中
        String str = "测试...";
        fos.write(str.getBytes());
        //3.释放资源close()
        fos.close();
    }
}
fos.write(str.getBytes())

  4、数据追加续写

    FileOutputStream(File file,boolean append):创建文件输出流以写入由指定的 File对象表示的文件。

  FileOutputStream(String name,boolean append):创建文件输出流以指定的名称写入文件。

  参数:

  File file、String name:写入数据的目的地

  boolean append:追加写入的开关

    true:创建对象不会覆盖源文件,继续在文件的末尾追加写数据

    false:创建一个新文件覆盖源文件

package day10;

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

public class XieRuzhuijia {
    public static void main(String[] args) throws IOException {
    //1.创建FileOutputStream对象,构造方法中传递写入数据的目的地
        FileOutputStream fos = new FileOutputStream("C:\\Users\\YIAN\\Desktop\\File\\d.txt",true);
    //2.调用FileOutputStream对象中的write()方法,把数据写入文件中
        for (int i = 1; i <=5 ; i++) {
            fos.write("追加".getBytes());//追加追加追加追加追加
        }
    //3.释放资源close()
        fos.close();
    }
}
FileOutputStream(File file,)

  //输出不换行

  5、写出换行

  写换行:写换行符

  windows:\r 或者 \n

  Linux:/n

  Mac:/r

package day10;

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

public class XieRuzhuijia {
    public static void main(String[] args) throws IOException {
    //1.创建FileOutputStream对象,构造方法中传递写入数据的目的地
        FileOutputStream fos = new FileOutputStream("C:\\Users\\YIAN\\Desktop\\File\\d.txt",true);
    //2.调用FileOutputStream对象中的write()方法,把数据写入文件中
        for (int i = 1; i <=5 ; i++) {
            fos.write("追加 & 换行".getBytes());
            fos.write("\r".getBytes());//可以用\n 也可以用\r
        }
    //3.释放资源close()
        fos.close();
    }
}
fos.write("\r".getBytes());

字节输入流(InputStream)

  java.io.FileInputStream 类是文件输入流从文件中读取字节

FileInputStream类

  FileInputStream(File file) 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
  FileInputStream(String name) 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

  参数: 读取文件的数据源

  file:文件的路径

  name:文件

public class DuquGouzao {
    public static void main(String[] args) throws FileNotFoundException {
        //使用File对象创建流对象
        File file = new File("C:\\Users\\YIAN\\Desktop\\File\\a.txt");
        InputStream fis0 = new FileInputStream(file);

        //使用文件名创建流对象
        InputStream fis1 = new FileInputStream("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
    }
}

读取字节数据

  读取数据的原理:

  java程序-->JVM-->OS-->OS读取数据的方法-->读取文件

  字节输入流的使用步骤:

  1.创建FileInputStream对象,构造方法中绑定要读取的数据

  2.使用FileInputStream对象中的方法read,读取文件

  3.释放资源

  1、读取字节

  int read():从输入流中读取数据的下一个字节

package day10;

import java.io.*;

public class DuquGouzao {
    public static void main(String[] args) throws IOException {
        // 1.创建FileInputStream对象,构造方法中绑定要读取的数据
        InputStream fis1 = new FileInputStream("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
        //  2.使用FileInputStream对象中的方法read,读取文件
        //int read() 读取一个字节
        int read = fis1.read();
        while (read!=-1){
            System.out.println(read);//67 -->A
            read-=1;
        }
        //  3.释放资源
        fis1.close();
    }
}
int read()

  注意:

  int read()读取文件中的一个字节并返回,读取到文件的末尾返回-1

package day10;

import java.io.*;

public class DuquGouzao {
    public static void main(String[] args) throws IOException {
        // 1.创建FileInputStream对象,构造方法中绑定要读取的数据
        InputStream fis1 = new FileInputStream("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
        //  2.使用FileInputStream对象中的方法read,读取文件
        //int read() 读取一个字节
        int i = 0;
        while ((i = fis1.read())!=-1){
            System.out.print(" "+i+" ");//67 -->A
            System.out.print((char)i);// 67 C 68 D
            i--;
        }
        //  3.释放资源
        fis1.close();
    }
}
while((i=fis1.read())!=-1)

  2、使用字节数组读取

package day10;

import java.io.FileInputStream;
import java.io.IOException;

public class DuquArr {
    public static void main(String[] args) throws IOException {
        //1.创建FileInputStream对象,构造方法中绑定要读取的数据
        FileInputStream fis = new FileInputStream("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
        //2.使用FileInputStream对象中的方法read,读取文件
        //定义字节数组 长度为2
        byte[] bytes = new byte[2];
        //每次读取两个字节
        //fis.read(bytes);
        //System.out.println(new String(bytes));//所以输出 AB
        int len =0;
        while ((len=fis.read(bytes))!=-1){
            System.out.print(new String (bytes));
        }
        //ABCDE
        System.out.println();
        //3.释放资源
        fis.close();
    }
}
fis.read(byte[] bytes)

  读取到文件的末尾返回-1

字节流练习:图片复制

  1、复制原理图解

  原理:从已有的文件中读取字节,将该字节写出到另外一个文件中

   2、代码实现

package day10;

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

public class CopyPic {
    public static void main(String[] args) throws IOException {
        //读 目的地
        FileInputStream fis = new FileInputStream("C:\\Users\\YIAN\\Desktop\\File\\test.png");
        //写 目的地
        FileOutputStream fos = new FileOutputStream("C:\\Users\\YIAN\\Desktop\\Tools\\b.png");

        int len = 0;
        while ((len=fis.read())!=-1){
            System.out.println(len);
            //写入到目的地文件夹
            fos.write(len);
        }
        //关闭读取流
        fis.close();
        //关闭写入流
        fos.close();
        System.out.println("Finished!");
    }
}
CopyPic
package day10;

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

public class CopyPic {
    public static void main(String[] args) throws IOException {
        //读 目的地
        FileInputStream fis = new FileInputStream("C:\\Users\\YIAN\\Desktop\\File\\test.png");
        //写 目的地
        FileOutputStream fos = new FileOutputStream("C:\\Users\\YIAN\\Desktop\\Tools\\b.png");

//        int len = 0;
//        while ((len=fis.read())!=-1){
//            System.out.println(len);
//            //写入到目的地文件夹
//            fos.write(len);
//        }

        //提高效率
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len=fis.read(bytes))!=-1){
            fos.write(bytes);
        }
        //关闭写入流
        fos.close();
        //关闭读取流
        fis.close();
        System.out.println("Finished!");
    }
}
优化·

  注意:

  流的关闭原则:先开后关,后开先关

字符流

概述

  当使用字节流读取文本文件时,可能会出现一个小问题。即遇到中文字符时,可能不会显示完整的字符(乱码),因为一个中文字符占用多个字节存储。所以java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

  例如发生的问题:

public class demo {
    public static void main(String[] args) throws IOException {
        //1.txt 内容 A安琪拉B123
        FileInputStream fis = new FileInputStream("C:\\Users\\YIAN\\Desktop\\File\\1.txt");
        int len =0;
        while ((len = fis.read())!=-1){
            System.out.print((char)len);//A安琪拉B123
            //字母和数字不受影响 但中文变为乱码
        }
        fis.close();
    }
}

字符输入流(reader)

  java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。
  public void close() 关闭此流并释放与此流相关联的任何系统资源。
  public int read() 从输入流读取一个字符。
  public int read(char[] cbuf) 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。

FileReader类

  java.io.FileReader 类是读取字符文件的遍历类。构造时使用系统默认的字符编码和默认字节缓冲区

  1、构造方法

  FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。
  FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。

  参数说明:

  file、name :读取字符的目的地

  2、读取字符数据

  a、读取字符

package day10;

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;

public class demo {
    public static void main(String[] args) throws IOException {
        //1.txt 内容 A安琪拉B123
       // FileInputStream fis = new FileInputStream("C:\\Users\\YIAN\\Desktop\\File\\1.txt");
        FileReader fr = new FileReader("C:\\Users\\YIAN\\Desktop\\File\\1.txt");
        int read = fr.read();
        System.out.println(read);//65
        System.out.println((char)read);//A
        fr.close();
    }
}
读取单个字符
package day10;

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;

public class demo {
    public static void main(String[] args) throws IOException {
        //1.txt 内容 A安琪拉B123
       // FileInputStream fis = new FileInputStream("C:\\Users\\YIAN\\Desktop\\File\\1.txt");
        FileReader fr = new FileReader("C:\\Users\\YIAN\\Desktop\\File\\1.txt");
        int len =0;
        while ((len = fr.read())!=-1){
            System.out.print((char)len);//A安琪拉B123
        }
        fr.close();
    }
}
FileReader

  b、使用字符数组读取

package day10;

import java.io.IOException;
import java.io.FileReader;

public class demo01 {
    public static void main(String[] args) throws IOException {
        //1.txt 内容 A安琪拉B123
        FileReader fr = new FileReader("C:\\Users\\YIAN\\Desktop\\File\\1.txt");
        char[] cbuf = new char[2];
        int len = 0;
        while ((len = fr.read(cbuf))!=-1){
            System.out.println(new String(cbuf));
            /**
             * A安
             * 琪拉
             * B1
             * 23
             */
        }
        fr.close();
    }
}
.read(char[] cbuff)
package day10;

import java.io.IOException;
import java.io.FileReader;

public class demo01 {
    public static void main(String[] args) throws IOException {
        //1.txt 内容 A安琪拉B123
        FileReader fr = new FileReader("C:\\Users\\YIAN\\Desktop\\File\\1.txt");
        char[] cbuf = new char[10];
        int len = 0;
        while ((len = fr.read(cbuf))!=-1){
            System.out.println(new String(cbuf));//A安琪拉B123  
          
        }
        fr.close();
    }
}
读取多个字符

字符输出流(writer)

  java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法

  void write(int c):写入单个字符。
  void write(char[] cbuf) :写入字符数组。
  abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
  void write(String str): 写入字符串。
  void write(String str, int off, int len)写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
  void flush() 刷新该流的缓冲。
  void close()关闭此流,但要先刷新它

FileWriter类

  1、构造方法

  FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。

  FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称。

  参数说明:

  file、fileName:写入字符的目的地

public class W_demo {
    public static void main(String[] args) throws IOException {
        //使用File对象创建字符流
        File file = new File("C:\\Users\\YIAN\\Desktop\\File\\a.txt");
        FileWriter fw = new FileWriter(file);
        
        //使用文件名创建字符流
        FileWriter fw2 = new FileWriter("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
    }
}

  2、基本写出数据

  1.写出字符 write(int b) 方法 

package day10;

import java.io.*;

public class FileWrite_demo {
    public static void main(String[] args) throws IOException {
        //创建流对象
        FileWriter fw = new FileWriter("C:\\Users\\YIAN\\Desktop\\File\\a.txt");
        fw.write("Y");
        fw.write("a");
        fw.write(98);
        fw.write(30000);
        //刷新
        fw.flush();
        //关闭流
        fw.close();
        //写入结果:Yab田
    }
}
wirte(int b)

  注意:

  1.虽然参数为int类型四个字节,但是只会暴露一个字符信息写出

  2.如果未调用close方法数据只是保存到缓冲区,并不会写到文件中

  关闭和刷新

  因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要 flush 方法了。

  flush:刷新缓冲区,流对象可以继续使用

  close:先刷新缓冲区,然后释放资源

package day10;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Writer_demo01 {
    public static void main(String[] args) throws IOException {
        //File file = new File("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
        //file.createNewFile();
        FileWriter fw = new FileWriter("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
        fw.write("刷新");
        fw.flush();
        fw.write("写入");
        fw.flush();
        fw.write("关闭");
        fw.flush();
        fw.close();
        fw.write("继续写?");//继续写 报错 java.io.IOException: Stream closed
        fw.close();


    }
}
for example

  2.写出字符数组

package day10;

import java.io.FileWriter;
import java.io.*;

public class Write_demo02 {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
        char[] chars = new char[]{'陈','易','安'};
        fw.write(chars);
        fw.flush();
        fw.close();
    }
}
.write(char[] cbuff)

  注意:写入数据,都会把源文件内容清空掉,没有改文件会创建该文件,除非文件都是假的

  3.写出字符串

package day10;

import java.io.FileWriter;
import java.io.*;

public class Write_demo03 {
    public static void main(String[] args) throws IOException {
        FileWriter fw =new FileWriter("C:\\Users\\YIAN\\Desktop\\File\\b.txt");
        fw.write("陈易安到此一游~");
        fw.flush();
        fw.close();
        //陈易安到此一游~
    }
}
.write(String str)

  4、续写与换行

package day10;

import java.io.FileWriter;
import java.io.IOException;

public class Write_demo04 {
    public static void main(String[] args) throws IOException {
        //末尾加,true表示追加
        FileWriter fw =new FileWriter("C:\\Users\\YIAN\\Desktop\\File\\b.txt",true);
        //写换行符
        fw.write("\n");
        fw.flush();
        //追加内容
        fw.write("我又来啦~");
        fw.flush();
        
        fw.close();
        /**
         * 陈易安到此一游~
         * 我又来啦~
         */

    }
}
追加与换行(与FileOutputStream类似)

IO异常的处理

  在之前,我们一直把异常抛出(让JVM解决),实际开发中并不能这样处理,建议使用try...catch...finally代码块,处理异常部分。

  例如:

package day10;

import java.io.FileWriter;
import java.io.IOException;

public class demo02 {
    public static void main(String[] args) {
        //声明变量
        FileWriter fw = null;

        try {
            fw = new FileWriter("C:\\Users\\YIAN\\Desktop\\File\\a.txt");
            fw.write("测试鸭~");
            fw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(fw!=null){
                    fw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
try...catch...finally

属性集

概述

  java.util.Properties集合 extends Hashtable<k,v> implements Map<k,v>

  java.util.Properties类表示一个持久的属性集,可以保存在流中或从流中加载。

  java.util.Properties集合是一个唯一和IO流相结合的集合

    可以使用java.util.Properties集合中的store,把集合中的临时数据持久化写入到硬盘存储

    可以使用java.util.Properties集合中的load,把硬盘中保存的文件(键值对),读取到集合中使用

  注意:

  java.util.Properties集合是一个双列集合key和value默认都是字符串

properties类

  1、构造方法 

  public properties():创建一个空的属性列表

  2、基本存储方法:

  public Object setProperty(String key, String value) : 保存一对属性。

  public String getProperty(String key) :使用此属性列表中指定的键搜索属性值。
  public Set<String> stringPropertyNames() :所有键的名称的集合。 

package day10;

import java.util.Iterator;
import java.util.Properties;
import java.util.Set;

public class Properties_demo {
    public static void main(String[] args) {
        //创建属性集对象
        Properties pts = new Properties();
        //添加键值对元素 k,v都是String型的
        pts.setProperty("陈奕迅","爱情转移");
        pts.setProperty("林俊杰","江南");
        pts.setProperty("刘莱斯","浮生");
        //打印实现集对象
        System.out.println(pts);//{刘莱斯=浮生, 林俊杰=江南, 陈奕迅=爱情转移}
        //通过key 获取value
        System.out.println(pts.getProperty("陈奕迅"));//爱情转移
        System.out.println(pts.getProperty("林俊杰"));//江南
        System.out.println(pts.getProperty("刘莱斯"));//浮生
        //遍历属性集
        Set<String> str = pts.stringPropertyNames();
        for (String s:str
             ) {
            System.out.println(s+"--->"+pts.getProperty(s));
            //刘莱斯--->浮生
            //林俊杰--->江南
            //陈奕迅--->爱情转移
        }
        //使用迭代器(复习)
        Set<String> str01 = pts.stringPropertyNames();
        Iterator<String> it = str01.iterator();
        while (it.hasNext()){
            String key = it.next();
            System.out.println(key+"______"+pts.getProperty(key));
            /**
             * 刘莱斯______浮生
             * 林俊杰______江南
             * 陈奕迅______爱情转移
             */
        }
    }
}
属性集、添加、遍历

  3、与流相关的方法

  public void store(FileWrite,String comments):将Properties中的临时文件,存储到硬盘

  使用步骤

  * 1.创建properties集合对象 添加数据
  * 2.创建字符输出流/字符输出流对象,构造方法绑定要输出的目的地
  * 3.使用Properties集合中的store方法,把临时数据,持久化写入到硬盘
  * 4.释放资源

package day10;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;

public class store {
    public static void main(String[] args) throws IOException {
        //1.创建properties集合对象 添加数据
        Properties pts = new Properties();
        pts.setProperty("陈奕迅","爱情转移");
        pts.setProperty("林俊杰","江南");
        pts.setProperty("刘莱斯","浮生");
        //2.创建字符输出流/字符输出流对象,构造方法绑定要输出的目的地
        File file = new File("C:\\Users\\YIAN\\Desktop\\File\\e.txt");
        file.createNewFile();

        FileWriter fw = new FileWriter("C:\\Users\\YIAN\\Desktop\\File\\e.txt",true);
        //3.使用Properties集合中的store方法,把临时数据,持久化写入到硬盘
        pts.store(fw,"save data");
        fw.close();
    }
}
Properties--store()

  public void load(InputStream inStream) 从字节输入流中读取键值对

  参数中使用了字节输入流,通过流对象,可以关联到某文件上,这样就能够加载文本中的数据了。

  我写在文件中的格式:

  代码演示:

package day10;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;

public class Properties_demo01 {
    public static void main(String[] args) throws IOException {
        //创建属性集对象
        Properties pts = new Properties();
        //加载文本中信息到属性集
        pts.load(new FileInputStream("C:\\Users\\YIAN\\Desktop\\File\\b.txt"));
        //遍历集合并打印
        Set<String> str = pts.stringPropertyNames();
//        System.out.println(str);
        for (String key:str
             ) {
            System.out.println(key+pts.getProperty(key));
            /**
             * key02----world
             * key01----hello
             * key03----!
             */
        }
    }
}
Properties.load()

 

posted @ 2021-03-31 22:18  心岛未晴  阅读(876)  评论(0)    收藏  举报