概述

计算机内存与硬盘之间时常有交互行为,由于参考对象是内存,所以我们把数据从硬盘到内存传输的行为称为输入,也叫写;相反地,数据从内存到硬盘传输的行为称为输出,也叫读。由于数据传输的动作是像流水一样,因此传输的数据也被称为流,于是就有了输入流和输出流的概念。
IO流有2种分类,按照流的方向可分为输入流和输出流;按读取数据的方式可分为字节流和字符流,其中字节流是万能的,能传输各种格式的数据,而字符流只能传输纯文本文件,即能用记事本打开的文件。
Java的IO流有4个抽象类,分别是InputStream-OutputStream、Reader-Writer,以Stream结尾的文件称为字节流文件,以Reader或Writer结尾的文件被称为字符流文件。值得注意的是,只有数据传输时内存和硬盘的通道才会被打开,所以数据传输完毕后所有流都有关闭流的动作,因此所有流都实现了Closeable接口。同时,当内存向硬盘传输数据完成以后,是需要刷新的,因为这个刷新的动作表示将管道中剩余未输出的数据强行清空,所以所有的输出流都会实现Flushable接口,如果没有实现此接口,则有可能数据在传输过程中会丢失。
image.png
注:①路径中,\和/是等效的 ②IDEA目录中,默认的路径是当前工程下的根目录
先以FileInputstream类为例,介绍以下几个方法:
image.png
image.png

字节流

  1. package IOStream;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. public class FileInputStreamTest03 {
  6. public static void main(String[] args) {
  7. FileInputStream fis = null;
  8. try {
  9. //创建文件字节输出流对象
  10. //此文件建在project的直接目录下
  11. fis = new FileInputStream("mytest1.txt");
  12. int readCount;
  13. byte[] bytes = new byte[1024];
  14. while ((readCount = fis.read(bytes))!= -1){
  15. System.out.println(readCount);//19
  16. //以byte[1024]大小的数组去读,然后数据留在了数组中,再将数组中的数据转成String类型
  17. //String类的构造方法,String(char[]),字符数组转成字符串
  18. System.out.println(new String(bytes,0,readCount));//heLLo,?? world...
  19. }
  20. } catch (FileNotFoundException e) {
  21. e.printStackTrace();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. } finally {
  25. //关闭流
  26. if (fis != null) {
  27. try {
  28. fis.close();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34. }
  35. }
  36. FileInputStream类的其他2个方法:
  37. package IOStream;
  38. import java.io.File;
  39. import java.io.FileInputStream;
  40. import java.io.FileNotFoundException;
  41. import java.io.IOException;
  42. /**
  43. * FileInputStream类的其他常用方法
  44. * ①int available():其作用是避免了while()循环,不需要判断是不是读到头了。这个方法不适合大文件
  45. * ②long skip(long n):跳过几个字节不读
  46. */
  47. public class FileInputStream04 {
  48. public static void main(String[] args) {
  49. testAvailMethod();
  50. testSkipMethod();
  51. }
  52. private static void testAvailMethod() {
  53. FileInputStream fis = null;
  54. try {
  55. fis = new FileInputStream("mytest1.txt");
  56. System.out.println("刚开始读的字节数:" + fis.available()); //刚开始读的字节数:14
  57. int readCount = fis.read();
  58. System.out.println("读完后的字节数:" + fis.available()); //读完后的字节数:13
  59. System.out.println(new String(new byte[fis.available()])); //
  60. } catch (FileNotFoundException e) {
  61. e.printStackTrace();
  62. } catch (IOException e) {
  63. e.printStackTrace();
  64. } finally {
  65. try {
  66. fis.close();
  67. } catch (IOException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. }
  72. public static void testSkipMethod(){
  73. FileInputStream fis = null;
  74. File file = new File("mytest1.txt");
  75. try {
  76. fis = new FileInputStream(file);
  77. fis.skip(3);
  78. System.out.println(new String(new byte[fis.available() - 3]));//
  79. } catch (FileNotFoundException e) {
  80. e.printStackTrace();
  81. } catch (IOException e) {
  82. e.printStackTrace();
  83. } finally {
  84. try {
  85. fis.close();
  86. } catch (IOException e) {
  87. e.printStackTrace();
  88. }
  89. }
  90. }
  91. }

FileOutputStream类用法类似,比如我们将刚才从文件读取的内容写到另外一个文件中:

  1. package IOStream;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. public class FileOutputStreamTest01 {
  7. public static void main(String[] args) {
  8. FileOutputStream fos = null;
  9. try {
  10. //以追加方式写入,英文字符和汉字。
  11. //注意:不追加的话每写一次就会清空之前的内容
  12. fos = new FileOutputStream("myoutfile.txt",true);
  13. byte[] bytes = {101,28,23,78,69};
  14. fos.write(bytes,0,bytes.length);
  15. String s = "今天天气不太好!!!";
  16. byte[] bytes1 = s.getBytes();
  17. fos.write(bytes1); //文件内容:eNE今天天气不太好!!!eNE今天天气不太好!!!
  18. fos.flush();
  19. } catch (FileNotFoundException e) {
  20. e.printStackTrace();
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }finally {
  24. try {
  25. fos.close();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }
  31. }

字节流复制文件
文件复制:由于C、D盘并不能直接交互,需要以内存为中介进行操作,所有需要边读边写,具体代码如下:

  1. package IOStream;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. public class CopyFileTest {
  7. public static void main(String[] args) {
  8. FileInputStream fis = null;
  9. FileOutputStream fos = null;
  10. try {
  11. fis = new FileInputStream("C:\\Users\\Simon\\Desktop\\List\\something convinient\\面试day726.md");
  12. fos = new FileOutputStream("D:\\面试day726.md");
  13. byte[] bytes = new byte[1024*1024];
  14. int readCount = 0;
  15. while ((readCount = fis.read(bytes,0,readCount))!= -1){
  16. fos.write(bytes,0,bytes.length);
  17. }
  18. fos.flush();
  19. } catch (FileNotFoundException e) {
  20. e.printStackTrace();
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }finally {
  24. if (fis != null) {
  25. try {
  26. fis.close();
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. if (fos != null) {
  32. try {
  33. fos.close();
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. }
  39. }
  40. }

字符流

  1. package IOStream;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. public class FileReaderTest {
  6. public static void main(String[] args) {
  7. FileReader fr = null;
  8. try {
  9. fr = new FileReader("D:\\DataValue\\project\\MyData\\Data1\\src\\IOStream\\iotest1.txt");
  10. char[] chars =new char[20];
  11. int readCount = 0;
  12. while ((readCount = fr.read(chars))!=-1){
  13. //hello,wo rld
  14. //sdaj
  15. //kfsdghsdkbk我就偶返回数据拷贝
  16. //到方便快速
  17. //撒娇不看电视
  18. System.out.println(new String(chars, 0, readCount));
  19. }
  20. } catch (FileNotFoundException e) {
  21. e.printStackTrace();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. } finally {
  25. if (fr != null) {
  26. try {
  27. fr.close();
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. }
  33. }
  34. }
  35. package IOStream;
  36. import java.io.FileWriter;
  37. import java.io.IOException;
  38. public class WriterTest {
  39. public static void main(String[] args) {
  40. FileWriter fw = null;
  41. try {
  42. fw = new FileWriter("D:\\Data\\temp.txt");
  43. char[] c = {'我','是','人'};
  44. fw.write(c);
  45. fw.write(c,0,2);
  46. fw.write("mytest.only you");//文件内容:我是人我是mytest.only you
  47. fw.flush();
  48. } catch (IOException e) {
  49. e.printStackTrace();
  50. }finally {
  51. if (fw != null) {
  52. try {
  53. fw.close();
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. }
  59. }
  60. }
  61. package IOStream;
  62. import java.io.FileNotFoundException;
  63. import java.io.FileReader;
  64. import java.io.FileWriter;
  65. import java.io.IOException;
  66. public class CopyFileTest2 {
  67. public static void main(String[] args) {
  68. FileReader in =null;
  69. FileWriter out = null;
  70. try {
  71. in = new FileReader("D:\\DataValue\\project\\MyData\\Data1\\src\\IOStream\\iotest1.txt");
  72. out = new FileWriter("D:\\DataValue\\project\\MyData\\Data1\\iotest1.txt");
  73. //文件输出:
  74. // hello,wo rld
  75. //sdajkfsdghsdkbk我就偶返回数据拷贝到方便快速
  76. //撒娇不看电视
  77. char[] chars = new char[1024*1024];
  78. int readCount = 0;
  79. while ((readCount=in.read(chars))!=-1){
  80. out.write(chars,0,readCount);
  81. }
  82. out.flush();
  83. } catch (FileNotFoundException e) {
  84. e.printStackTrace();
  85. } catch (IOException e) {
  86. e.printStackTrace();
  87. } finally {
  88. try {
  89. in.close();
  90. } catch (IOException e) {
  91. e.printStackTrace();
  92. }
  93. try {
  94. out.close();
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. }
  98. }
  99. }
  100. }

缓冲流

  1. package IOStream;
  2. import java.io.BufferedReader;
  3. import java.io.FileReader;
  4. /**
  5. *带缓冲区的字符流:
  6. * ①由于带缓冲区,所以不需要再指定字节数组或者字符数组
  7. * ②包装流、节点流
  8. *本流优点是,一读就读一行
  9. */
  10. public class BufferReaderTest{
  11. public static void main(String[] args) throws Exception{
  12. FileReader reader = new FileReader("D:\\DataValue\\project\\MyData\\Data1\\iotest1.txt");
  13. //这里,FileReader称为节点流,外部的BufferedReader称为包装流
  14. //这里的参数要传一个Reader类的对象,但Reader类是抽象的,所以可以以FileReader传入
  15. BufferedReader br = new BufferedReader(reader);
  16. String s = null;
  17. while ((s=br.readLine())!=null){
  18. //这里并不自带换行符
  19. System.out.println(s);
  20. //读取文件内容如下:
  21. // hello,wo rld
  22. //sdajkfsdghsdkbk我就偶返回数据拷贝到方便快速
  23. //撒娇不看电视
  24. }
  25. //对于包装流来说,只需要关闭最外层流就行,里面的节点流会自动关闭。
  26. br.close();
  27. }
  28. }
  29. //注意:文件字符流可以直接作为参数传入给缓冲流,但是字节流不行,它还必须经过转换流转成字符流
  30. //作为参数传入,所以会经历2次转换。
  31. package IOStream;
  32. import java.io.BufferedWriter;
  33. import java.io.FileOutputStream;
  34. import java.io.FileWriter;
  35. import java.io.OutputStreamWriter;
  36. public class BufferWriterTest {
  37. public static void main(String[] args) throws Exception{
  38. BufferedWriter bw = new BufferedWriter(new FileWriter("tetsBufferWriterTest.txt",true));
  39. BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream
  40. ("testBufferWriterTest2.txt",true)));
  41. bw.write("hello"+"\n");
  42. bw.write(100);
  43. bw.write("test0000001",0,3);
  44. //文件内容如下:
  45. // hello
  46. //dteshello
  47. //dtes
  48. bw2.write("my test for the .java file");
  49. //文件内容输出如下:
  50. // my test for the .java file
  51. bw.flush();
  52. bw.close();
  53. bw2.flush();
  54. bw2.close();
  55. }
  56. }

读入和写出:以字节流为节点流

  1. package sumup.iostream;
  2. import java.io.*;
  3. //以字节流作为缓冲流的节点流
  4. //运行成功
  5. public class IOStreamTest06 {
  6. public static void main(String[] args) {
  7. BufferedReader br = null;
  8. BufferedWriter bw = null;
  9. try {
  10. br = new BufferedReader(new InputStreamReader(new FileInputStream("myfile5")));
  11. String s = null;
  12. while ((s = br.readLine())!=null){
  13. System.out.println(s);
  14. }
  15. } catch (FileNotFoundException e) {
  16. e.printStackTrace();
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. } finally {
  20. if (br != null) {
  21. try {
  22. br.close();
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. try {
  29. bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("myfile7",true)));
  30. bw.write("m买买买");
  31. char[] chars = {'z','o','o'};
  32. bw.write(chars);
  33. bw.flush();
  34. } catch (FileNotFoundException e) {
  35. e.printStackTrace();
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }finally {
  39. try {
  40. bw.close();
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. }
  46. }

读入和写出:以字符流为节点流

  1. package sumup.iostream;
  2. import java.io.*;
  3. //运行成功
  4. //用缓冲流读入和写出一个java文件,先以字符流作为节点流
  5. public class IOStreamTest05 {
  6. public static void main(String[] args) {
  7. FileReader fr =null;
  8. BufferedWriter bw = null;
  9. try {
  10. fr = new FileReader("printLog");
  11. BufferedReader br = new BufferedReader(fr);
  12. String s = null;
  13. while ((s=br.readLine())!=null){
  14. System.out.println(s);
  15. }
  16. } catch (FileNotFoundException e) {
  17. e.printStackTrace();
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. } finally {
  21. try {
  22. fr.close();
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. try {
  28. FileWriter fw = new FileWriter("myfile5");
  29. bw = new BufferedWriter(fw);
  30. bw.write("这是一个秘密,请保密");
  31. bw.flush();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }finally {
  35. if (fr != null) {
  36. try {
  37. bw.close();
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }
  43. }
  44. }

数据流

  1. package IOStream;
  2. import java.io.DataOutputStream;
  3. import java.io.FileOutputStream;
  4. public class DataOutputStreamTest {
  5. public static void main(String[] args) throws Exception{
  6. DataOutputStream dos = new DataOutputStream(new FileOutputStream("dataOutputStream.txt"));
  7. //写数据
  8. byte b = 100;
  9. short s = 30;
  10. float f = 3.0f;
  11. double d = 3.0;
  12. int i = 3;
  13. char c ='c';
  14. //写:把数据及其类型写入文件,但由于不是普通文件,所以打开乱码
  15. dos.writeByte(b);
  16. dos.writeChar(c);
  17. dos.writeInt(i);
  18. dos.writeFloat(f);
  19. dos.flush();
  20. dos.close();
  21. }
  22. }
  23. package IOStream;
  24. import java.io.DataInputStream;
  25. import java.io.FileInputStream;
  26. /**
  27. * 按什么规则写,就按什么规则读
  28. */
  29. public class DataInputStreamTest {
  30. public static void main(String[] args) throws Exception{
  31. DataInputStream dis = new DataInputStream(new FileInputStream("dataOutputStream.txt"));
  32. //开始读
  33. byte b = dis.readByte();
  34. char c = dis.readChar();
  35. float f = dis.readFloat();
  36. int i = dis.readInt();
  37. //b:100 c:c f:4.2E-45 i:1077936128
  38. System.out.println("b:" + b + "\tc:" + c + "\tf:" + f + "\ti:" + i);
  39. dis.close();
  40. }
  41. }

标准打印流

  1. package IOStream;
  2. import java.io.FileOutputStream;
  3. import java.io.PrintStream;
  4. public class PrintStreamTest {
  5. public static void main(String[] args) throws Exception{
  6. PrintStream ps = System.out;
  7. ps.println("zs");
  8. ps.println("ls");
  9. ps.println("ww");
  10. //不再输出到控制台,而是输出到printLog文件中
  11. PrintStream pl = new PrintStream(new FileOutputStream("printLog"));
  12. System.setOut(pl);
  13. System.out.println("hello,world");
  14. System.out.println("hello,kitty");
  15. }
  16. }
  17. //一个案例
  18. package IOStream;
  19. import java.io.FileOutputStream;
  20. import java.io.PrintStream;
  21. import java.text.SimpleDateFormat;
  22. import java.util.Date;
  23. public class Logger {
  24. public static void log(String msg)throws Exception{
  25. //指向一个日志文件
  26. PrintStream out = new PrintStream(new FileOutputStream("loggerTest.txt", true));
  27. //改变输出方向
  28. System.setOut(out);
  29. //日期当前时间
  30. Date date = new Date();
  31. SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss SSS");
  32. String strTime = sdf.format(date);
  33. System.out.println(strTime + ":" + msg);
  34. }
  35. }
  36. package IOStream;
  37. public class LoggerTest {
  38. public static void main(String[] args) {
  39. try {
  40. Logger.log("zs做了一道奥数题");
  41. Logger.log("ls打了一桶水");
  42. Logger.log("ww完了一把游戏");
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  48. 新增文档内容:
  49. 2021/10/12 10:36:37 864:zs做了一道奥数题
  50. 2021/10/12 10:36:37 890:ls打了一桶水
  51. 2021/10/12 10:36:37 890:ww完了一把游戏

关于File类

  1. package IOStream;
  2. import java.io.File;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. /**
  6. * File的直接父类是Object,不属于四大家族,所以File类是不能完成文件读和写的
  7. * File对象是文件和目录的路径名的抽象表示形式
  8. * Fiel类的常用方法
  9. */
  10. public class FileTest {
  11. public static void main(String[] args) throws Exception{
  12. File file = new File("D:/file");
  13. System.out.println(file.exists()); //false
  14. //以文件形式新建
  15. /* if (!(file.exists())){
  16. file.createNewFile();
  17. }*/
  18. //以目录形式新建,可创建多重目录--->mkdirs
  19. if (!(file.exists())){
  20. file.mkdir();
  21. }
  22. //获取父路径
  23. System.out.println(file.getParent()); //D:\
  24. //获取父路径的绝对路径
  25. System.out.println(file.getParentFile().getAbsolutePath()); //D:\
  26. //获取文件名
  27. System.out.println(file.getName()); //file
  28. System.out.println(file.isDirectory()); //ture
  29. System.out.println(file.isFile()); //false
  30. //获取对象的最后一次修改时间
  31. long lm = file.lastModified();
  32. Date date = new Date(lm);
  33. SimpleDateFormat sdf = new SimpleDateFormat("yyyy - MM - dd HH:mm:ss SSS");
  34. System.out.println(sdf.format(date)); //2021 - 10 - 12 10:54:31 487
  35. //获取文件大小
  36. System.out.println(file.length()); //0
  37. //File中的listFiles方法
  38. File[] files = file.listFiles();
  39. for (File file1 : files) {
  40. System.out.println(file1.getName());
  41. //输出内容如下(是正确的):
  42. // 1
  43. //2
  44. //3.txt
  45. //4.txt
  46. }
  47. }
  48. }

对象流-序列化和反序列化

  1. package IOStream.bean;
  2. import java.io.Serializable;
  3. //Serializable标志性接口
  4. public class Student implements Serializable {
  5. private int no;
  6. private String name;
  7. //若 private transient String name;则最终输出:
  8. //Student{no=1111, name='null'}
  9. @Override
  10. public String toString() {
  11. return "Student{" +
  12. "no=" + no +
  13. ", name='" + name + '\'' +
  14. '}';
  15. }
  16. public int getNo() {
  17. return no;
  18. }
  19. public void setNo(int no) {
  20. this.no = no;
  21. }
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28. public Student(int no, String name) {
  29. this.no = no;
  30. this.name = name;
  31. }
  32. public Student() {
  33. }
  34. }
  35. package IOStream;
  36. import IOStream.bean.Student;
  37. import java.io.FileOutputStream;
  38. import java.io.ObjectOutputStream;
  39. import java.io.Serializable;
  40. /**
  41. * 对象的序列化和反序列化
  42. * 参与对象序列化和反序列的对象,必须实现Serializable接口
  43. * 仅有接口没有方法的称为标志性接口,作用是什么?
  44. * JVM看到这个接口后,会为这个类自动生成一个序列化版本号
  45. * 序列化版本号有什么用?每序列化一次就会生成一个序列化版本号,JVM怎么判断一个类有没有被改动?
  46. *①全类名是否变化 ②若①相同,比较2个序列化版本号是否一样,一样则表示为同一个类
  47. *
  48. */
  49. public class ObjectOutputStreamTest {
  50. public static void main(String[] args) throws Exception{
  51. //创建java对象
  52. Student s = new Student(1111, "zhangsan");
  53. //序列化
  54. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("studentTest"));
  55. //序列化对象
  56. oos.writeObject(s);
  57. oos.flush();
  58. oos.close();
  59. }
  60. }
  61. /**
  62. *注意:如果改动了代码,然后没有序列化,直接点了反序列化操作,会报以下异常:
  63. *Exception in thread "main" java.io.InvalidClassException: IOStream.bean.Student; local class incompatible: stream classdesc serialVersionUID = 9082654830569486289, local class serialVersionUID = 3103404913107206989
  64. at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)
  65. at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1885)
  66. at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
  67. at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
  68. at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
  69. at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
  70. at IOStream.ObjectInputStreamTest.main(ObjectInputStreamTest.java:9)
  71. Process finished with exit code 1
  72. */
  73. //自动生成序列化版本号有什么坏处?只要修改就必须重新编译。
  74. //所以凡是一个类实现了Serializable接口,建议给该类提供一个固定不变的序列化版本号
  75. //比如ArrayList的:private static final long serialVersionUID = 8683452581122892189L;
  76. package IOStream;
  77. import java.io.FileInputStream;
  78. import java.io.ObjectInputStream;
  79. public class ObjectInputStreamTest {
  80. public static void main(String[] args) throws Exception{
  81. ObjectInputStream ois = new ObjectInputStream(new FileInputStream("studentTest"));
  82. Object o = ois.readObject();
  83. System.out.println(o); //Student{no=1111, name='zhangsan'}
  84. ois.close();
  85. }
  86. }

IO和Properties的联合使用

在idea写一个Properties文件,以key-value形式存储在硬盘中,我们创建一个userinfo.txt文件,内容写入:
username=admin
password=123
########################################这个#号表示注释##########################

  1. package IOStream;
  2. import java.io.FileReader;
  3. import java.util.Properties;
  4. /**
  5. * Properties是一个Map集合,key和value都是String类型
  6. * 想将userinfo.txt文件中的数据加载到Properties对象中
  7. *
  8. * 这是一个非常好的设计理念:
  9. * 以后经常改变的数据,可以单独写到一个文件中,使用程序动态读取,将来只需要修改文件的内容,
  10. * java代码不需要改动,不需要重新编译,服务器也不需要重启
  11. *
  12. * 类似以上机制的这种文件称为配置文件,当配置文件的内容格式是:
  13. * key1=value;
  14. * key2=value;
  15. * 时,我们把这种配置文件称为属性配置文件
  16. *
  17. * java规范中有要求:属性配置文件建议以.properties结尾,但这不是必须的。
  18. * .properties是专门存放在属性配置文件内容的一个类
  19. */
  20. public class IOPropertiesTest {
  21. public static void main(String[] args) throws Exception{
  22. //创建文件字符输入流对象
  23. FileReader fr = new FileReader("D:\\IDEA_Data\\Data5\\test\\src\\userinfo.txt");
  24. //创建Map对象
  25. Properties properties = new Properties();
  26. //Map的load方法,将字符流对象加载进来
  27. properties.load(fr);
  28. //读取
  29. String username = properties.getProperty("username");
  30. String password = properties.getProperty("password");
  31. //username:admin,password:123
  32. System.out.println("username:" + username + ",password:" + password);
  33. }
  34. }