欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【知了堂学习笔记】_Java中IO流的学习

程序员文章站 2024-01-28 09:02:16
...

请关注“知了堂学习社区”,地址:http://www.zhiliaotang.com/portal.php
IO流
一、概念
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。
二、用途
1.创建文件,创建目录
2.拷贝视频,拷贝文件
3.读取文件中内容信息
4.读取键盘输入信息
5.网络文件传输
三、分类
字节流:拷贝视频,拷贝文件,因为操作必须精确到字节
字符流:读取文件中内容,把内容进行输出
字节流和字符流的实现方式:输入流和输出流
输入流和输出流:
文件的拷贝,它完成一个动作的实现
第 1 步:选中 源文件(对应程序中 输入流)
第 2 步:拷贝操作(IO 流中 read 和 write 的操作)
第 3 步:选择拷贝的地方, 目标文件(对应程序中 输出流)
难点:不知道输入流什么用,也不知道输出流什么时候用
下图是一个描述输入流和输出流的类层次图
【知了堂学习笔记】_Java中IO流的学习
四、学习内容
IO 流的所有应用在 Java API 文档中 java.io 包里面
文件操作, java.io.File 类
字节流,InputStream, OutputStream
字符流,Reader,Writer
五、File类
1、File类的结构
 构造方法:只提供带参数的构造方法
 File(File parent, String child):在已有的路径下面去创建一个文件或者一个目录
 File(String pathname):在给定路径中创建一个文件或一个目录
 File(String parent, String child):在已有的路径下面去创建一个文件或者一个目录
 普遍方法
 boolean createNewFile():创建一个文件
 boolean delete():删除文件或者目录
 boolean exists():文件或目录是否存在
 String getAbsolutePath():返回文件或目录的绝对路径
 File getAbsoluteFile():返回文件和目录的绝对路径,但是这个绝对路径是有 File 对象来表示
 String getName():返回文件或目录的名称
 File getParentFile():返回父级目录对象
 String path():返回文件或目录路径
 boolean isDirectory():判断是否是目录
 boolean isFile():判断是否是文件
 long length():返回文件大小
 File[] listFiles():返回当前目录下的文件或目录
 boolean mkdirs():创建多级目录
2、File类的应用
1.案例:创建目录
 先要创建 File 类对象
 调用 mkdirs

package io;

import java.io.File;
/**
 * 创建目录
 * @author Lenovo
 *
 */
public class Mkdirs {
    public static void main(String args[]) {
        File file = new File("F:\\file\\music");
        file.mkdirs();
    }
}

2.案例:创建文件
 先创建 File 类对象
 调用 createNewFile

package io;

import java.io.File;
import java.io.IOException;
/**
 * 创建文件
 * @author Lenovo
 *
 */
public class CreateNewFile {
    /**
     * 1.应该判断目录是否存在
     * 2.然后再去创建文件
     * @param args
     * @throws IOException
     */
    public static void main(String args[]) throws IOException {
        File directory = new File("F:\\file\\music");
        File file = new File(directory, "知了堂.docx");
        if(!directory.exists()) {
            directory.mkdirs();
        }
        file.createNewFile();
    }

}

3.案例:删除目录
 先创建 File 类对象
 调用 delete,注意如果有文件的存在,则目录删除不掉

package io;

import java.io.File;
/**
 * 删除目录
 * @author Lenovo
 *
 */
public class DeleteDirectory {
    /**
     * 1.如果是多级目录怎么删除
     * 2.如果是目录里有文件怎么删除
     * @param args
     */
    public static void main(String args[]) {
        File directory = new File("F:\\file\\music");
        if(!directory.exists()) {
            return;//终止方法
        }
        File[] files = directory.listFiles();//返回music目录下的文件
        if(files.length > 0) {//判断music目录下还有其他文件
            for(File file : files) {
                if(file.isFile()) {
                    file.delete();
                }
            }
        }
        directory.delete();//最后删除misic的目录,整个main方法不完整,因为music中还有子目录
    }
}

4.案例:获取目录下文件(一级目录)
 先创建 File 对象
 调用 listFiles

package io;

import java.io.File;
/**
 * 获取目录下的所有文件或者一级目录
 * @author Lenovo
 *
 */
public class GetOneClassDirectory {
    public static void main(String args[]) {
        File directory = new File("F:\\level_3\\01_学习内容");
        File[] files = directory.listFiles();
        for(File file : files) {
            System.out.println(file.getName());
        }
    }
}

5.案例:获取文件大小
 创建 File 对象
 判断是否是文件
 计算文件的大小

package io;

import java.io.File;
/**
 * 获得文件的大小
 * @author Lenovo
 *
 */
public class GetFileSize {
    public static void main(String args[]) {
        File file = new File("F:\\jdk-7u80-windows-x64.zip");
        if(file.isFile()) {
            System.out.println(file.length());//字节大小
        }
    }
}

6.案例:获取文件的路径
 getPath
 getAbsolutePath
 getAbsoluteFile

package io;

import java.io.File;
/**
 * 获取文件的路径
 * @author Lenovo
 *
 */
public class GetFilePath {
    public static void main(String args[]) {
        File file = new File("F:\\level_3\\01_学习内容\\01_教学内容\\day03_线程_基础\\Thread.zip");
        String path = file.getPath();
        String pathAbsolutePath = file.getAbsolutePath();
        File dd = file.getAbsoluteFile();//得到绝对路径下的File对象,则我们去测试一下getPath方法
        System.out.println("path = " + path);
        System.out.println("pathAbsolutePath = " + pathAbsolutePath);
        System.out.println("dd = " + dd.getPath());
    }
}

六、字节流
1、 字节流的结构
 字节的输入流:InputStream
 字节的输出流:OutputStream
 重点如下:
 InputStream,OutputStream 都是抽象类
 输入流的方法:read,close, available,这些方法主要是为了读取数据,关闭 IO 流,计算文
件的大小
 输出流的方法:write, close, flush,这些主要是为了写数据,关闭 IO 流,刷新缓存
2、 IO 的用法
【知了堂学习笔记】_Java中IO流的学习
3、文件拷贝
 实现文件拷贝的思路
 选择使用什么类型的流(字节流,字符流)
 因为文件拷贝是一种二进制流,拷贝的过程通过读取字节完成拷贝工作
 所以我们选择字节流

package io;

import java.io.*;
/**
 * 文件拷贝
 * 1.选择使用什么类型的流(字节流,字符流)
 * 2.因为文件拷贝是一种二进制流,拷贝的过程通过读取字节完成拷贝工作
 * 3.所以我们选择字节流
 * @author Lenovo
 *
 */
public class FileCopy {
    public static void main(String args[]) throws IOException {
        File srcFile = new File("F:\\level_3\\01_学习内容\\知了堂_软工_技术笔记_lv3_水印.pdf");
        File dirFile = new File("E:\\知了堂_软工_技术笔记_lv3_水印.pdf");

        InputStream is = new FileInputStream(srcFile);
        OutputStream os = new FileOutputStream(dirFile);

        //读与写的操作
        byte[] b = new byte[1024];//读取过程中能够存储的字节数量
        int i = -1;//判断是否读取源文件结束
        while((i = is.read(b)) != -1) {
            os.write(b, 0, i);//从缓存中0开始输出,到i结束
        }

        is.close();
        os.flush();
        os.close();
    }
}

七、字符流
1、字符流的结构
 输入流 Reader,抽象类
 输出流 Writer,抽象类
 读取数据时候通过 read
 写入数据时候通过 write
2、字符流的用法
【知了堂学习笔记】_Java中IO流的学习
3、 读取文件中内容
 案例:读取 txt 文件中内容并输出到控制台
 读取 txt 文件中内容使用 Reader
 读出来的内容写入到 Console,我们采用 System.out.println(…..)

package io;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/**
 * 读文件的内容
 * @author Lenovo
 *
 */
public class ReadFile {
    public static void main(String args[]) throws IOException {
        File srcFile = new File("F:\\752.txt");

        Reader reader = new FileReader(srcFile);

        //读操作
        char[] c = new char[1024];//存储读取到字符
        int i = -1;//标明读取文件结束
        while((i = reader.read(c)) != -1) {
            System.out.println(c);
        }

        reader.close();
    }
}
package io;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/**
 * 读文件的内容 采用缓冲流来完成文件读取
 * @author Lenovo
 *
 */
public class ReadFile2 {
    public static void main(String args[]) throws IOException {
        File srcFile = new File("F:\\752.txt");
        Reader reader = new FileReader(srcFile);

        BufferedReader br = new BufferedReader(reader);//构建缓冲流就OK了

        //读操作
        String content = null;//获取读取到的内容,页标明是否文件读取结束
        while((content = br.readLine()) != null) {
            System.out.println(content);
        }

        br.close();
    }
}

4、写内容到文件里面
 案例:先读取到 txt 文件的内容,然后将此内容写入到 word 文档
 输入流 BufferedReader
 输出流 BufferedWriter

package io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

public class ReadAndWrite {
    /**
     * 读取文件的内容并写入到word文档里面
     * @param args
     * @throws IOException
     */
    public static void main(String args[]) throws IOException {
        File srcFile = new File("F:\\752.txt");
        File dirFile = new File("F:\\752.doc");

        Reader reader = new FileReader(srcFile);
        Writer writer = new FileWriter(dirFile);

        BufferedReader br = new BufferedReader(reader);
        BufferedWriter bw = new BufferedWriter(writer);

        //读与写的操作
        String content = null;//获取读取到的内容,页标明是否文件读取结束
        while((content = br.readLine()) != null) {
            bw.write(content);//将缓冲中读取到的内容写入到word文档里面
            bw.newLine();//写一个行分割符
        }

        br.close();
        bw.flush();
        bw.close();
    }


}