java-IO系统

1.概念:IO(输入/输出)指的是计算机与外部世界,或者一个程序与计算机的其余部分的接口。

2.流(stream)的概念:当程序需要写入数据的时候,就会开启一个通向目的地设备的流。

(1).流的特性:含有流质(数据);具有方向(读或写)。

3.IO操作的步骤:建立流、操作流、关闭流

4.文件类

(1).File构造器

 public File(String pathname)

 public File(String parent,String child)

 public File(File parent,String child)

  public File(URL uri)

 

(2).File对象类似于一个字符串,只代表一个文件或一个目录的路径名,所以,即使指定的文件或目录不存在,这些构造器也能成功执行。

       // 创建File对象

        File file = new File("E:exercise_bak.txt");



        // 能否读

        System.out.println("能否读:" + file.canRead());



        // 删除

        System.out.println("删除成功:" + file.delete());



        // 重新创建文件对象

        file = new File("E:\\jg\\exercise_bak.txt");



        // 判断文件是否存在

        System.out.println("是否存在:" + file.exists());



        // 目录或文件名称

        System.out.println("名称:" + file.getName());



        // 是否目录、文件

        System.out.println("是否目录:" + file.isDirectory());

        System.out.println("是否文件:" + file.isFile());



        // 最后一次修改时间

        System.out.println("最后一次修改时间:" + new Date(file.lastModified()));



        // 文件大小

        System.out.println("文件大小:" + file.length());



        // 重新创建File对象

        file = new File("E:\\jg");



        System.out.println("文件目录列表:");

        // 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录

        String[] list = file.list();

        for (String string : list) {

            System.out.println(string);

        }

        System.out.println("*******************************");



        // 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件对象

        File[] files = file.listFiles();

        for (File item : files) {

            if (item.isDirectory()) { // 当前File对象为目录,则遍历该目录下所有子目录与文件

                System.out.println(item.getName() + " 目录下子目录与文件:");

                String[] it = item.list();

                for (String i : it) {

                    System.out.println(i);

                }

                continue;

            }



            System.out.println(item.getName() + "  文件");

        }



        // 重新创建File对象

        file = new File("E:\\jg\\test\\demo\\test.txt");

        if (!file.exists()) { // 文件不存在

            // 获取文件路径

            File dir = file.getParentFile();

            if (!dir.exists()) { // 目录不存在,则创建路径中所有不存在的目录

                dir.mkdirs();

            }try {

                // 创建空文件

                System.out.println("文件是否创建成功:" + file.createNewFile());

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

 

5.流的分类

(1).区分高级流与低级流:查看该类的构造器。如果类的构造器带有一个已存在的流作为参数,那么就是高级流,反之则为低级流。

(2).按流的方向分:输入流。io包中的输入流都继承自抽象类InputStream或Reader。数据源读取数据到程序中

                         输出流。io包中的输出流都继承自抽象类OutputStream或Writer。将数据从程序写入数据目的地

(3).按流的处理数据的最小单位的不同:字节流(用于处理二进制文件)。byte为最小单位,io包中的字节流都继承自抽象类InputStream或OutputStream。

                                                  字符流(用于处理文本文件)。char为最小单位,io包中的输入流都继承自抽象类Reader或Writer。

(4).按流的功能分:节点流(效率低)。

                         处理流。

(5).字节流:低级字节流-FileInputStream或FileOutputStream...

                高级字节流-BufferedInputStream或BufferedOutputStream(缓冲流);DataInputStream或DataOutputStream(数据流)...

(6).字符流:低级字符流-FileReader或FileWriter...

                 高级字符流-BufferedReader或BufferdWriter(缓冲流);InputStreamReader或OutputStreamWriter(转换流)...

package com.lovo;



import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.io.Reader;

import java.io.Writer;



/**

 * 字符输入输出流测试

 * 

 * @author 

 *

 */

public class IOTest2 {



    public static void main(String[] args) {

        StringBuffer buffer = new StringBuffer();



        /* 输入流 */

        Reader reader = null;



        try {

            // 1. 打开流

            reader = new FileReader("E:\\jg\\exercise.txt");

            // 2. 读取

            char[] ch = new char[128]; // 缓冲区

            int len;

            do {

                len = reader.read(ch);

                if (len == -1)

                    break;

                buffer.append(new String(ch, 0, len));

            } while (len != -1);

            System.out.println(buffer.toString());

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            // 3. 释放资源

            if (reader != null) {

                try {

                    reader.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }



        /* 输出流 */



        Writer writer = null;



        try {

            // 1. 打开流

            writer = new FileWriter("d:\\test.txt");

            // 2. 写入

            writer.write(buffer.toString());

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            // 3. 释放资源

            if (writer != null) {

                try {

                    writer.flush();

                    writer.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

    }

}

 

package com.lovo;



import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;



/**

 * 字节输入输出流测试

 * 

 * @author 

 *

 */

public class IOTest {



    public static void main(String[] args) {

        StringBuffer buffer = new StringBuffer(); // 字符串缓冲

        

        /* 输入流 */

        InputStream in = null;



        try {

            // 1. 打开输入流

            in = new FileInputStream("E:\\jg\\exercise.txt");

            // 2. 读取

//            byte[] b = new byte[128];

            byte[] b = new byte[1024 * 4];

            int len = in.read(b); // 返回读取到的字节数,返回-1表示读取到流结尾

            while(len != -1){

                buffer.append(new String(b, 0, len)); // 将读取到的字节解析为String追加到缓冲

                len = in.read(b);

            }

//            System.out.println("读到" + len + "字节的数据");

            System.out.println(buffer.toString());

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            // 3. 释放资源,关闭输入流

            if (in != null){

                try {

                    in.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

        

        /* 输出流 */

        OutputStream out = null;

        

        try {

            File file = new File("D:\\test\\demo\\test.txt");

            if (!file.getParentFile().exists()){ // 文件路径不存在,则创建路径中所有不存在的目录

                file.getParentFile().mkdirs();

            }

            // 1. 打开输出流

            out = new FileOutputStream(file);

            // 2. 写

            out.write(buffer.toString().getBytes());

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            // 3. 释放输出流资源

            if (out != null){

                try {

                    out.flush();

                    out.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

    }

}

 

(7).对象流:ObjectInputStream(反序列化操作)或ObjectOutputStream(序列化操作)

     补充:

           Serializable"标记接口":实现对象序列化

           transient修饰符:该属性在写入文件时,没有被写入;读取时,也读取不到。

package com.lovo.day2;



import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.util.Date;



public class ObjectTest {



    public static void main(String[] args) {

        Student stu = new Student("张飞", 18, true, 10.0, new Date(), new Course(

                1, "语文"));

        Student stu2 = new Student("张飞2", 18, true, 10.0, new Date(), new Course(

                2, "数学"));



        // 序列化

        ObjectOutputStream out = null;



        try {

            out = new ObjectOutputStream(

                    new FileOutputStream("d:\\student.bin"));

            out.writeObject(stu);

            out.writeObject(stu2);

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            if (out != null) {

                try {

                    out.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }



        // 反序列化

        ObjectInputStream in = null;



        try {

            in = new ObjectInputStream(new FileInputStream("d:\\student.bin"));

            Student stu1 = (Student) in.readObject();

            System.out.println(stu1);



            System.out.println("*****************");



            System.out.println(stu1.getCourse());

            

            System.out.println("##########################");

            

            Student stu21 = (Student) in.readObject();

            System.out.println(stu21);

            

            System.out.println("*****************");

            

            System.out.println(stu21.getCourse());

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } finally {

            if (in != null) {

                try {

                    in.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

    }

}

你可能感兴趣的:(java)