Java SE 拓展篇 P5 Java中的IO流

1 Java中IO流分类和原理

1.1 IO流的分类

通过程序下载一张图片的过程:
将该图片转化为2进制数据集,把该数据集一点一点的传到文件夹,这个传递的过程就类似于水的流动,所以可以将该2进制数据集当作一个数据流

Java的IO流都是由4个父类派生出来的:

字节流(8bit) InputStream OutputStream
字符流(16bit) Reader Writer

按照具体的使用形式,可以分为:

1,文件流
操作文件,数据流的读写都是基于文件的操作
FielInputStream,FileOutputStream,FileReader,FileWrite

2,缓冲流
操作内存,数据流的读写都是基于内存的操作
BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter

3,转换流
InputStreamReader,OutputStreamWriter

4,标准输入/输出流
InputStream,printStream

5,打印流
常用的System.out.println()就是打印流
printStream,printWriter 

6,数据流
DataInputStream,DataOutputStream

7,对象流
把一个对象转化为一个数据流进行读写
ObjectInputStream,ObjectOutputStream
...

1.2 JavaIO流的原理

IO流用来处理设备之间的数据传输,Java程序对于数据的输入/输出以Stream的形式进行

java.io包下提供了各种"流"类和接口,用以获得不同类的数据并通过标准的方法输入或输出数据

输入input: 读取外部数据(硬盘,光盘等)到内存中
输出output: 将内存中的数据写入硬盘,光盘等

2 Java中IO流的简单使用

2.1 对文件或目录属性的操作

在java.io.File中File类能操作的不仅是文件还有目录,但是File只能创建,删除,重命名文件和目录,但File不能访问文件内容本身,如果需要访问文件内容,需要使用输入流/输出流

public static void main(String[] args) throws IOException {
    
    
        /*file对象就是现在的iotest.txt文件
        * Java中 \ 是转义符,在Java中 / 或 \\ 才是文件分隔符*/
        File file = new File("D:\\java\\iotest.txt");
        System.out.println(file.getName());
        System.out.println(file.getAbsolutePath());

        file.renameTo(new File("D:\\java\\ioTest.txt"));

        /*目录和文件都可以创建File类对象*/
        File file1 = new File("D:\\java");
        System.out.println(file1.getName());
        System.out.println(file1.getAbsolutePath());
        System.out.println(file1.getPath());
        System.out.println(file1.isFile());

        /*使用相对路径来创建File类对象*/
        File file2 = new File("src/com/coisini/io/test/IOTest0.java");
        System.out.println(file2.getPath());;
        System.out.println(file2.getAbsolutePath());
        System.out.println(file2.getParent());

        /*判断File类对象是否存在,是文件还是目录*/
        File file3 = new File("D:\\java\\ioTest.txt");
        System.out.println(file3.exists());
        System.out.println(file3.isDirectory());
        System.out.println(file3.isFile());

        /*得到File类对象的具体信息*/
        File file4 = new File("D:\\java\\ioTest.txt");
        System.out.println(file4.lastModified());
        System.out.println(file4.length());

        /*根据File类对象创建并删除一个文件*/
        File file5 = new File("D:\\java\\IOTT.txt");
        if(!file5.exists()) {
    
    
            file5.createNewFile();
        }
        System.out.println(file5.getName());
        file5.delete();

        /*根据File类对象创建并删除一个目录*/
        File file6 = new File("D:\\java\\IODIR");
        file6.mkdir();
        file6.delete();

        /*获得File类对象目录下的所有子目录和文件*/
        File file7 = new File("D:\\java");
        File[] files = file7.listFiles();
        for(File f : files) {
    
    
            System.out.println(f.getName());
        }

    }

2.2 通过File遍历目录下的所有文件

public class ScanFiles {
    
    

    public ScanFiles() {
    
    }

    public void scanFiles(File file) {
    
    
        if(file.isFile()) {
    
    
            System.out.println(file.getName() + "是文件");
        }

        File[] files = file.listFiles();
        for(File f : files) {
    
    
            if(f.isDirectory()) {
    
    
                System.out.println(f.getName() + "是目录,进入目录..");
                scanFiles(f);
            } else {
    
    
                System.out.println(f.getName() + "是文件");
            }
        }
    }

}

在这里插入图片描述

2.3 对文件的内容进行读写

对于文件内容的读写需要使用IO流来进行,读写文件需要FielInputStream,FileOutputStream

public static void main(String[] args) throws IOException {
    
    

        /*采用字节输入流读取文件中内容*/
        FileInputStream fileInputStream = new FileInputStream("D:\\test.txt");

        //采用字节流的方式用byte数组接收目标文件的内容
        byte[] bytes = new byte[64];
        fileInputStream.read(bytes);
        System.out.println(new String(bytes));

        //使用完流后需要关闭
        fileInputStream.close();

        /*采用字节输出流向文件中写入内容*/
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\test.txt");

        String str = "1234342342wdaczzqd@@~`!";
        fileOutputStream.write(str.getBytes());

        fileOutputStream.close();

    }

注: 读取文件内容和向文件写入内容都需要byte[ ]来进行,使用完后需要关闭

3 对象流

3.1 需要对象流的原因

为了让对象持久化(把对象保存到硬盘)和将对象在网络间进行传输

对象流能够把Java中的对象转化为数据流(2进制文件),也能把对象从数据流中还原回来

对象流有两种:

ObjectInputStream
ObjectOutputStream

3.2 序列化和反序列化

序列化:用ObjectInputStream类将一个Java对象转化为数据流中

反序列化:用ObjectOutputStream类从数据流中恢复序列化之前的Java对象

如果要让一个对象实现序列化和反序列化,则需要让该对象的所属类实现Serializable接口/Externalizable接口之一

序列化和反序列化的测试:
在这里插入图片描述
在这里插入图片描述
将对象序列化保存到文本文件中的结果:
在这里插入图片描述
将对象反序列化后输出的结果:
在这里插入图片描述

: 序列化和反序列化所使用的类必须完全一致,包名,类名一切相关信息必须相同,否则反序列化可能得不到想要的结果出现类型转换异常,使用时最好生成一个serialVersionUID以区别同名但结构不同的类

猜你喜欢

转载自blog.csdn.net/weixin_43541094/article/details/113687131