Java 基础巩固 - IO 流

166 阅读2分钟

1、文件

1.1 创建文件的三种方式

@Test
public void create01() throws IOException {
    String filePath = "f:\news.txt";
    File file = new File(filePath);
    file.createNewFile();
}

@Test
public void create02() throws IOException {
    File file = new File("d:\");
    String fileName = "news2.txt";
    File file1 = new File(file, fileName);
    file1.createNewFile();
}

@Test
public void create03() throws IOException {
    String parentPath = "f:\";
    String childPath = "news3.txt";

    File file = new File(parentPath, childPath);
    file.createNewFile();
}

1.2 获取文件相关信息方法

public void info(){
    File file = new File("f:\news3.txt");
    System.out.println("文件全路径:" + file.getAbsoluteFile()); // f:\news3.txt
    System.out.println("文件名:" + file.getName());
    System.out.println("父路径:" + file.getParent());
    System.out.println("文件绝对路径 :" + file.getAbsolutePath());
    System.out.println("是不是一个文件 : " + file.isFile());
    System.out.println("是不是一个目录:" + file.isDirectory());
    System.out.println("文件是否存在:" + file.exists());
    System.out.println("文件内容字节数 :" + file.length());
}

2、IO 流

2.1 流的分类

2.1.1 InputStream

常用子类:

  • FileInputStream:文件输入流
    public void stream01() {
        // 抽象类
        // OutputStream、InputStream、Reader、Write
        String filePath = "f:\hello.txt";
        int len = 0;
        byte[] bytes = new byte[10];
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(filePath);
            while((len = fileInputStream.read(bytes)) != -1){
                System.out.println(new String(bytes, 0, len));
            }
        }  catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    
  • BufferedInputStream:缓冲字节输入流
  • ObjectInputStream:对象输入流

2.1.2 OutputStream 和 InputStream

public void objectStream() throws IOException {

    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("f:\hello.txt"));

    oos.write(100);
    oos.writeObject(new Dog("小黄", 15));

    oos.close();

}

public void objectInput() throws Exception{
    ObjectInputStream oos = new ObjectInputStream(new FileInputStream("f:\hello.txt"));

    System.out.println(oos.read());
    System.out.println(oos.readObject().toString());

    oos.close();
}

2.1.3 Reader

  • BufferedReader 因为是包装类,所以需要传递一个字类给 BufferedReader
public void bufferedReaderStream() throws IOException {
    String filePath = "f:\hello.txt";

    BufferedReader bufferedReader = null;

    bufferedReader = new BufferedReader(new FileReader(filePath));

    String line;
    while((line = bufferedReader.readLine()) != null){
        System.out.println(line);
    }
    bufferedReader.close();
}
  • BufferedInput

2.1.4 Write

  • BufferedWrite
public void bufferedWrite() throws IOException {
    BufferedWriter bufferedWriter = null;
    bufferedWriter = new BufferedWriter(new FileWriter("f:\helloT.txt", true));

    bufferedWriter.newLine();
    bufferedWriter.write("李永奇");

    bufferedWriter.close();
}

案例:使用 BufferedWrite 喝 BufferedReader 完成拷贝

public void bufferedReaderStream() throws IOException {
    String filePath = "f:\hello.txt";

    BufferedReader bufferedReader = null;
    BufferedWriter bufferedWriter = null;

    bufferedWriter = new BufferedWriter(new FileWriter("f:\helloT.txt", true));
    bufferedReader = new BufferedReader(new FileReader(filePath));

    String line;
    while((line = bufferedReader.readLine()) != null){
        bufferedWriter.newLine();
        bufferedWriter.write(line);
    }
    bufferedReader.close();
    bufferedWriter.close();
}

案例:使用 InputStream 和 OutputStream 完成图片拷贝

/**
 *  完成图片拷贝
 */
public void copyImage() throws IOException {

    String filePath = "f:\java.png";
    String filePath2 = "f:\javaCopy.png";

    FileInputStream fileInputStream = null;
    FileOutputStream fileOutputStream = null;

    int len = 0;
    byte[] buf = new byte[1024];

    try {
        fileInputStream = new FileInputStream(filePath);
        fileOutputStream = new FileOutputStream(filePath2);
        while((len = fileInputStream.read(buf)) != -1){
            fileOutputStream.write(buf);
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        fileInputStream.close();
        fileOutputStream.close();
    }

}

2.2 节点流和处理流联系与区别

  • 节点流是低级流,直接和数据源相连接
  • 包装流来包装节点流,可以消除不同节点流(只要是Reader的子类)的实现差异(FileReader、ObjectReader),也可以提供更方便的方法来完成输入输出
  • 包装流对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连接