JAVA IO流
IO流
IO流的概述
IO流用来处理设备之间的数据传输
流按流向分为:输入流、输出流
数据类型分为:
字节流
字节输入流 读取数据 InputStream
字节输出流 写出数据 OutputStream
字符流
字符输入流 读取数据 Reader
字符输出流 写出数据 Writer
FileWriter与FileReader
FileWriter 向文件中写数据步骤:
1、使用FileWriter流关联文件
2、利用FileWriter的写方法写数据
3、利用FileWriter的刷新方法将数据从内存刷到硬盘中去
4、利用FileWriter的关闭方法将释放占用的系统底层资源
FileWriter写数据
package wdnmd.io; import java.io.FileWriter; import java.io.IOException; /* 输出流写数据的步骤: A:创建输出流对象 B:调用输出流对象的写数据的方法 C:释放资源 */ public class FileWriterDemo { public static void main(String[] args) throws IOException { FileWriter fileWriter = new FileWriter("f:\\a.txt"); fileWriter.write("wdnmd IO"); //数据没有直接写到文件,其实是写到了内存缓冲区 fileWriter.flush(); fileWriter.close(); } }
FileWriter向文本末尾追加
public static void main(String[] args) throws IOException { FileWriter fw = new FileWriter("c.txt",true); //表示追加写入,默认是false for(int x=0; x<10; x++) { fw.write("hello"+x); fw.write("\r\n"); } fw.close(); }
FileReader读数据
package wdnmd.io.demo02; import java.io.FileReader; import java.io.IOException; /* 输入流读文件的步骤: A:创建输入流对象 B:调用输入流对象的读数据方法 C:释放资源 */ public class FileReaderDemo01 { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("f:\\a.txt"); int ch; while((ch=fr.read())!=-1){ //读取数据的返回值是-1的时候,就说明没有数据了 System.out.print(ch); } fr.close(); } }
FileWriter和FileReader完成文件复制(读一次写一次)
package wdnmd.io.demo03; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyFileDemo01 { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("StudentTest.java"); FileWriter fw = new FileWriter("Copy.java"); int ch; while((ch=fr.read())!=-1){ fw.write(ch); } fw.close(); fr.close(); } }
FileWriter和FileReader完成文件复制(字符数组)
package wdnmd.io.demo03; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyFileDemo02 { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("StudentTest.java"); FileWriter fw = new FileWriter("Copy.java"); char[] ch = new char[1024]; int len; while((len = fr.read(ch)) != -1){ fw.write(ch,0,len); //写一个字符数组的一部分数据 } fw.close(); fr.close(); } }
Close()与flush()方法的区别
flush():刷新缓冲区。流对象还可以继续使用。
close():先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
路径
相对路径:相对当前项目而言的,在项目的根目录下(a.txt)
绝对路径:以盘符开始的路径(d:\\a.txt)
BufferedWriter与BufferedReader
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
package wdnmd.io.demo04; import java.io.*; public class BufferedWriterDemo01 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("StudentTest.java")); int ch; char[] chs = new char[1024]; while((ch = br.read(chs))!=-1){ System.out.print((char)ch); } } }
缓冲流特有方法
BufferedWriter: newLine():写一个换行符,这个换行符由系统决定
BufferedReader: readLine():一次读取一行数据,但是不读取换行符
IO流复制文件的5中方式
A:利用基本流一次读写一个字符
B:利用基本流一次读写一个字符数组
C:利用缓冲流一次读写一个字符
D:利用缓冲流一次读写一个字符数组
E:利用缓冲流的特有方法一次读写一个字符串
1 package wdnmd.io; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.FileReader; 6 import java.io.FileWriter; 7 import java.io.IOException; 8 9 /* 10 * 复制文本文件(5种方式) 11 * 12 * 数据源: 13 * FileWriterDemo.java 14 * 目的地: 15 * Copy.java 16 */ 17 public class CopyFileTest { 18 public static void main(String[] args) throws IOException { 19 /* 20 method1("FileWriterDemo.java","Copy.java"); 21 method2("FileWriterDemo.java","Copy.java"); 22 method3("FileWriterDemo.java","Copy.java"); 23 method4("FileWriterDemo.java","Copy.java"); 24 method5("FileWriterDemo.java","Copy.java"); 25 */ 26 27 String srcFileName = "FileWriterDemo.java"; 28 String destFileName = "Copy.java"; 29 30 // method1(srcFileName,destFileName); 31 // method2(srcFileName,destFileName); 32 method3(srcFileName,destFileName); 33 // method4(srcFileName,destFileName); 34 // method5(srcFileName,destFileName); 35 } 36 37 //缓冲流一次读写一个字符串 38 public static void method5(String srcFileName,String destFileName) throws IOException { 39 //创建输入缓冲流对象 40 BufferedReader br = new BufferedReader(new FileReader(srcFileName)); 41 //创建输出缓冲流对象 42 BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName)); 43 44 //一次读写一个字符串 45 String line; 46 while((line=br.readLine())!=null){ 47 bw.write(line); 48 bw.newLine(); 49 bw.flush(); 50 } 51 52 //释放资源 53 bw.close(); 54 br.close(); 55 } 56 57 //缓冲流一次读写一个字符数组 58 public static void method4(String srcFileName,String destFileName) throws IOException { 59 //创建输入缓冲流对象 60 BufferedReader br = new BufferedReader(new FileReader(srcFileName)); 61 //创建输出缓冲流对象 62 BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName)); 63 64 //一次读写一个字符数组 65 char[] chs = new char[1024]; 66 int len; 67 while((len=br.read(chs))!=-1) { 68 bw.write(chs,0,len); 69 } 70 71 //释放资源 72 bw.close(); 73 br.close(); 74 } 75 76 //缓冲流一次读写一个字符 77 public static void method3(String srcFileName,String destFileName) throws IOException { 78 //创建输入缓冲流对象 79 BufferedReader br = new BufferedReader(new FileReader(srcFileName)); 80 //创建输出缓冲流对象 81 BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName)); 82 83 //一次读写一个字符 84 int ch; 85 while((ch=br.read())!=-1) { 86 bw.write(ch); 87 } 88 89 //释放资源 90 bw.close(); 91 br.close(); 92 } 93 94 //基本流一次读写一个字符数组 95 public static void method2(String srcFileName,String destFileName) throws IOException { 96 //创建输入流对象 97 FileReader fr = new FileReader(srcFileName); 98 //创建输出流对象 99 FileWriter fw = new FileWriter(destFileName); 100 101 //一次读写一个字符数组 102 char[] chs = new char[1024]; 103 int len; 104 while((len=fr.read(chs))!=-1) { 105 fw.write(chs,0,len); 106 } 107 108 //释放资源 109 fw.close(); 110 fr.close(); 111 } 112 113 //基本流一次读写一个字符 114 public static void method1(String srcFileName,String destFileName) throws IOException { 115 //创建输入流对象 116 FileReader fr = new FileReader(srcFileName); 117 //创建输出流对象 118 FileWriter fw = new FileWriter(destFileName); 119 120 //一次读写一个字符 121 int ch; 122 while((ch=fr.read())!=-1) { 123 fw.write(ch); 124 } 125 126 //释放资源 127 fw.close(); 128 fr.close(); 129 } 130 }
FileInputStream
public static void main(String[] args) throws IOException { //创建字节输入流对象 FileInputStream fis = new FileInputStream("IODemo.java"); //创建字节输出流对象 FileOutputStream fos = new FileOutputStream("d:\\a\\a.java"); //一次读写一个字节 /*int by; while((by = fis.read()) != -1) { fos.write(by); }*/ //一次读写一个字节数组 int len;//存储读到的字节个数 byte[] bys = new byte[1024]; while((len = fis.read(bys)) != -1) { fos.write(bys,0,len); } //释放资源 fos.close(); fis.close(); }
字节流与字符流
字节流可以操作所有类型的文件,因为所有的文件在计算机中都是以字节形式存储
而字符流只能用来操作纯文本类型的文件,不能操作字节类型的文件
二进制文件只能使用字节流进行复制(使用windows自带记事本打开读不懂的)
文本文件的复制即可使用字符流,也可以使用字节流
标准输入输出流
标准输入输出流: public static final InputStream in:字节输入流,用来读取键盘录入的数据 public static final int x; InputStream is = System.in; Scanner sc = new Scanner(System.in); public static final PrintStream out:字节输出流,将数据输出到命令行 System.out.println();
转换流
由于标准输出流是一个字节输出流,所以只能输出字节或者字节数组,但是我们读取到的数据则是字符串,如果想进行输出还需要转换成字节数组
我们要想通过标准输出流输出字符串,把标准输出流转换成一种字符输出流即可,OutputStreamWriter
OutputStreamWriter(OutputStream out) :转换流,把字节输出流转换成字符输出流
public static void main(String[] args) throws IOException { //method2(); //创建输入流对象 BufferedReader br = new BufferedReader(new FileReader("SystemInOutDemo.java")); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //进行数据的读写 String line;//用于存储读取到的数据 while((line = br.readLine()) != null) { bw.write(line); bw.newLine(); } //释放资源 bw.close(); br.close(); }
InputStreamReader:将字节输入流转换为字符输入流
public static void main(String[] args) throws IOException { //创建输入流对象 InputStream is = System.in; Reader r = new InputStreamReader(is); //创建输出流对象 FileWriter fw = new FileWriter("a.txt"); //读写数据 char[] chs = new char[1024]; int len; while((len = r.read(chs)) != -1) { fw.write(chs,0,len); fw.flush(); } //释放资源 fw.close(); is.close(); }
打印流
打印流
添加输出数据的功能,使它们能够方便地打印各种数据值表示形式.
字符打印流 PrintWriter
void print(String str): 输出任意类型的数据,
void println(String str): 输出任意类型的数据,自动写入换行操作
public static void main(String[] args) throws IOException { //创建打印流对象 PrintWriter pw = new PrintWriter("b.txt"); //写出数据 pw.write("hello"); pw.write("world"); pw.write("java"); //释放资源 pw.close(); }
对象操作流
用于从流中读取对象的
ObjectInputStream 称为 反序列化流,利用输入流从文件中读取对象
ObjectOutputStream 称为 序列化流,利用输出流向文件中写入对象
特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。
注意:使用对象输出流写出对象,只能使用对象输入流来读取对象
只能将支持 java.io.Serializable 接口的对象写入流中
利用序列化流读写对象
class Student implements Serializable
public static void main(String[] args) throws IOException, ClassNotFoundException {//创建对象输入流的对象 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt")); try { while(true) { Object obj = ois.readObject(); System.out.println(obj); } } catch(EOFException e) { System.out.println("读到了文件的末尾"); } //释放资源 ois.close(); }
Properties集合
Properties
类表示了一个持久的属性集。Properties
可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
特点:
1、Hashtable的子类,map集合中的方法都可以用。
2、该集合没有泛型。键值都是字符串。
3、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。
4、有和流技术相结合的方法。
利用properties存储键值对
public static void main(String[] args) { //创建属性列表对象 Properties prop = new Properties(); //添加映射关系 prop.put("CZBK001", "zhangsan"); prop.put("CZBK002", "lisi"); prop.put("CZBK003", "wangwu"); //遍历属性列表 //获取所有的key,通过key获取value Set<Object> keys = prop.keySet(); for (Object key : keys) { Object value = prop.get(key); System.out.println(key + "=" + value); } System.out.println("------------------"); //获取所有的结婚证对象 Set<Map.Entry<Object,Object>> entrys = prop.entrySet(); for (Map.Entry<Object, Object> entry : entrys) { Object key = entry.getKey(); Object value = entry.getValue(); System.out.println(key + "=" + value); } }
properties与流结合
public static void main(String[] args) throws IOException{ //创建属性列表对象 Properties prop = new Properties(); //添加映射关系 prop.setProperty("CZBK001", "zhangsan"); prop.setProperty("CZBK002", "lisi"); prop.setProperty("CZBK003", "wangwu"); //创建输出流对象 FileWriter fw = new FileWriter("e.txt"); //void store(Writer writer, String comments) prop.store(fw, "hello world"); //释放资源 fw.close(); }