- 1.概念
- IO流用来处理设备之间的数据传输
- Java对数据的操作是通过流的方式
- Java用于操作流的类都在IO包中
- 流按流向分为两种:输入流,输出流。
- 流按操作类型分为两种:
- 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
- 字符流 : 字符流只能操作纯字符数据,比较方便。
对于文件内容的操作主要分为两大类,其中,字符流有两个抽象类:Writer Reader.
其对应子类FileWriter和FileReader可实现文件的读写操作
BufferedWriter和BufferedReader能够提供缓冲区功能,用以提高效率
同样,字节流也有两个抽象类:InputStream OutputStream
其对应子类有FileInputStream和FileOutputStream实现文件读写
BufferedInputStream和BufferedOutputStream提供缓冲区功能
字符流
-
字符流的写入
1 import java.io.File; 2 import java.io.FileWriter; 3 import java.io.IOException; 4 5 public class Demo { 6 public static void main(String[] args ) { 7 8 //创建要操作的文件路径和名称 9 //其中,File.separator表示系统相关的分隔符,Linux下为:/ Windows下为:\\10 String path = File.separator + "home" + File.separator + "siu" +11 File.separator + "work" + File.separator + "demo.txt";12 13 //由于IO操作会抛出异常,因此在try语句块的外部定义FileWriter的引用14 FileWriter w = null;15 try {16 //以path为路径创建一个新的FileWriter对象17 //如果需要追加数据,而不是覆盖,则使用FileWriter(path,true)构造方法18 w = new FileWriter(path);19 20 //将字符串写入到流中,\r\n表示换行想有好的21 w.write("Nerxious is a good boy\r\n");22 //如果想马上看到写入效果,则需要调用w.flush()方法23 w.flush();24 } catch (IOException e) {25 e.printStackTrace();26 } finally {27 //如果前面发生异常,那么是无法产生w对象的28 //因此要做出判断,以免发生空指针异常29 if(w != null) {30 try {31 //关闭流资源,需要再次捕捉异常32 w.close();33 } catch (IOException e) {34 e.printStackTrace();35 }36 }37 }38 }39 }
-
利用字符流的缓冲区来进行文本文件的复制
1 import java.io.BufferedReader; 2 import java.io.BufferedWriter; 3 import java.io.File; 4 import java.io.FileReader; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 8 public class Demo { 9 public static void main(String[] args ) {10 11 String doc = File.separator + "home" + File.separator + "siu" +12 File.separator + "work" + File.separator + "demo.txt";13 14 String copy = File.separator + "home" + File.separator + "siu" +15 File.separator + "life" + File.separator + "lrc.txt";16 17 FileReader r = null;18 FileWriter w = null;19 //创建缓冲区的引用20 BufferedReader br = null;21 BufferedWriter bw = null;22 try {23 r = new FileReader(doc);24 w = new FileWriter(copy);25 //创建缓冲区对象26 //将需要提高效率的FileReader和FileWriter对象放入其构造函数内27 //当然,也可以使用匿名对象的方式 br = new BufferedReader(new FileReader(doc));28 br = new BufferedReader(r);29 bw = new BufferedWriter(w);30 31 String line = null;32 //读取行,直到返回null33 //readLine()方法只返回换行符之前的数据34 while((line = br.readLine()) != null) {35 //使用BufferWriter对象的写入方法36 bw.write(line);37 //写完文件内容之后换行38 //newLine()方法依据平台而定39 //windows下的换行是\r\n40 //Linux下则是\n41 bw.newLine();42 } 43 44 } catch (IOException e) {45 e.printStackTrace();46 } finally {47 //此处不再需要捕捉FileReader和FileWriter对象的异常48 //关闭缓冲区就是关闭缓冲区中的流对象49 if(br != null) {50 try {51 r.close();52 } catch (IOException e) {53 e.printStackTrace();54 }55 }56 if(bw != null) {57 try {58 bw.close();59 } catch (IOException e) {60 e.printStackTrace();61 }62 }63 }64 }65 }
-
二进制文件的复制
-
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileOutputStream; 4 import java.io.IOException; 5 6 public class Demo { 7 public static void main(String[] args ) { 8 9 String bin = File.separator + "home" + File.separator + "siu" +10 File.separator + "work" + File.separator + "一个人生活.mp3";11 12 String copy = File.separator + "home" + File.separator + "siu" +13 File.separator + "life" + File.separator + "一个人生活.mp3";14 15 FileInputStream i = null;16 FileOutputStream o = null;17 18 try {19 i = new FileInputStream(bin);20 o = new FileOutputStream(copy);21 22 //循环的方式读入写出文件,从而完成复制23 byte[] buf = new byte[1024];24 int temp = 0;25 while((temp = i.read(buf)) != -1) {26 o.write(buf, 0, temp);27 }28 29 } catch (IOException e) {30 e.printStackTrace();31 } finally {32 if(i != null) {33 try {34 i.close();35 } catch (IOException e) {36 e.printStackTrace();37 }38 }39 if(o != null) {40 try {41 o.close();42 } catch (IOException e) {43 e.printStackTrace();44 }45 }46 }47 }48 }
-
对象流的操作:
-
1 public class ObjectInputStream { 2 3 /** 4 * @param args 5 * @throws IOException 6 * @throws ClassNotFoundException 7 * @throws FileNotFoundException 8 * 读取对象,反序列化 9 */10 public static void main(String[] args) throws IOException, ClassNotFoundException {11 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e.txt"));12 Person p1 = (Person) ois.readObject();13 Person p2 = (Person) ois.readObject();14 System.out.println(p1);15 System.out.println(p2);16 ois.close();17 }18 19 }
-