黑马程序员——IO流

来源:互联网 发布:玄学通软件下载 编辑:程序博客网 时间:2024/05/22 12:58

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


1. File

      File:既可以表示文件,也可以表示(目录)文件夹。  


(1)IO流

    作用:用于处理不同设备间数据输入输出问题的。

    分类:字节流、字符流

    IO流操作的类都在IO包中。


(2)构造方法:

        File(String pathname):根据指定的路径创建File对象


        File(String parent,String child):根据指定的父文件夹和子文件或者文件夹创建File对象


        File(File parent,String child):根据指定的父文件夹对象和子文件或者文件夹创建File对象

 

(3)成员方法:

    1、创建功能:

        public boolean createNewFile() 如果指定的文件不存在,就创建;反之不创建

        public boolean mkdir() 创建指定的目录,如果不存在,就创建

        public boolean mkdirs()创建指定的目录,如果不存在,就创建。如果父目录不存在,它也会自动创建


        绝对路径:以盘符开始的路径

        相对路径:不以盘符开始的路径


    2、删除功能:

        public boolean delete():既可以删除文件,也可以删除文件夹,取决于使用的对象


     注意:

        A:如果你删除的目录下还有内容,必须先把目录下的内容删除完毕后,再删除目录

        B:java语言的删除不走回收站


    3、判断功能  

        public boolean exists() 判断file对象是否存在

        public boolean isFile() 判断file对象是否是文件

        public boolean isDirectory()  判断file对象是否是文件夹

        public boolean isAbsolute() 判断file对象是否是绝对路径

        public boolean canRead() 判断file对象是否可读
        public boolean canWrite()判断file对象是否可写  
        public boolean isHidden()判断file对象是否隐藏

 

    4、获取功能:

        public StringgetAbsolutePath()  获取文件的绝对路径字符串

        public StringgetPath()  获取相对路径
        public StringgetName()  获取文件名称
        public long length()  获取文件的大小,单位是字节
        public long lastModified() 获取上次修改时间的毫秒值
        public static File[] listRoots() 列出可用的系统文件根目录(盘符) 
        public String[] list()  返回的是指定目录下所有文件或者文件夹的名称数组
        public File[] listFiles()  返回的是指定目录下所有文件或者文件夹对象数组

 

       (4)案例:

            获取指定目录下所有文件的名称

    

package com.file;import java.io.File;import java.io.FilenameFilter;public class GetFileListTest {public static void main(String[] args) {// 创建文件对象File file = new File("d:\\");File[] f = file.listFiles(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {File file2 = new File(dir + name);return file2.isFile() && name.endsWith(".txt");}});// 遍历for (File ff : f) {System.out.println(ff);}}}


(4)FileWriter写入数据

   1、 步骤:

        A:创建字符输出流对象

        B:调用写入数据方法

        C:刷新缓冲区

        D:释放资源

 

   2、 代码体现:

        FileWriter fw = new FileWriter("a.txt");

        fw.write("hello,io");

        fw.flush();

        fw.close();

 

    3、问题?

        A:创建字符输出流对象做了几件事情?

             a:调用系统功能创建文件

             b:创建字符输出流对象

             c:将字符输出流对象指向对应的文件


        注意:FileWriter fw = new FileWriter("a.txt");

            这一步创建构造方法时,如果这个文件不存在会自动创建.而 File 类的构造方法不会自动创建,自能 用 createNewFile()方法创建。


        B:为什么 FileWriter 没没有无参构造方法?

            因为 FileWriter 是输出流写数据,既然输出数据要明确数据写到哪里。


        B:写数据完毕后,为什么要刷新?

 

        C:为什么要close()?( close() 先刷新,再关闭 )

             1:让流对象变成垃圾

             2:通知系统去释放和文件相关的资源

 

        D:flush()和close()的区别?

            flush():只刷新缓冲区,流对象还可以继续使用。

            close():先刷新缓冲区,再关闭流对象。流对象不可以继续被使用。

 

        E:怎么实现数据换行?

            给出换行符

                windows:\r\n

                linu:\n

                mac:\r

 

        F:数据每次都把以前的覆盖了,要怎么实现数据追加写入?

            构造时用带两个参数的

                public FileWriter(String fileName,true){}

 

(3)FileReader读取数据

    1、步骤:

        A:创建字符输入流对象

        B:调用读取数据方法,并显示

        C:释放资源


    2、FlieReader类下方法 

         public int read()

        如果能读取到数据,它就会把这个数据的值拿到编码表中去找对应的值,

并把值返回 ,如果读取不到数据那么它就会返回-1. 

返回值类型 int 

   

public int read(char[] cbuf)

每次读取一个字符数组

(字符数组的长度一般定义为1024的整数倍)

    2、代码体现:

        FileReader fr = new FileReader("a.txt");

        //方式1

        //一次读取一个字符

        int ch = 0;

        while((ch=fr.read())!=-1)

        {

            System.out.print((char)ch);

        }

 

        //方式2

        //一次读取一个字符数组

        char[] chs = new char[1024];

        int len = 0;

        while((len=fr.read(chs))!=-1)

        {

            System.out.print(new String(chs,0,len));

        }

        fr.close();

 

 

2、IO

(1)分类

   1、 字节流:

    输入流:

        A.InputStream(抽象类)

            int read()

            int read(byte[] bys)

        B.FileInputStream(常用基本流)

        C.BufferedInputStream


    输出流:

       A. OutputStream(抽象类)

            write(int by)

            write(byte[] bys,int index,int len)

        B.FileOutputStream(常用基本流)

        C.BufferedOutputStream

 

    2、字符流:

        输入流:

            A.Reader(抽象类)

                int read()

                int read(char[] chs)

           B. FileReader(常用基本流)

            C.BufferedReader

                String readLine()

        输出流:

            A.Writer(抽象类)

                write(int ch)

                write(char[] chs,int index,int len)

            B.FileWriter(常用基本流)

            C.BufferedWriter

                write(String line)

                void newLine()

 

(2)到底使用谁

    用记事本打开能读懂的,就用字符流。

    否则,用字节流。

    如果你根本就不知道,用字节流。

 

(3)复制文本文件

    9种方式:

        字节流:

            4种

                基本流一次读写一个字节

                基本流一次读写一个字节数组

                高效流一次读写一个字节

                高效流一次读写一个字节数组

        字符流:

            5种

                基本流一次读写一个字符

                基本流一次读写一个字符数组

                高效流一次读写一个字符

                高效流一次读写一个字符数组

                高效流一次读写一个字符串

 

    一般来说,明明知道是文本文件,那么,肯定不用字节流。

    那么,如果是使用字符流,有5种方式,选择哪一种呢?

    一般都选择高效流读写一个字符串的方式。

 


 

(4)复制二进制流数据:(图片,视频,音频等)

    字节流:

        4种

            基本流一次读写一个字节

            基本流一次读写一个字节数组

            高效流一次读写一个字节

            高效流一次读写一个字节数组

 

    一般来说,我们选择使用高效流一次读写一个字节数组

 

(4)案例:

   1、 复制文本文件, 将文件从数据源复制到目的地

package com.io;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/** * 复制文件工具类 *  */public class Copys {private Copys() {}public static void copyFile(String src, String dest) throws IOException {// 数据源BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));// 目的地BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest));// 读写byte[] by = new byte[1024];int len = 0;while ((len = bis.read()) != -1) {bos.write(by, 0, len);bos.flush();}// 关闭bos.close();bis.close();}}

 

2、将D盘 b.mp3 复制到项目下

package com.io;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;/* * 异常标准类 * 将D盘 mp3 复制到项目下 */public class BufferedException {public static void main(String[] args) {BufferedInputStream bis = null;BufferedOutputStream bos = null;try {// 数据源bis = new BufferedInputStream(new FileInputStream("d:\\b.mp3"));// 目的地bos = new BufferedOutputStream(new FileOutputStream("1.mp3"));// 读写byte[] bys = new byte[1024];int len = 0;while ((len = bis.read(bys)) != -1) {bos.write(bys);}} catch (IOException e) {e.printStackTrace();} finally {// 关闭if (bos != null) {try {bos.close();} catch (IOException e) {e.printStackTrace();}}if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}}}}


3、将d:\\com文件夹中的 所有 .java文件改名为 .jad

package com.io;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.FilenameFilter;import java.io.IOException;/** * 将d:\\com文件夹中的 所有 .java文件改名为 .jad *  * @author L *  */public class ChangeName {public static void main(String[] args) throws IOException {// 获取文件夹下所有的java文件File oldFile = new File("d:\\com");File[] fileArray = oldFile.listFiles(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {return new File(dir, name).isFile() && name.endsWith(".java");}});// 创建目的文件夹File destFile = new File("d:\\jad");if (!destFile.exists()) {destFile.mkdir();}// 遍历java文件for (File file : fileArray) {// file -- d:\\com\\name.java// 结果 -- d:\\jad\\name.jadString name = file.getName();String newName = name.replace(".java", ".jad");// 数据源File src = new File(oldFile, name);BufferedReader br = new BufferedReader(new FileReader(src));// 目的地File dest = new File(destFile, newName);BufferedWriter bw = new BufferedWriter(new FileWriter(dest));// 读写String line = null;while ((line = br.readLine()) != null) {bw.write(line);bw.newLine();bw.flush();}// 关闭bw.close();br.close();}}}


 ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------




0 0
原创粉丝点击