• Java笔记(21):IO流(03)


    1、String类中的编码和解码问题

     1 package cn.itcast_01;
     2 
     3 import java.io.UnsupportedEncodingException;
     4 import java.util.Arrays;
     5 
     6 /*
     7  * String(byte[] bytes, String charsetName):通过指定的字符集解码字节数组
     8  * byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组
     9  * 
    10  * 编码:把看得懂的变成看不懂的
    11  * String -- byte[]
    12  * 
    13  * 解码:把看不懂的变成看得懂的
    14  * byte[] -- String
    15  * 
    16  * 举例:谍战片(发电报,接电报)
    17  * 
    18  * 码表:小本子
    19  *         字符    数值
    20  * 
    21  * 要发送一段文字:
    22  *         今天晚上在老地方见
    23  * 
    24  *         发送端:今 -- 数值 -- 二进制 -- 发出去
    25  *         接收端:接收 -- 二进制 -- 十进制 -- 数值 -- 字符 -- 今
    26  * 
    27  *         今天晚上在老地方见
    28  * 
    29  * 编码问题简单,只要编码解码的格式是一致的。
    30  */
    31 public class StringDemo {
    32     public static void main(String[] args) throws UnsupportedEncodingException {
    33         String s = "你好";
    34 
    35         // String -- byte[]
    36         byte[] bys = s.getBytes(); // [-60, -29, -70, -61]
    37         // byte[] bys = s.getBytes("GBK");// [-60, -29, -70, -61]
    38         // byte[] bys = s.getBytes("UTF-8");// [-28, -67, -96, -27, -91, -67]
    39         System.out.println(Arrays.toString(bys));
    40 
    41         // byte[] -- String
    42         String ss = new String(bys); // 你好
    43         // String ss = new String(bys, "GBK"); // 你好
    44         // String ss = new String(bys, "UTF-8"); // ???
    45         System.out.println(ss);
    46     }
    47 }

    2、转换流OutputStreamWriter的使用

     1 package cn.itcast_02;
     2 
     3 import java.io.FileOutputStream;
     4 import java.io.IOException;
     5 import java.io.OutputStreamWriter;
     6 
     7 /*
     8  * OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流
     9  * OutputStreamWriter(OutputStream out,String charsetName):根据指定编码把字节流数据转换为字符流
    10  * 把字节流转换为字符流。
    11  * 字符流 = 字节流 +编码表。
    12  */
    13 public class OutputStreamWriterDemo {
    14     public static void main(String[] args) throws IOException {
    15         // 创建对象
    16         // OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
    17         // "osw.txt")); // 默认GBK
    18         // OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
    19         // "osw.txt"), "GBK"); // 指定GBK
    20         OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
    21                 "osw.txt"), "UTF-8"); // 指定UTF-8
    22         // 写数据
    23         osw.write("中国");
    24 
    25         // 释放资源
    26         osw.close();
    27     }
    28 }

    3、转换流InputStreamReader的使用

     1 package cn.itcast_02;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.IOException;
     5 import java.io.InputStreamReader;
     6 
     7 /*
     8  * InputStreamReader(InputStream is):用默认的编码读取数据
     9  * InputStreamReader(InputStream is,String charsetName):用指定的编码读取数据
    10  */
    11 public class InputStreamReaderDemo {
    12     public static void main(String[] args) throws IOException {
    13         // 创建对象
    14         // InputStreamReader isr = new InputStreamReader(new FileInputStream(
    15         // "osw.txt"));
    16 
    17         // InputStreamReader isr = new InputStreamReader(new FileInputStream(
    18         // "osw.txt"), "GBK");
    19 
    20         InputStreamReader isr = new InputStreamReader(new FileInputStream(
    21                 "osw.txt"), "UTF-8");
    22 
    23         // 读取数据
    24         // 一次读取一个字符
    25         int ch = 0;
    26         while ((ch = isr.read()) != -1) {
    27             System.out.print((char) ch);
    28         }
    29 
    30         // 释放资源
    31         isr.close();
    32     }
    33 }

    4、字符流的5种写数据的方式

     1 package cn.itcast_03;
     2 
     3 import java.io.FileOutputStream;
     4 import java.io.IOException;
     5 import java.io.OutputStreamWriter;
     6 
     7 /*
     8  * OutputStreamWriter的方法:
     9  * public void write(int c):写一个字符
    10  * public void write(char[] cbuf):写一个字符数组
    11  * public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
    12  * public void write(String str):写一个字符串
    13  * public void write(String str,int off,int len):写一个字符串的一部分
    14  * 
    15  * 面试题:close()和flush()的区别?
    16  * A:close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
    17  * B:flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。
    18  */
    19 public class OutputStreamWriterDemo {
    20     public static void main(String[] args) throws IOException {
    21         // 创建对象
    22         OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
    23                 "osw2.txt"));
    24 
    25         // 写数据
    26         // public void write(int c):写一个字符
    27         // osw.write('a');
    28         // osw.write(97);
    29         // 为什么数据没有进去呢?
    30         // 原因是:字符 = 2字节
    31         // 文件中数据存储的基本单位是字节。
    32         // void flush()
    33 
    34         // public void write(char[] cbuf):写一个字符数组
    35         // char[] chs = {'a','b','c','d','e'};
    36         // osw.write(chs);
    37 
    38         // public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
    39         // osw.write(chs,1,3);
    40 
    41         // public void write(String str):写一个字符串
    42         // osw.write("我爱烨儿");
    43 
    44         // public void write(String str,int off,int len):写一个字符串的一部分
    45         osw.write("我爱烨儿", 2, 2);
    46 
    47         // 刷新缓冲区
    48         osw.flush();
    49         // osw.write("我爱烨儿", 2, 3);
    50 
    51         // 释放资源
    52         osw.close();
    53         // java.io.IOException: Stream closed
    54         // osw.write("我爱烨儿", 2, 3);
    55     }
    56 }

    6、字符流的2种读数据的方式

     1 package cn.itcast_03;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.IOException;
     5 import java.io.InputStreamReader;
     6 
     7 /*
     8  * InputStreamReader的方法:
     9  * int read():一次读取一个字符
    10  * int read(char[] chs):一次读取一个字符数组
    11  */
    12 public class InputStreamReaderDemo {
    13     public static void main(String[] args) throws IOException {
    14         // 创建对象
    15         InputStreamReader isr = new InputStreamReader(new FileInputStream(
    16                 "StringDemo.java"));
    17 
    18         // 一次读取一个字符
    19         // int ch = 0;
    20         // while ((ch = isr.read()) != -1) {
    21         // System.out.print((char) ch);
    22         // }
    23 
    24         // 一次读取一个字符数组
    25         char[] chs = new char[1024];
    26         int len = 0;
    27         while ((len = isr.read(chs)) != -1) {
    28             System.out.print(new String(chs, 0, len));
    29         }
    30 
    31         // 释放资源
    32         isr.close();
    33     }
    34 }

    练习:字符流复制文本文件案例1

     1 package cn.itcast_04;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.FileOutputStream;
     5 import java.io.IOException;
     6 import java.io.InputStreamReader;
     7 import java.io.OutputStreamWriter;
     8 
     9 /*
    10  * 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
    11  * 
    12  * 数据源:
    13  *         a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader
    14  * 目的地:
    15  *         b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter
    16  */
    17 public class CopyFileDemo {
    18     public static void main(String[] args) throws IOException {
    19         // 封装数据源
    20         InputStreamReader isr = new InputStreamReader(new FileInputStream(
    21                 "a.txt"));
    22         // 封装目的地
    23         OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
    24                 "b.txt"));
    25 
    26         // 读写数据
    27         // 方式1
    28         // int ch = 0;
    29         // while ((ch = isr.read()) != -1) {
    30         // osw.write(ch);
    31         // }
    32 
    33         // 方式2
    34         char[] chs = new char[1024];
    35         int len = 0;
    36         while ((len = isr.read(chs)) != -1) {
    37             osw.write(chs, 0, len);
    38             // osw.flush();
    39         }
    40 
    41         // 释放资源
    42         osw.close();
    43         isr.close();
    44     }
    45 }

    练习:字符流复制文本文件案例2

     1 package cn.itcast_04;
     2 
     3 import java.io.FileReader;
     4 import java.io.FileWriter;
     5 import java.io.IOException;
     6 
     7 /*
     8  * 由于我们常见的操作都是使用本地默认编码,所以,不用指定编码。
     9  * 而转换流的名称有点长,所以,Java就提供了其子类供我们使用。
    10  * OutputStreamWriter = FileOutputStream + 编码表(GBK)
    11  * FileWriter = FileOutputStream + 编码表(GBK)
    12  * 
    13  * InputStreamReader = FileInputStream + 编码表(GBK)
    14  * FileReader = FileInputStream + 编码表(GBK)
    15  * 
    16  /*
    17  * 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
    18  * 
    19  * 数据源:
    20  *         a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader
    21  * 目的地:
    22  *         b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter
    23  */
    24 public class CopyFileDemo2 {
    25     public static void main(String[] args) throws IOException {
    26         // 封装数据源
    27         FileReader fr = new FileReader("a.txt");
    28         // 封装目的地
    29         FileWriter fw = new FileWriter("b.txt");
    30 
    31         // 一次一个字符
    32         // int ch = 0;
    33         // while ((ch = fr.read()) != -1) {
    34         // fw.write(ch);
    35         // }
    36 
    37         // 一次一个字符数组
    38         char[] chs = new char[1024];
    39         int len = 0;
    40         while ((len = fr.read(chs)) != -1) {
    41             fw.write(chs, 0, len);
    42             fw.flush();
    43         }
    44 
    45         // 释放资源
    46         fw.close();
    47         fr.close();
    48     }
    49 }

    练习:字符流复制文本文件案例3

     1 package cn.itcast_04;
     2 
     3 import java.io.FileReader;
     4 import java.io.FileWriter;
     5 import java.io.IOException;
     6 
     7 /*
     8  * 需求:把c:\a.txt内容复制到d:\b.txt中
     9  * 
    10  * 数据源:
    11  *         c:\a.txt -- FileReader
    12  * 目的地:
    13  *         d:\b.txt -- FileWriter
    14  */
    15 public class CopyFileDemo3 {
    16     public static void main(String[] args) throws IOException {
    17         // 封装数据源
    18         FileReader fr = new FileReader("c:\a.txt");
    19         // 封装目的地
    20         FileWriter fw = new FileWriter("d:\b.txt");
    21 
    22         // 读写数据
    23         // int ch = 0;
    24         int ch;
    25         while ((ch = fr.read()) != -1) {
    26             fw.write(ch);
    27         }
    28         
    29         //释放资源
    30         fw.close();
    31         fr.close();
    32     }
    33 }

    7、字符缓冲输出流BufferedWriter的使用

     1 package cn.itcast_05;
     2 
     3 import java.io.BufferedWriter;
     4 import java.io.FileWriter;
     5 import java.io.IOException;
     6 
     7 /*
     8  * 字符流为了高效读写,也提供了对应的字符缓冲流。
     9  * BufferedWriter:字符缓冲输出流
    10  * BufferedReader:字符缓冲输入流
    11  * 
    12  * BufferedWriter:字符缓冲输出流
    13  * 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 
    14  * 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。 
    15  */
    16 public class BufferedWriterDemo {
    17     public static void main(String[] args) throws IOException {
    18         // BufferedWriter(Writer out)
    19         // BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
    20         // new FileOutputStream("bw.txt")));
    21 
    22         BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
    23 
    24         bw.write("hello");
    25         bw.write("world");
    26         bw.write("java");
    27         bw.flush();
    28 
    29         bw.close();
    30     }
    31 }

    8、字符缓冲输入流BufferedReader的使用

     1 package cn.itcast_05;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.FileReader;
     5 import java.io.IOException;
     6 
     7 /*
     8  * BufferedReader
     9  * 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 
    10  * 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。 
    11  * 
    12  * BufferedReader(Reader in)
    13  */
    14 public class BufferedReaderDemo {
    15     public static void main(String[] args) throws IOException {
    16         // 创建字符缓冲输入流对象
    17         BufferedReader br = new BufferedReader(new FileReader("bw.txt"));
    18 
    19         // 方式1
    20         // int ch = 0;
    21         // while ((ch = br.read()) != -1) {
    22         // System.out.print((char) ch);
    23         // }
    24 
    25         // 方式2
    26         char[] chs = new char[1024];
    27         int len = 0;
    28         while ((len = br.read(chs)) != -1) {
    29             System.out.print(new String(chs, 0, len));
    30         }
    31 
    32         // 释放资源
    33         br.close();
    34     }
    35 }

    练习:字符缓冲流复制文本文件案例1

     1 package cn.itcast_06;
     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  * 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
    11  * 
    12  * 数据源:
    13  *         a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader -- BufferedReader
    14  * 目的地:
    15  *         b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter -- BufferedWriter
    16  */
    17 public class CopyFileDemo {
    18     public static void main(String[] args) throws IOException {
    19         // 封装数据源
    20         BufferedReader br = new BufferedReader(new FileReader("a.txt"));
    21         // 封装目的地
    22         BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
    23 
    24         // 两种方式其中的一种一次读写一个字符数组
    25         char[] chs = new char[1024];
    26         int len = 0;
    27         while ((len = br.read(chs)) != -1) {
    28             bw.write(chs, 0, len);
    29             bw.flush();
    30         }
    31 
    32         // 释放资源字符缓冲流的特殊功能
    33         bw.close();
    34         br.close();
    35     }
    36 }

    9、字符缓冲流的特殊功能

     1 package cn.itcast_05;
     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  * 字符缓冲流的特殊方法:
    11  * BufferedWriter:
    12  *         public void newLine():根据系统来决定换行符
    13  * BufferedReader:
    14  *         public String readLine():一次读取一行数据
    15  *         包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
    16  */
    17 public class BufferedDemo {
    18     public static void main(String[] args) throws IOException {
    19         // write();
    20         read();
    21     }
    22 
    23     private static void read() throws IOException {
    24         // 创建字符缓冲输入流对象
    25         BufferedReader br = new BufferedReader(new FileReader("bw2.txt"));
    26 
    27         // public String readLine():一次读取一行数据
    28         // String line = br.readLine();
    29         // System.out.println(line);
    30         // line = br.readLine();
    31         // System.out.println(line);
    32 
    33         // 最终版代码
    34         String line = null;
    35         while ((line = br.readLine()) != null) {
    36             System.out.println(line);
    37         }
    38         
    39         //释放资源
    40         br.close();
    41     }
    42 
    43     private static void write() throws IOException {
    44         // 创建字符缓冲输出流对象
    45         BufferedWriter bw = new BufferedWriter(new FileWriter("bw2.txt"));
    46         for (int x = 0; x < 10; x++) {
    47             bw.write("hello" + x);
    48             // bw.write("
    ");
    49             bw.newLine();
    50             bw.flush();
    51         }
    52         bw.close();
    53     }
    54 
    55 }

    练习:字符缓冲流复制文本文件案例2

     1 package cn.itcast_06;
     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  * 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
    11  * 
    12  * 数据源:
    13  *         a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader -- BufferedReader
    14  * 目的地:
    15  *         b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter -- BufferedWriter
    16  */
    17 public class CopyFileDemo2 {
    18     public static void main(String[] args) throws IOException {
    19         // 封装数据源
    20         BufferedReader br = new BufferedReader(new FileReader("a.txt"));
    21         // 封装目的地
    22         BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
    23 
    24         // 读写数据
    25         String line = null;
    26         while ((line = br.readLine()) != null) {
    27             bw.write(line);
    28             bw.newLine();
    29             bw.flush();
    30         }
    31 
    32         // 释放资源
    33         bw.close();
    34         br.close();
    35     }
    36 }

    IO流图解:

     练习:复制文本文件的5种方式案例

      1 package cn.itcast_01;
      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  * 复制文本文件
     11  * 
     12  * 分析:
     13  *         复制数据,如果我们知道用记事本打开并能够读懂,就用字符流,否则用字节流。
     14  *         通过该原理,我们知道我们应该采用字符流更方便一些。
     15  *         而字符流有5种方式,所以做这个题目我们有5种方式。推荐掌握第5种。
     16  * 数据源:
     17  *         c:\a.txt -- FileReader -- BufferdReader
     18  * 目的地:
     19  *         d:\b.txt -- FileWriter -- BufferedWriter
     20  */
     21 public class CopyFileDemo {
     22     public static void main(String[] args) throws IOException {
     23         String srcString = "c:\a.txt";
     24         String destString = "d:\b.txt";
     25         // method1(srcString, destString);
     26         // method2(srcString, destString);
     27         // method3(srcString, destString);
     28         // method4(srcString, destString);
     29         method5(srcString, destString);
     30     }
     31 
     32     // 字符缓冲流一次读写一个字符串
     33     private static void method5(String srcString, String destString)
     34             throws IOException {
     35         BufferedReader br = new BufferedReader(new FileReader(srcString));
     36         BufferedWriter bw = new BufferedWriter(new FileWriter(destString));
     37 
     38         String line = null;
     39         while ((line = br.readLine()) != null) {
     40             bw.write(line);
     41             bw.newLine();
     42             bw.flush();
     43         }
     44 
     45         bw.close();
     46         br.close();
     47     }
     48 
     49     // 字符缓冲流一次读写一个字符数组
     50     private static void method4(String srcString, String destString)
     51             throws IOException {
     52         BufferedReader br = new BufferedReader(new FileReader(srcString));
     53         BufferedWriter bw = new BufferedWriter(new FileWriter(destString));
     54 
     55         char[] chs = new char[1024];
     56         int len = 0;
     57         while ((len = br.read(chs)) != -1) {
     58             bw.write(chs, 0, len);
     59         }
     60 
     61         bw.close();
     62         br.close();
     63     }
     64 
     65     // 字符缓冲流一次读写一个字符
     66     private static void method3(String srcString, String destString)
     67             throws IOException {
     68         BufferedReader br = new BufferedReader(new FileReader(srcString));
     69         BufferedWriter bw = new BufferedWriter(new FileWriter(destString));
     70 
     71         int ch = 0;
     72         while ((ch = br.read()) != -1) {
     73             bw.write(ch);
     74         }
     75 
     76         bw.close();
     77         br.close();
     78     }
     79 
     80     // 基本字符流一次读写一个字符数组
     81     private static void method2(String srcString, String destString)
     82             throws IOException {
     83         FileReader fr = new FileReader(srcString);
     84         FileWriter fw = new FileWriter(destString);
     85 
     86         char[] chs = new char[1024];
     87         int len = 0;
     88         while ((len = fr.read(chs)) != -1) {
     89             fw.write(chs, 0, len);
     90         }
     91 
     92         fw.close();
     93         fr.close();
     94     }
     95 
     96     // 基本字符流一次读写一个字符
     97     private static void method1(String srcString, String destString)
     98             throws IOException {
     99         FileReader fr = new FileReader(srcString);
    100         FileWriter fw = new FileWriter(destString);
    101 
    102         int ch = 0;
    103         while ((ch = fr.read()) != -1) {
    104             fw.write(ch);
    105         }
    106 
    107         fw.close();
    108         fr.close();
    109     }
    110 }

    练习:复制图片的4种方式案例

     1 package cn.itcast_01;
     2 
     3 import java.io.BufferedInputStream;
     4 import java.io.BufferedOutputStream;
     5 import java.io.File;
     6 import java.io.FileInputStream;
     7 import java.io.FileOutputStream;
     8 import java.io.IOException;
     9 
    10 /*
    11  * 复制图片
    12  * 
    13  * 分析:
    14  *         复制数据,如果我们知道用记事本打开并能够读懂,就用字符流,否则用字节流。
    15  *         通过该原理,我们知道我们应该采用字节流。
    16  *         而字节流有4种方式,所以做这个题目我们有4种方式。推荐掌握第4种。
    17  * 
    18  * 数据源:
    19  *         c:\a.jpg -- FileInputStream -- BufferedInputStream
    20  * 目的地:
    21  *         d:\b.jpg -- FileOutputStream -- BufferedOutputStream
    22  */
    23 public class CopyImageDemo {
    24     public static void main(String[] args) throws IOException {
    25         // 使用字符串作为路径
    26         // String srcString = "c:\a.jpg";
    27         // String destString = "d:\b.jpg";
    28         // 使用File对象做为参数
    29         File srcFile = new File("c:\a.jpg");
    30         File destFile = new File("d:\b.jpg");
    31 
    32         // method1(srcFile, destFile);
    33         // method2(srcFile, destFile);
    34         // method3(srcFile, destFile);
    35         method4(srcFile, destFile);
    36     }
    37 
    38     // 字节缓冲流一次读写一个字节数组
    39     private static void method4(File srcFile, File destFile) throws IOException {
    40         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
    41                 srcFile));
    42         BufferedOutputStream bos = new BufferedOutputStream(
    43                 new FileOutputStream(destFile));
    44 
    45         byte[] bys = new byte[1024];
    46         int len = 0;
    47         while ((len = bis.read(bys)) != -1) {
    48             bos.write(bys, 0, len);
    49         }
    50 
    51         bos.close();
    52         bis.close();
    53     }
    54 
    55     // 字节缓冲流一次读写一个字节
    56     private static void method3(File srcFile, File destFile) throws IOException {
    57         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
    58                 srcFile));
    59         BufferedOutputStream bos = new BufferedOutputStream(
    60                 new FileOutputStream(destFile));
    61 
    62         int by = 0;
    63         while ((by = bis.read()) != -1) {
    64             bos.write(by);
    65         }
    66 
    67         bos.close();
    68         bis.close();
    69     }
    70 
    71     // 基本字节流一次读写一个字节数组
    72     private static void method2(File srcFile, File destFile) throws IOException {
    73         FileInputStream fis = new FileInputStream(srcFile);
    74         FileOutputStream fos = new FileOutputStream(destFile);
    75 
    76         byte[] bys = new byte[1024];
    77         int len = 0;
    78         while ((len = fis.read(bys)) != -1) {
    79             fos.write(bys, 0, len);
    80         }
    81 
    82         fos.close();
    83         fis.close();
    84     }
    85 
    86     // 基本字节流一次读写一个字节
    87     private static void method1(File srcFile, File destFile) throws IOException {
    88         FileInputStream fis = new FileInputStream(srcFile);
    89         FileOutputStream fos = new FileOutputStream(destFile);
    90 
    91         int by = 0;
    92         while ((by = fis.read()) != -1) {
    93             fos.write(by);
    94         }
    95 
    96         fos.close();
    97         fis.close();
    98     }
    99 }

    练习:把集合中的数据存储到文本文件案例

     1 package cn.itcast_02;
     2 
     3 import java.io.BufferedWriter;
     4 import java.io.FileWriter;
     5 import java.io.IOException;
     6 import java.util.ArrayList;
     7 
     8 /*
     9  * 需求:把ArrayList集合中的字符串数据存储到文本文件
    10  * 
    11  * 分析:
    12  *         通过题目的意思我们可以知道如下的一些内容,
    13  *             ArrayList集合里存储的是字符串。
    14  *             遍历ArrayList集合,把数据获取到。
    15  *             然后存储到文本文件中。
    16  *             文本文件说明使用字符流。
    17  * 
    18  * 数据源:
    19  *         ArrayList<String> -- 遍历得到每一个字符串数据
    20  * 目的地:
    21  *         a.txt -- FileWriter -- BufferedWriter
    22  */
    23 public class ArrayListToFileDemo {
    24     public static void main(String[] args) throws IOException {
    25         // 封装数据与(创建集合对象)
    26         ArrayList<String> array = new ArrayList<String>();
    27         array.add("hello");
    28         array.add("world");
    29         array.add("java");
    30 
    31         // 封装目的地
    32         BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
    33 
    34         // 遍历集合
    35         for (String s : array) {
    36             // 写数据
    37             bw.write(s);
    38             bw.newLine();
    39             bw.flush();
    40         }
    41 
    42         // 释放资源
    43         bw.close();
    44     }
    45 }

    练习:把文本文件中的数据存储到集合中案例

     1 package cn.itcast_02;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.FileReader;
     5 import java.io.IOException;
     6 import java.util.ArrayList;
     7 
     8 /*
     9  * 需求:从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合
    10  * 
    11  * 分析:
    12  *         通过题目的意思我们可以知道如下的一些内容,
    13  *             数据源是一个文本文件。
    14  *             目的地是一个集合。
    15  *             而且元素是字符串。
    16  * 
    17  * 数据源:
    18  *         b.txt -- FileReader -- BufferedReader
    19  * 目的地:
    20  *         ArrayList<String>
    21  */
    22 public class FileToArrayListDemo {
    23     public static void main(String[] args) throws IOException {
    24         // 封装数据源
    25         BufferedReader br = new BufferedReader(new FileReader("b.txt"));
    26         // 封装目的地(创建集合对象)
    27         ArrayList<String> array = new ArrayList<String>();
    28 
    29         // 读取数据存储到集合中
    30         String line = null;
    31         while ((line = br.readLine()) != null) {
    32             array.add(line);
    33         }
    34 
    35         // 释放资源
    36         br.close();
    37 
    38         // 遍历集合
    39         for (String s : array) {
    40             System.out.println(s);
    41         }
    42     }
    43 }

    练习:随机获取文本文件中的姓名案例

     1 package cn.itcast_02;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.FileReader;
     5 import java.io.IOException;
     6 import java.util.ArrayList;
     7 import java.util.Random;
     8 
     9 /*
    10  * 需求:我有一个文本文件中存储了几个名称,请大家写一个程序实现随机获取一个人的名字。
    11  * 
    12  * 分析:
    13  *         A:把文本文件中的数据存储到集合中
    14  *         B:随机产生一个索引
    15  *         C:根据该索引获取一个值
    16  */
    17 public class GetName {
    18     public static void main(String[] args) throws IOException {
    19         // 把文本文件中的数据存储到集合中
    20         BufferedReader br = new BufferedReader(new FileReader("b.txt"));
    21         ArrayList<String> array = new ArrayList<String>();
    22         String line = null;
    23         while ((line = br.readLine()) != null) {
    24             array.add(line);
    25         }
    26         br.close();
    27 
    28         // 随机产生一个索引
    29         Random r = new Random();
    30         int index = r.nextInt(array.size());
    31 
    32         // 根据该索引获取一个值
    33         String name = array.get(index);
    34         System.out.println("该幸运者是:" + name);
    35     }
    36 }

    练习:复制单级文件夹案例

     1 package cn.itcast_03;
     2 
     3 import java.io.BufferedInputStream;
     4 import java.io.BufferedOutputStream;
     5 import java.io.File;
     6 import java.io.FileInputStream;
     7 import java.io.FileOutputStream;
     8 import java.io.IOException;
     9 
    10 /*
    11  * 需求:复制单极文件夹
    12  * 
    13  * 数据源:e:\demo
    14  * 目的地:e:\test
    15  * 
    16  * 分析:
    17  *         A:封装目录
    18  *         B:获取该目录下的所有文本的File数组
    19  *         C:遍历该File数组,得到每一个File对象
    20  *         D:把该File进行复制
    21  */
    22 public class CopyFolderDemo {
    23     public static void main(String[] args) throws IOException {
    24         // 封装目录
    25         File srcFolder = new File("e:\demo");
    26         // 封装目的地
    27         File destFolder = new File("e:\test");
    28         // 如果目的地文件夹不存在,就创建
    29         if (!destFolder.exists()) {
    30             destFolder.mkdir();
    31         }
    32 
    33         // 获取该目录下的所有文本的File数组
    34         File[] fileArray = srcFolder.listFiles();
    35 
    36         // 遍历该File数组,得到每一个File对象
    37         for (File file : fileArray) {
    38             // System.out.println(file);
    39             // 数据源:e:\demo\e.mp3
    40             // 目的地:e:\test\e.mp3
    41             String name = file.getName(); // e.mp3
    42             File newFile = new File(destFolder, name); // e:\test\e.mp3
    43 
    44             copyFile(file, newFile);
    45         }
    46     }
    47 
    48     private static void copyFile(File file, File newFile) throws IOException {
    49         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
    50                 file));
    51         BufferedOutputStream bos = new BufferedOutputStream(
    52                 new FileOutputStream(newFile));
    53 
    54         byte[] bys = new byte[1024];
    55         int len = 0;
    56         while ((len = bis.read(bys)) != -1) {
    57             bos.write(bys, 0, len);
    58         }
    59 
    60         bos.close();
    61         bis.close();
    62     }
    63 }

    练习:复制指定目录下指定后缀名的文件并修改名称案例

     1 package cn.itcast_04;
     2 
     3 import java.io.BufferedInputStream;
     4 import java.io.BufferedOutputStream;
     5 import java.io.File;
     6 import java.io.FileInputStream;
     7 import java.io.FileOutputStream;
     8 import java.io.FilenameFilter;
     9 import java.io.IOException;
    10 
    11 /*
    12  * 需求:复制指定目录下的指定文件,并修改后缀名。
    13  * 指定的文件是:.java文件。
    14  * 指定的后缀名是:.jad
    15  * 指定的目录是:jad
    16  * 
    17  * 数据源:e:\java\A.java
    18  * 目的地:e:\jad\A.jad
    19  * 
    20  * 分析:
    21  *         A:封装目录
    22  *         B:获取该目录下的java文件的File数组
    23  *         C:遍历该File数组,得到每一个File对象
    24  *         D:把该File进行复制
    25  *         E:在目的地目录下改名
    26  */
    27 public class CopyFolderDemo {
    28     public static void main(String[] args) throws IOException {
    29         // 封装目录
    30         File srcFolder = new File("e:\java");
    31         // 封装目的地
    32         File destFolder = new File("e:\jad");
    33         // 如果目的地目录不存在,就创建
    34         if (!destFolder.exists()) {
    35             destFolder.mkdir();
    36         }
    37 
    38         // 获取该目录下的java文件的File数组
    39         File[] fileArray = srcFolder.listFiles(new FilenameFilter() {
    40             @Override
    41             public boolean accept(File dir, String name) {
    42                 return new File(dir, name).isFile() && name.endsWith(".java");
    43             }
    44         });
    45 
    46         // 遍历该File数组,得到每一个File对象
    47         for (File file : fileArray) {
    48             // System.out.println(file);
    49             // 数据源:e:javaDataTypeDemo.java
    50             // 目的地:e:\jadDataTypeDemo.java
    51             String name = file.getName();
    52             File newFile = new File(destFolder, name);
    53             copyFile(file, newFile);
    54         }
    55 
    56         // 在目的地目录下改名
    57         File[] destFileArray = destFolder.listFiles();
    58         for (File destFile : destFileArray) {
    59             // System.out.println(destFile);
    60             // e:jadDataTypeDemo.java
    61             // e:\jad\DataTypeDemo.jad
    62             String name =destFile.getName(); //DataTypeDemo.java
    63             String newName = name.replace(".java", ".jad");//DataTypeDemo.jad
    64             
    65             File newFile = new File(destFolder,newName);
    66             destFile.renameTo(newFile);
    67         }
    68     }
    69 
    70     private static void copyFile(File file, File newFile) throws IOException {
    71         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
    72                 file));
    73         BufferedOutputStream bos = new BufferedOutputStream(
    74                 new FileOutputStream(newFile));
    75 
    76         byte[] bys = new byte[1024];
    77         int len = 0;
    78         while ((len = bis.read(bys)) != -1) {
    79             bos.write(bys, 0, len);
    80         }
    81 
    82         bos.close();
    83         bis.close();
    84     }
    85 }

    练习:复制多级文件夹案例

     1 package cn.itcast_05;
     2 
     3 import java.io.BufferedInputStream;
     4 import java.io.BufferedOutputStream;
     5 import java.io.File;
     6 import java.io.FileInputStream;
     7 import java.io.FileOutputStream;
     8 import java.io.IOException;
     9 
    10 /*
    11  * 需求:复制多极文件夹
    12  * 
    13  * 数据源:E:JavaSEday21codedemos
    14  * 目的地:E:\
    15  * 
    16  * 分析:
    17  *         A:封装数据源File
    18  *         B:封装目的地File
    19  *         C:判断该File是文件夹还是文件
    20  *             a:是文件夹
    21  *                 就在目的地目录下创建该文件夹
    22  *                 获取该File对象下的所有文件或者文件夹File对象
    23  *                 遍历得到每一个File对象
    24  *                 回到C
    25  *             b:是文件
    26  *                 就复制(字节流)
    27  */
    28 public class CopyFoldersDemo {
    29     public static void main(String[] args) throws IOException {
    30         // 封装数据源File
    31         File srcFile = new File("E:\JavaSE\day21\code\demos");
    32         // 封装目的地File
    33         File destFile = new File("E:\");
    34 
    35         // 复制文件夹的功能
    36         copyFolder(srcFile, destFile);
    37     }
    38 
    39     private static void copyFolder(File srcFile, File destFile)
    40             throws IOException {
    41         // 判断该File是文件夹还是文件
    42         if (srcFile.isDirectory()) {
    43             // 文件夹
    44             File newFolder = new File(destFile, srcFile.getName());
    45             newFolder.mkdir();
    46 
    47             // 获取该File对象下的所有文件或者文件夹File对象
    48             File[] fileArray = srcFile.listFiles();
    49             for (File file : fileArray) {
    50                 copyFolder(file, newFolder);
    51             }
    52         } else {
    53             // 文件
    54             File newFile = new File(destFile, srcFile.getName());
    55             copyFile(srcFile, newFile);
    56         }
    57     }
    58 
    59     private static void copyFile(File srcFile, File newFile) throws IOException {
    60         BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
    61                 srcFile));
    62         BufferedOutputStream bos = new BufferedOutputStream(
    63                 new FileOutputStream(newFile));
    64 
    65         byte[] bys = new byte[1024];
    66         int len = 0;
    67         while ((len = bis.read(bys)) != -1) {
    68             bos.write(bys, 0, len);
    69         }
    70 
    71         bos.close();
    72         bis.close();
    73     }
    74 }

     --回眸不舍离去,此情为你 在心上停栖... ...

    如欢如殇 授以青春鲜活肢体奔忙 如思如忘 驱以老朽深沉灵魂冥想 始自情热激荡 从未敢终于世事炎凉 无能执手相望 无法去尝试结发同床 无力至心死身僵 一息坚强 ------ 我一直没有放弃,如果你也能看到 修身 修禅
  • 相关阅读:
    使用jQuery和CSS自定义HTML5 Video 控件 简单适用
    在win7系统下使用Windows XP Mode 和 Windows Virtual PC搭建window xp系统
    Runtime 解读
    Reachability实时监控网络变化
    关于AsyncSocket
    关于CoreData的用法
    邓白氏编码申请
    Android 到底是个什么东西?
    听 Fabien Potencier 谈Symfony2 之 《What is Symfony2 ?》
    听 Fabien Potencier 谈Symfony2 之 《What is Dependency Injection ?》
  • 原文地址:https://www.cnblogs.com/lz2lhy/p/6995113.html
Copyright © 2020-2023  润新知