IO流
IO流概述和分类
I表示intput,是数据从硬盘进内存的过程,称之为读。
O表示output,是数据从内存到硬盘的过程。称之为写。
IO流的分类(一般IO流的分类是按照数据类型来分)
按流向分:
按数据类型分:
字节流
字节输出流(字节流写数据)
1、创建字节输出流对象
构造方法:
FileOutputStream(File file) 创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(String name) 创建文件输出流以写入具有指定名称的文件。
如果文件不存在,会帮我们自动创建出来.
如果文件存在,会把文件清空.(如不想被清空,在第二个参数加true)
2、写数据
字节流写数据的3种方式:
void write(int b) 一次写一个字节数据
void write(byte[] b) 一次写一个字节数组数据
void write(byte[] b, int off, int len) 一次写一个字节数组的部分数据。将从偏移量 off开始的指定字节数组中的 len字节写入此文件输出流。
3、释放资源
每次使用完流必须要释放资源。
1 public static void main(String[] args) throws IOException { 2 //1.创建字节输出流的对象 3 FileOutputStream fos = new FileOutputStream("D:\\a.txt"); //底层调用new File,所以使用该简写就可以 4 //FileOutputStream fos = new FileOutputStream(new File("D:\\a.txt")); 5 //2.写数据(写出的整数,实际写出的是整数在码表上对应的字母) 6 //void write(int b) 一次写一个字节数据 7 fos.write(97); 8 fos.write(98); 9 //void write(byte[] b) 一次写一个字节数组数据 10 byte [] bys1 = {97,98,99}; 11 fos.write(bys1); 12 //void write(byte[] b, int off, int len) 一次写一个字节数组的部分数据 13 byte [] bys2 = {97,98,99,100,101,102,103}; 14 fos.write(bys2,1,2); 15 //3.释放资源 16 fos.close(); 17 }
字节流写数据实现换行
写完数据后,加换行符
windows:\r\n
linux:\n
mac:\r
字节流写数据实现追加写入
public FileOutputStream(String name,boolean append)
创建文件输出流以指定的名称写入文件。如果第二个参数为true ,不会清空文件里面的内容
1 public static void main(String[] args) throws IOException { 2 //第二个参数就是续写开关,如果没有传递,默认就是false,表示不打开续写功能,那么创建对象的这行代码会清空文件 3 //如果第二个参数为true,表示打开续写功能,那么创建对象的这行代码不会清空文件 4 FileOutputStream fos = new FileOutputStream("D:\\a.txt",true); 5 6 fos.write(97); 7 //加一个换行 8 fos.write("\r\n".getBytes()); 9 fos.write(98); 10 11 fos.close(); 12 }
字节流写数据加try…catch异常处理
finally:在异常处理时提供finally块来执行所有清除操作。比如说IO流中的释放资源
特点:被finally控制的语句一定会执行,除非JVM退出
异常处理标准格式:try….catch…finally
1 public static void main(String[] args) { 2 FileOutputStream fos = null; 3 try { 4 fos = new FileOutputStream("D:\\a.txt"); 5 fos.write(97); 6 }catch(IOException e){ 7 e.printStackTrace(); 8 }finally { 9 if(fos != null){ 10 try { 11 fos.close(); 12 } catch (IOException e) { 13 e.printStackTrace(); 14 } 15 } 16 } 17 }
字节输入流(字节流读数据)
1、创建字节输入流对象
构造方法:
FileInputStream(File file) 通过打开与实际文件的连接来创建 FileInputStream ,该文件由文件系统中的 File对象 file命名。
FileInputStream(String name) 通过打开与实际文件的连接来创建 FileInputStream ,该文件由文件系统中的路径名 name命名。
如果文件不存在,就直接报错
2、读数据
int read() 从此输入流中读取一个字节的数据。
一次读取一个字节
返回值就是本次读到的那个字节数据。读出来的是文件中数据的码表值。 a->97。如果想要看到的是字符数据,要强转成char
读取多个字节
3、释放资源
每次使用完流必须要释放资源。
1 public static void main(String[] args) throws IOException { 2 FileInputStream fis = new FileInputStream("bytestream\\a.txt"); 3 //一次读取一个字节 4 int read = fis.read(); 5 System.out.println((char)read); //如果想看到字符数据,需要强转成char 6 //读取多个字节 7 int b; 8 while ((b = fis.read())!=-1){ 9 System.out.println((char) b); 10 } 11 12 //释放资源 13 fis.close(); 14 }
提高拷贝速度的解决方案
为了解决速度问题,字节流通过创建字节数组,可以一次读写多个数据。
一次读一个字节数组的方法:
public int read(byte[] b):从输入流读取最多b.length个字节的数据
返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
1 public static void main(String[] args) throws IOException { 2 //创建了字节输入流,准备读数据 3 FileInputStream fis = new FileInputStream("C:\\a.avi"); 4 //创建了字节输出流,准备写数据 5 FileOutputStream fos = new FileOutputStream("bytestream\\a.avi"); 6 7 byte [] bytes = new byte[1024]; 8 int len; //本次读到的有效字节个数-这次读了几个字节 9 while((len = fis.read(bytes))!=-1){ 10 fos.write(bytes,0,len); 11 } 12 fis.close(); 13 fos.close(); 14 }
字节缓冲流
BufferedOutputStream:缓冲输出流
BufferedInputStream:缓冲输入流
构造方法:
字节缓冲输出流:BufferedOutputStream(OutputStream out)
字节缓冲输入流:BufferedInputStream(InputStream in)
字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作
一次操作一个字节
1 public static void main(String[] args) throws IOException { 2 //创建一个字节缓冲输入流 3 //在底层创建了一个默认长度为8192的字节数组 4 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\a.txt")); 5 //创建一个字节缓冲输出流 6 //在底层也创建了一个默认长度为8192的字节数组 7 BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("D:\\copy.txt")); 8 9 int b; 10 while((b=bis.read())!=-1){ 11 bos.write(b); 12 } 13 //方法的底层把字节流关闭 14 bis.close(); 15 bos.close(); 16 }
原理
内存中进行数据读写,内存运行速度非常快,减少了硬盘与内存数据的传递次数,从而提高性能。
一次操作一个字节数组
1 public static void main(String[] args) throws IOException { 2 //创建一个字节缓冲输入流 3 //在底层创建了一个默认长度为8192的字节数组 4 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\a.txt")); 5 //创建一个字节缓冲输出流 6 //在底层也创建了一个默认长度为8192的字节数组 7 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\copy.txt")); 8 9 byte[] bytes = new byte[1024]; 10 int len; 11 while ((len = bis.read(bytes)) != -1) { 12 bos.write(bytes, 0, len); 13 } 14 //方法的底层把字节流关闭 15 bis.close(); 16 bos.close(); 17 }
原理:
字符流
字符串中的编码解码问题
windows默认使用码表为:GBK,一个字符两个字节。
idea和以后工作默认使用Unicode的UTF-8编解码格式,一个中文三个字节。
编码:
byte[] getBytes():使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName):使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
解码:
构造方法
String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的 String
1 public static void main(String[] args) throws UnsupportedEncodingException { 2 String s = "程序员"; 3 4 // byte[] getBytes():使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中 5 //利用idea默认的UTF-8将中文编码为一系列的字节 6 byte[] bytes1 = s.getBytes(); 7 System.out.println(Arrays.toString(bytes1)); //[-25, -88, -117, -27, -70, -113, -27, -111, -104] 8 9 // byte[] getBytes(String charsetName):使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中 10 byte[] bytes2 = s.getBytes("GBK"); 11 System.out.println(Arrays.toString(bytes2)); //[-77, -52, -48, -14, -44, -79] 12 13 // String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的 String 14 byte [] bytes3 = {-25, -88, -117, -27, -70, -113, -27, -111, -104}; //UTF-8 15 //利用默认的UTF-8进行解码 16 String s1 = new String(bytes3); 17 System.out.println(s1);//程序员 18 19 // String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的 String 20 byte [] bytes4 = {-77, -52, -48, -14, -44, -79}; //gbk 21 //利用指定的GBK进行解码 22 String s2 = new String(bytes4,"gbk"); 23 System.out.println(s2);//程序员 24 }
注:字节流一次读一个字节,不管GBK还是UTF-8一个中文都是多个字节,用字节流每次只能读其中的一部分,所以会出现乱码问题。
字符流读取中文的过程
1.字符流 = 字节流 + 编码表
2.不管是在哪张码表中,中文的第一个字节一定是负数。
3.想要进行拷贝,一律使用字节流或者字节缓冲流
4.想要把文件中的数据读到内存中打印或者读到内存中运算,请使用字符输入流。
5.想要把集合,数组,键盘录入等数据写到文件中,请使用字符输出流
字符流写数据
1、创建字符输出流对象。
FileWriter(File file) 给 File写一个 FileWriter ,使用平台的 default charset
FileWriter(String fileName) 构造一个 FileWriter给出文件名,使用平台的 default charset
如果文件不存在,就创建。但是要保证父级路径存在。
如果文件存在就清空。
2、写数据
void write(int c) 写一个字符
void write(char[] cbuf) 写入一个字符数组
void write(char[] cbuf, int off, int len) 写入字符数组的一部分
void write(String str) 写一个字符串
void write(String str, int off, int len) 写一个字符串的一部分
写出int类型的整数,实际写出的是整数在码表上对应的字母。
写出字符串数据,是把字符串本身原样写出。
3、释放资源
每次使用完流必须要释放资源。
1 public static void main(String[] args) throws IOException { 2 //创建字符输出流的对象 3 //FileWriter fw = new FileWriter(new File("charstream\\a.txt")); 4 FileWriter fw = new FileWriter("charstream\\a.txt"); 5 6 //写出数据 7 //void write(int c) 写一个字符 8 fw.write(97); 9 10 //void write(char[] cbuf) 写出一个字符数组 11 char [] chars = {97,98,99,100,101}; 12 fw.write(chars); 13 14 //void write(char[] cbuf, int off, int len) 写出字符数组的一部分 15 char [] chars1 = {97,98,99,100,101}; 16 fw.write(chars1,0,3); 17 18 //void write(String str) 写一个字符串 19 String line = "程序员abc"; 20 fw.write(line); 21 22 //void write(String str, int off, int len) 写一个字符串的一部分 23 String line1 = "程序员abc"; 24 fw.write(line1,0,2); 25 26 //释放资源 27 fw.close(); 28 }
flush和close方法
flush() 刷新流,刷新完毕之后,还可以继续写数据
close() 关闭流,释放资源。但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
1 public static void main(String[] args) throws IOException { 2 FileWriter fw = new FileWriter("charstream\\a.txt"); 3 fw.write("程序员"); 4 //fw.flush(); 5 fw.write("666"); 6 7 fw.close(); 8 fw.write("aaa");//报错:Stream closed 9 }
字符流读数据
1、创建字符输入流对象。
FileReader(File file) 使用平台FileReader ,在File读取时创建一个新的FileReader
FileReader(String fileName) 使用平台default charset创建一个新的FileReader,给定要读取的文件的名称 。
2、读数据
int read() 一次读一个字符数据
int read(char[] cbuf) 一次读一个字符数组数据
3、释放资源
每次使用完流必须要释放资源。
1 public static void main(String[] args) throws IOException { 2 //创建字符输入流的对象 3 // FileReader fr = new FileReader(new File("charstream\\a.txt")); 4 FileReader fr = new FileReader("charstream\\a.txt"); 5 6 //读取数据 7 //一次读取一个字符 8 int ch; 9 while((ch = fr.read()) != -1){ 10 System.out.println((char) ch); 11 } 12 13 //一次读取多个字符 14 //创建一个数组 15 char [] chars = new char[1024]; 16 int len; 17 //read方法还是读取,但是是一次读取多个字符,把读到的字符都存入到chars数组。 18 //返回值:表示本次读到了多少个字符。 19 while((len = fr.read(chars))!=-1){ 20 System.out.println(new String(chars,0,len)); 21 } 22 23 //释放资源 24 fr.close(); 25 }
字符缓冲流
BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途
构造方法:
BufferedWriter(Writer out)
BufferedReader(Reader in)
1 public static void main(String[] args) throws IOException { 2 //字符缓冲输入流 3 BufferedReader br = new BufferedReader(new FileReader("charstream\\a.txt")); 4 5 //读取数据 6 char [] chars = new char[1024]; 7 int len; 8 while((len = br.read(chars)) != -1){ 9 System.out.println(new String(chars,0,len)); 10 } 11 12 br.close(); 13 }
1 public static void main(String[] args) throws IOException { 2 //字符缓冲输出流 3 BufferedWriter bw = new BufferedWriter(new FileWriter("charstream\\a.txt")); 4 5 //写出数据 6 //实际写出的是97对应的字符a 7 bw.write(97); 8 bw.write("\r\n"); 9 10 //实际写出的是97 - 101 对应的字符 abcde 11 char [] chars = {97,98,99,100,101}; 12 bw.write(chars); 13 bw.write("\r\n"); 14 15 //实际写的是abc 16 bw.write(chars,0,3); 17 bw.write("\r\n"); 18 19 //会把字符串的内容原样写出 20 bw.write("程序员"); 21 bw.write("\r\n"); 22 23 //会把字符串的一部分写出 abcde 24 String line = "abcdefg"; 25 bw.write(line,0,5); 26 27 bw.flush(); 28 29 bw.close(); 30 }
字符缓冲流特有功能
BufferedWriter
void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
1 public static void main(String[] args) throws IOException { 2 //创建对象 3 BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\a.txt")); 4 //写出数据 5 bw.write("程序员666"); 6 //跨平台的回车换行 7 bw.newLine(); 8 bw.write("abcdef"); 9 //刷新流 10 bw.flush(); 11 //释放资源 12 bw.close(); 13 }
BufferedReader
public String readLine() :读一行文字。 结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null
public static void main(String[] args) throws IOException { //创建对象 BufferedReader br = new BufferedReader(new FileReader("D:\\a.txt")); //使用循环来进行改进 String line; //可以读取一整行数据。一直读,读到回车换行为止。不会读取回车换行符。 while((line = br.readLine()) != null){ System.out.println(line); } //释放资源 br.close(); }
转换流
转换流就是来进行字节流和字符流之间转换的
InputStreamReader是从字节流到字符流的桥梁
OutputStreamWriter是从字符流到字节流的桥梁
在JDK11之前,指定编码读写
InputStreamReader(InputStream in, String charsetName) 创建一个使用指定charset的InputStreamReader
OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定charset的OutputStreamWriter
1 public static void main(String[] args) throws IOException { 2 //使用FileReader方法直接读取会产生乱码,因为文件是GBK码表,而idea默认的是UTF-8编码格式,两者不一致,导致乱码 3 //FileReader fr = new FileReader("C:\\a.txt"); 4 InputStreamReader isr = new InputStreamReader(new FileInputStream("C:\\a.txt"),"gbk"); 5 int ch; 6 while((ch = isr.read())!=-1){ 7 System.out.println((char) ch); 8 } 9 isr.close(); 10 11 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\b.txt"),"UTF-8"); 12 osw.write("我爱学习"); 13 osw.close(); 14 }
在JDK11之后,字符流新推出了一个构造
FileReader(String fileName, Charset charset) 给定要读取的文件的名称和FileReader ,创建一个新的FileReader 。
FileWriter(String fileName, Charset charset) 构造一个FileWriter给出文件名和charset 。
1 public static void main(String[] args) throws IOException { 2 FileReader fr = new FileReader("C:\\a.txt", Charset.forName("gbk")); 3 int ch; 4 while ((ch = fr.read())!=-1){ 5 System.out.println((char) ch); 6 } 7 fr.close(); 8 }
对象操作流
可以把对象以字节的形式写到本地文件,直接打开文件,是读不懂的,需要再次用对象操作流读到内存中。
对象操作输出流(对象序列化流)
就是将对象写到本地文件中,或者在网络中传输对象
ObjectOutputStream(OutputStream out) 创建一个写入指定OutputStream的ObjectOutputStream。
如果想要这个类的对象能被序列化,那么这个类必须要实现一个接口:Serializable
Serializable 接口的意义:称之为是一个标记性接口,里面没有任何的抽象方法。只要一个类实现了这个Serializable接口,那么就表示这个类的对象可以被序列化.
1 public class User implements Serializable { 2 private String username; 3 private String password; 4 public User() { 5 } 6 ... 7 }
1 public static void main(String[] args) throws IOException { 2 User user = new User("zhangsan","qwer"); 3 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt")); 4 oos.writeObject(user); 5 oos.close(); 6 }
对象操作输入流(对象反序列化流)
把写到本地文件中的对象读到内存中,或者接收网络中传输的对象
ObjectInputStream(InputStream in) 创建一个从指定的InputStream读取的ObjectInputStream。
1 public static void main(String[] args) throws IOException, ClassNotFoundException { 2 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt")); 3 User o = (User) ois.readObject(); 4 System.out.println(o); 5 ois.close(); 6 }
对象操作流注意点
1、用对象序列化流序列化了一个对象后,如修改了对象所属的Javabean类,读取数据会抛出InvalidClassException异常
serialVersionUID 序列号:如果我们自己没有定义,那么虚拟机会根据类中的信息会自动的计算出一个序列号.
InvalidClassException异常问题:如果我们修改了类中的信息.那么虚拟机会再次计算出一个序列号.
第一步:把User对象序列化到本地.序列号为-5824992206458892149
第二步:修改了javabean类. 导致类中的序列号为4900133124572371851
第三步:把文件中的对象读到内存. 本地中的序列号和类中的序列号不一致了.
解决:不让虚拟机帮我们自动计算,我们自己手动给对象所属的类加一个serialVersionUID。而且这个值不要变.
private static final long serialVersionUID = 42L;
2、如果一个对象中的某个成员变量的值不想被序列化,需要给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程。
1 public class User implements Serializable { 2 private static final long serialVersionUID = 1L; 3 private String username; 4 private transient String password; 5 6 public User() { 7 } 8 ... 9 @Override 10 public String toString() { 11 return "User{" + 12 "username='" + username + '\'' + 13 ", password='" + password + '\'' + 14 '}'; 15 } 16 }
用对象操作流读写多个对象
方式1:
1 public static void main(String[] args) throws IOException, ClassNotFoundException { 2 Student s1 = new Student("张三",16); 3 Student s2 = new Student("李四",23); 4 5 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt")); 6 oos.writeObject(s1); 7 oos.writeObject(s2); 8 oos.close(); 9 10 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt")); 11 Object obj; 12 //ObjectInputStream到文件结束,会出现EOFException 13 while(true){ 14 try { 15 Object o = ois.readObject(); 16 System.out.println(o); 17 } catch (EOFException e) { 18 break; 19 } 20 } 21 ois.close(); 22 }
方式2:
1 public static void main(String[] args) throws IOException, ClassNotFoundException { 2 Student s1 = new Student("张三",16); 3 Student s2 = new Student("李四",23); 4 5 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt")); 6 ArrayList<Student> list = new ArrayList<>(); 7 list.add(s1); 8 list.add(s2); 9 10 //在本地文件中写的就是一个集合 11 oos.writeObject(list); 12 oos.close(); 13 14 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt")); 15 ArrayList<Student> list2 = (ArrayList<Student>) ois.readObject(); 16 for (Student student : list2) { 17 System.out.println(student); 18 } 19 ois.close(); 20 }
Properties(Map体系的集合类)
Properties中有跟IO相关的方法
Properties只存字符串
Properties增删改查及遍历
1 public static void main(String[] args) { 2 Properties prop = new Properties(); 3 //增 4 prop.put("张三","18"); 5 prop.put("李四","19"); 6 prop.put("王五","23"); 7 System.out.println(prop); 8 //删 9 prop.remove("张三"); 10 System.out.println(prop); 11 //改-put --- 如果键不存在,那么就添加,如果键存在,那么就覆盖. 12 prop.put("张三","27"); 13 System.out.println(prop); 14 //查 15 Object value1 = prop.get("王五"); 16 System.out.println(value1); 17 18 //遍历1 19 Set<Object> keys = prop.keySet(); 20 for (Object key : keys) { 21 Object value = prop.get(key); 22 System.out.println(key + "=" + value); 23 } 24 //遍历2-装的是所有的键值对对象. 25 Set<Map.Entry<Object, Object>> entries = prop.entrySet(); 26 for (Map.Entry<Object, Object> entry : entries) { 27 Object key = entry.getKey(); 28 Object value = entry.getValue(); 29 System.out.println(key + "=" + value); 30 } 31 }
Properties作为集合的特有方法
Object setProperty(String key, String value) 设置集合的键和值,都是String类型,底层调用 Hashtable方法 put
String getProperty(String key) 使用此属性列表中指定的键搜索属性
Set<String> stringPropertyNames() 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串
1 public static void main(String[] args) { 2 //Object setProperty(String key, String value) 设置集合的键和值,都是String类型,底层调用 Hashtable方法 put --- put 3 Properties prop = new Properties(); 4 prop.setProperty("江苏","南京"); 5 prop.setProperty("山东","济南"); 6 System.out.println(prop); //{山东=济南, 江苏=南京} 7 8 //String getProperty(String key) 使用此属性列表中指定的键搜索属性 --- get 9 String value = prop.getProperty("江苏"); 10 System.out.println(value); 11 12 //Set<String> stringPropertyNames() 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 --- keySet 13 Set<String> keys = prop.stringPropertyNames(); 14 for (String key : keys) { 15 String value = prop.getProperty(key); 16 System.out.println(key + "=" + value); 17 } 18 }
Properties和IO流结合的方法
void load(InputStream inStream) 从输入字节流读取属性列表(键和元素对)
void load(Reader reader) 从输入字符流读取属性列表(键和元素对)
1 public static void main(String[] args) throws IOException { 2 //读取 3 Properties prop = new Properties(); 4 FileReader fr = new FileReader("prop.properties"); 5 //调用完了load方法之后,文件中的键值对数据已经在集合中了. 6 prop.load(fr); 7 fr.close(); 8 System.out.println(prop); 9 }
void store(OutputStream out, String comments) 将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法的格式写入输出字节流
void store(Writer writer, String comments) 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流
String comments:注释,内容会打印在文件的第一行
1 public static void main(String[] args) throws IOException { 2 Properties prop = new Properties(); 3 prop.put("zhangsan","18"); 4 prop.put("lisi","23"); 5 FileWriter fw = new FileWriter("prop.properties"); 6 prop.store(fw,null); 7 fw.close(); 8 }