详解JAVA IO

简介: 1.概论IO,input stream、output stream,JAVA中负责IO的是一个专门的包,java.io,这个包里面提供了多个类支撑整个IO功能。

1.概论

IO,input stream、output stream,JAVA中负责IO的是一个专门的包,java.io,这个包里面提供了多个类支撑整个IO功能。

2.文件和File类

2.1.文件

文件系统由OS进行管理,文件由两部分组成:

  1. 文件里面的数据
  2. 文件自身的基本属性,如名称、大小、扩展名、修改时间等。

2.2.File类

JAVA提供File类对文件进行操作,


File表示磁盘上的文件或目录


File类提供了与平台无关的方法类对磁盘上的文件或目录进行操作。


File类只是表示磁盘上的文件或者文件系统,只能对文件或者文件系统进行处理,比如删除文件、获取文件长度等信息


File类没有提供方法对文件进行读写.


代码示例:

public static void main(String[] args) {
    File file=new File("D:\\docs");
    //文件是否存在
    System.out.println(file.exists());
    //文件绝对路径
    System.out.println(file.getAbsolutePath());
    //是否是个目录(文件夹)
    System.out.println(file.isDirectory());
    //是否是个文件
    System.out.println(file.isFile());
    //文件长度(单位:字节)
    System.out.println(file.length());
    //删除文件,文件夹或文件必须为空才能删除
    System.out.println(file.delete());
    //创建文件夹
    File newFile1=new File("D:\\ZouJiaNan");
    System.out.println(newFile1.mkdir());
    //创建文件
    File newFile2=new File("D:\\ZouJiaNan\\test.txt");
    try {
      System.out.println(newFile2.createNewFile());
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    //当前层级下的所有文件和目录名
    String[] fileList=file.list();
    for (String f : fileList) {
      System.out.println(f);
    }
    //过滤当前层级下满足条件的文件或目录
      //方法一:返回String类型数组
      String[] files=file.list(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
          // TODO Auto-generated method stub
          return name.endsWith(".html");
        }
      });
      for (String s : files) {
        System.out.println(s);
      } 
      //方法二:返回File类型数组
      File[] fileArray=file.listFiles(new FilenameFilter() {    
        @Override
        public boolean accept(File dir, String name) {
          return name.endsWith(".html");
        }
      });
      for (File file2 : fileArray) {
        System.out.println(file2.getName()+"--"+file2.length());
      }
  }

3.字节、字符

字节,byte,最基础的存储单位,一个字节8bit。

字符,字面意义上的基础单位,如,a,10000,我…..,根据数据类型的不同,其对应的字节大小不同,如 int a 大小为4字节。

文件以字节进行保存。

4.流

4.1.概述

一瓶水不可能一下就完整的装到另一个瓶子里,而是要用水流的方式流向另一个瓶子,同理文件也不可能一下就被完整的读出来,而是要以流的形式流入流出,进行读写。

JAVA IO中按照所操作的数据的单位不同,可以将流分为两类:


字节流,操作的数据单位是字节。支持对一切文件的读写。

字符流,操作的数据单位是字符。仅支持文本文件。

JAVA IO包中具体的类按照其所功能维度不同,可以分为:


节点类,直接用来对文件类进行读写。

转换类,完成字符到字节之间的转化。

装饰类,节点类的装饰器类,用来增强原生节点类的能力。

1.节点类

字节流里面的节点类有:FileInputStream、FileOutputStream。

字符流里面的节点类有:FileReader,FileWriter。

2.转换类

转换类有:

InputStreamReader,以字节的方式读取文件并转换为字符。

OutputStreamWriter,将字符转化为字节输出到文件中。

3.装饰类

84740362b5d74f5aae228270cf386f38.png

4.2.节点类

字节流:

25f620d58f7a4b53ba12c6db0a47af2c.png

 字符流

d8a6bbd3b17146ae8ba89603b59bda96.png

953dd339a5b04211ae958754ab703848.png

4.3.转换类

JAVA IO中提供一个转换类来将字节流转化(包装)为字符流:

其实字符流底层就是用字节流实现的,JAVA IO中底层真正干活的始终是字节流。


b8bb8d8048ad4831ab74d889bf6e26fa.png

4.4.装饰类

字节流:

装饰原生字节流。

2f67511d0f0f4272ae29335152810a48.png

字符流:

装饰原生字符流。

f7f9f2611865404da28fb58dcd342494.png

5.序列化

序列化:将对象写入IO流中。

反序列化:从IO流中恢复对象。

意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。


前提:对象实现Serializable接口


特性:


1.如果所要序列化的对象的成员属性中含有对其他对象的引用,要求所引用的对象也必须是可序列化的(实现serializable接口),否则会序列化失败。


2.使用transient关键字修饰,可以逃离序列化,反序列化出来后被修饰的属性会是默认值。


3.对同一个对象序列化多次,只会得到一个序列化后的对象,不会得到多个,程序试图序列化一个对象时,会先检查该对象是否已经序列化过,序列化过则返回之前的序列化编号。


4.序列化存在的问题:


无法更新状态,


由于java序利化算法不会重复序列化同一个对象,如果对象的内容更改后,,再次序列化,并不会再次将此对象转换为字节序列。


5.serialVersionUID


序列化版本号,类似于乐观锁中的版本号,用来保证序列化后的字节序列没有被改动过,反序列化回来后和原来的程序是兼容的。


serialVersionUID不会自动改变,而是留给程序员手动更改的一个版本号标志位。更改了序列化文件的程序员一并更改版本号提示后来的人文件本更改过。


JAVA IO中用来支持序列化、反序列化的类是个装饰类,包装了字节流。

93739bb544d544ac817c4f1a090a314b.png

目录
相关文章
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
1月前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
52 9
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
92 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
|
2月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
45 1
|
2月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
113 1
|
3月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
251 12
|
2月前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
67 0
|
2月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
42 0
|
3月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践