JavaIO流详解

【I/O流】Input/Output:输入输出机制输入机制:允许java程序获取外部设备的数据(磁盘,光盘,网络等)。输出机制:保留java程序中的数据,输出到外部设备上(磁盘,光盘等)。【可以看出,IO的入出是以java程序为第一人称的】IO各种之间的关系先看张图:流的分类:通过不同的方法,可以对于进行分类。1.按照功能来划分:输入流:只能从中读取数

大家好,又见面了,我是你们的朋友全栈君。

【I/O流】
Input/Output:输入输出机制
输入机制:允许java程序获取外部设备的数据(磁盘,光盘,网络等)。
输出机制:保留java程序中的数据,输出到外部设备上(磁盘,光盘等)。
这里写图片描述
【可以看出,IO的入出是以java程序为第一人称的】


IO各种之间的关系

先看张图:
IO图解

流的分类:
通过不同的方法,可以对于进行分类。
1.按照功能来划分:
输入流:只能从中读取数据,而不能向其写入数据。
输出流:只能向其写入数据,而不能从中读取数据。
2.按照处理单元来划分
字节流和字符流操作的方式基本上完全相同。操作的数据单元不同
字节流:操作的是8位的字节 InputStream/OutputStream 作为字节流的基类
字符流:操作的是16位的字符 Reader/Writer 作为字符流的基类
3.按照角色进行划分
节点流:可以直接从/向外部设备读取/写入数据的流,称之为节点流,节点流也被称之为低级流。
处理流:对于已经存在的流进行了连接和封装,扩展了原来的读/写的功能。处理流也被称之为高级流。

java的io包当中包括40多个流,他们都有紧密的联系,和使用的规律,这些流都源于4个抽象基类。

InputStream / Reader :所有的输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer :所有输出流的基本,前者是字节输出流,后者是字符输出流。

流的操作步骤:

文件字节输入流读取文件内容的步骤:
* 1.创建流对象
* 2.创建一个缓存字节的容器数组
* 3.定义一个变量,保存实际读取的字节数
* 4.循环读取数据
* 5.操作保存数据的数组
* 6.关闭流

public class FileInputStreamDemo01 {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\Administrator\\Desktop\17-08-16\17-08-16.java");
// 1.创建流对象
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
// 2.创建一个缓存字节的容器数组
            byte[]buf = new byte[1024];
// 3.定义一个变量,保存实际读取的字节数
            int hasRead = 0;
// 4.循环读取数据
// while (true) { 
   
// hasRead = fis.read(buf);
// if (hasRead==-1) { 
   
// break;
// }
//// 5.操作保存数据的数组
// String msg = new String(buf, 0,hasRead);
// System.out.print(msg);
// }
            while ((hasRead = fis.read(buf))!=-1) {
                String str = new String(buf,0,hasRead);
                System.out.print(str);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
// 6.关闭流
            if (fis!=null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

文件字节输出流写入文件内容的步骤:
* 1.选择流:创建流对象
* 2.准备数据源,把数据源转换成字节数组类型
* 3.通过流向文件当中写入数据
* 4.刷新流
* 5.关闭流

public class FileOutputStreamDemo01 {
    public static void main(String[] args) {
// 1.选择流:创建流对象
        FileOutputStream fos =null;
        try {
            fos = new FileOutputStream(new File("c:\\read.txt"),true);
// 2.准备数据源,把数据源转换成字节数组类型
// String msg = "春夜喜雨\n好雨知时节,当春乃发生。\n随风潜入夜,润物细无声。";
            String msg = "\n野径云俱黑,江船火独明。\n晓看红湿处,花丛锦官城。";
            byte[] data = msg.getBytes();
// 3.通过流向文件当中写入数据
            fos.write(data, 0, data.length);
// 4.刷新流
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fos!=null) {
// 5.关闭流
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

处理流的好处:
处理流必须在节点流的基础之上,增加了效率,提高了性能,扩大的功能。
如图:
处理流的好处

1.缓冲流

  • 缓冲字节流
  • BufferedInputStream
  • BufferedOutputStream
  • 缓冲字符流
  • BufferedReader
  • BufferedWriter
    处理流内部包含了节点流,节点流决定了与其沟通的外部设备,而处理流则增加了其功能。
    缓冲流的好处:
  • 缓冲流内部包含一个缓冲区域,默认8kb,每一次程序调用read方法其实都是从缓冲区域当中读取内容,如果读取失败
  • 就说明缓冲区域当中没有内容,那么就从数据源当中读取内容,然后会尽可能读取更多的字节放入到缓冲区域当中,
  • 最后缓冲区域当中的内容,会全部返回给程序。
  • 从缓冲区读取数据会比直接从数据源读取数据的速度快,效率也更高,性能更好。
    简单说:
    没有缓存区,那么每read一次,就会发送一次IO操作;有缓存区,第一次read时,会一下读取x个字节放入缓存区,
    然后后续的read都会从缓存中读取,当read到缓存区末尾时,会再次读取x个字节放入缓存区。
    处理流处理数据和节点流处理数据的方法基本上完全相同。

2,转换流:

转换流作用:把字节流转换成字符流,可以解决出现的因为编码集和解码集造成的乱码问题。
* InputStreamReader:
* OutputStreamWriter:
* 编码:字符—–编码字符集——–》二进制
* 解码:二进制—解码字符集———》字符
* 在处理文件时,如果文件的字符格式和编译器处理格式不一样时,会出现乱码问题。比如文件字符格式GBK,
* 而编译器是UTF-8格式,那么就会产生该问题。
*
* 出现乱码问题的原因:
* 1.编码和解码字符集不一致造成了乱码
* 2.字节的缺失,长度的丢失
*
* 大部分情况下,出现乱码问题是因为中国汉字,因为中国汉字在不同的字符编码当中占据的字节数不相同,但是都占据多个字节。
* 而英文字母没有这个问题,因为英文字母在所有的字符编码当中都占据一个字节。
InputStreamReader :转换输入流–》将字节输入流转换成字符输入流
作用:为了防止文件使用字符输入流处理时出现乱码问题。

节点流:

字节数组流(内存流)
ByteArrayInputStream
ByteArrayOutputStream
因为内存输出流当中又新增的方法,不能使用多态,不能够让父类的引用指向之类的对象。
作用:可以在循环当中把所有的数据存放到统一的容器当中,然后在循环结束之后可以把容器当中所有的内容一起取出来。
注意事项:
内存流属于内存当中的资源,所以数据量不要过大,如果太大,会造成内存溢出的错误。

数据处理流:

DataOutputStream
DataInputStream
特点: 既能够保存数据本身,又能够保存数据类型(基本数据类型+String)

序列化流:

将对象转换成字节序列的过程,就是对象序列化过程。
* 将字节序列恢复为对象的过程称之为对象的反序列化。
*
* 作用:保留对象(引用数据类型数据的)类型+数据。
*
* 序列化流 :输出流 ObjectOutputStream writeObject()
* 反序列化流: 输入流 ObjectInputStream readObject()
*
* 注意事项:
* 1。先序列化然后在反序列化,而且反序列化的顺序必须和序列化的顺序保持一致。
* 2.并不是所有的对象都能够被序列化。只有实现了Serializable接口的类的对象才能够被序列化。
* 对象当中并不是所有的属性都能够被序列化。
*
* 对象序列化的主要用途:
* 1.把对象转换成字节序列,保存到硬盘当中,持久化存储,通常保存为文件。
* 2.在网络上传递的是对象的字节序列
*
* 对象序列化的步骤:
* 1.创建对象输出流,在构造方法当中可以包含其他输出节点流,如文件输出流。
* 2.把对象通过writeObject的方式写入。
*
* 对象反序列化的步骤:
* 1.创建对象输入流,在构造方法当中可以包含其他的输入节点流,如文件输入流
* 2.通过readObject()方法读取对象。

serialVersionUID :序列化版本id
* 作用:从字面角度看,就是序列化版本号。凡是实现了Serializable接口的类,
* 都会有一个默认的静态的序列化标识。
*
* 1.类在不同的版本之间,可以解决序列化兼容问题,如果之前版本当中在文件中保存对象,
* 那么版本升级后,如果序列化id一致,我们可以认为文件中的对象依然是此类的对象。
*
* 2.如果类在不同的版本之间不希望兼容,但是还希望类的对象能够序列,那么就在不同版本中
* 使用不同的序列化id。
*
* transient :当类中有属性不想被序列化,那么就使用这个修饰符修饰。


File类:

  1. File类的由来:File类的出现弥补了IO流的不足,IO只能够操作数据,但是不能够对文件的信息做操作,操作文件必须使用File类。

    -功能:

    1. 可以将文件或者文件夹在程序当中分装成对象。
    2. 方便对于文件或者文件夹当中的属性信息进行操作。
    3. File类通常通过构造函数作为参数传递到流的对象当中。
  2. File类的常用方法介绍:
    1.构造方法:
    File(String pathname):这个构造可以将已存在的或者不存在的文件或者文件夹封装成File的对象,pathname即文件的的路径。
    File(File parent,String child):parent为child文件所在的路径。
    File(String parent,String child) :
    【code】
    File f6 = new File (“c:\java”,”jre7”);
    //file的toString方法重写了,封装的地址是什么就打印什么
    //’/’和’\’都是目录分隔符,在其他系统当中目录分割符可能发生变化,这个写法不利于跨平台操作
    //最好使用File当中提供的字段separator进行分割。

    2.创建文件相关函数:
    createNewFile():创建相关文件。并返回布尔值
    createTemFile():在默认临时文件目录当中创建一个空文件,程序运行结束后就不存在了。
    mkdirs():创建目录,如果你写的目录的父目录不存在。他会帮你创建好。

    3,删除文件相关函数:
    delete():删除空目录或文件(ps只能是空目录)
    deleteOnExit():在虚拟机终止时删除文件。

    4.判断:
    exists() :判断文件或者文件夹是否存在。
    canExecute() :判断文件是否可执行,和操作系统相关。
    canRead() :判断文件是否可读
    canWrite() :判断文件是否可写
    equals(Object obj) :测试此抽象路径名与给定对象是否相等。
    isAbsolute() :测试此抽象路径名是否为绝对路径名。
    isDirectory() :判断file对象是否表示文件夹。
    isFile() :判断file对象是否表示文件
    isHidden() :判断file对象是否是隐藏文件

    5.获取file对象属性信息的方法:
    getAbsoluteFile() :返回此抽象路径名的绝对路径名形式。
    getAbsolutePath() :返回此抽象路径名的绝对路径名字符串。
    getCanonicalFile() : 返回此抽象路径名的规范形式。
    getCanonicalPath() :返回此抽象路径名的规范路径名字符串。
    getPath() : 将此抽象路径名转换为一个路径名字符串。
    getName() : 返回由此抽象路径名表示的文件或目录的名称。
    getParent() :返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
    getParentFile() :返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
    getTotalSpace() :返回指定路径的全部空间的字节数
    getFreeSpace() :返回此抽象路径名指定的分区中未分配的字节数。
    getUsableSpace() : 返回此抽象路径名指定的分区上可用于此虚拟机的字节数。
    renameTo(File dest) :重新命名此抽象路径名表示的文件。剪切

    6.设置文件信息的方法:
    setExecutable(boolean executable) :设置文件可执行的方法
    setLastModified(long time) :设置此抽象路径名指定的文件或目录的最后一次修改时间。
    setReadable(boolean readable) :设置文件是否可读
    setReadOnly() :设置文件是否只读
    setWritable(boolean writable) :设置文件是否可写

    7.获取文件的常规信息的方法:
    lastModified() :获取文件最后一次被修改的时间
    length() : 返回由此抽象路径名表示的文件的长度。

    8.操作文件夹的相关方法
    list(): 把文件夹当中包含的目录和文件都存放到字符串数组当中。
    listFiles():列举文件夹当中包含的目录和文件,存放到File数组当中。
    listRoots():列出可用的文件系统根。
    9.文件过滤器: fleater

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125265.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • SQL Server——数据库创建及修改[通俗易懂]

    SQL Server——数据库创建及修改[通俗易懂]文章目录一、SQL Server数据库的相关概念1、逻辑数据库2、物理数据库二、SQL Server数据库的基本操作1、使用SQL Server Management Studio (创建/修改/删除)数据库2、使用SQL语句(创建/修改/删除)数据库【数据库文件的类型】【主要】【次要】【事务日志】文件组1.主文件组(PRIMARY)2.用户定义文件组【文件组特性】一、SQL Server数据库…

  • 主宰操作系统的经典算法

    主宰操作系统的经典算法此篇文章带你梳理一下操作系统中都出现过哪些算法进程和线程管理中的算法进程和线程在调度时候出现过很多算法,这些算法的设计背景是当一个计算机是多道程序设计系统时,会频繁的有很多进程或者线程来同时竞争CPU时间片。那么如何选择合适的进程/线程运行是一项艺术。当两个或两个以上的进程/线程处于就绪状态时,就会发生这种情况。如果只有一个CPU可用,那么必须选择接下来哪个进程/线程可以运行。操作系统中有一个叫做调度程序(scheduler)的角色存在,它就是做这件事儿的,调度程序使用的算法叫做调度算

  • UPX脱壳总结

    UPX脱壳总结我近期研究了一下UPX壳的脱壳方法,下面给出脱壳示例:UPX作为一款元老级PE加密壳,在以前的那个年代盛行,著名病毒【熊猫烧香】就是使用这款加密壳。现在我们一起来脱UPX壳来揭开它的神秘面纱。首先,PEiD载入含UPX壳的程序,结果如下:UPX0.89.6-1.02/1.05-1.24->Markus&Laszlo然后用OD载入,OEP如下:

  • Python优秀开源项目Rich源码解析

    Python优秀开源项目Rich源码解析这篇文章对优秀的开源项目Rich的源码进行解析,OMG,盘他。为什么建议阅读源码,有两个原因,第一,单纯学语言很难在实践中灵活应用,通过阅读源码可以看到每个知识点的运用场景,印象会更深,以后写代码的时

  • Python 资源大全中文版[通俗易懂]

    Python 资源大全中文版[通俗易懂]Python资源大全中文版requests官方文档:http://cn.python-requests.org/zh_CN/latest/BeautifulSoup官方文档:https:/

  • windows下cmd查看端口占用情况,并关闭占用端口进程「建议收藏」

    windows下cmd查看端口占用情况,并关闭占用端口进程「建议收藏」1.netstat-ano|findstr”3333″假设返回情况如下:C:\Users\Administrator>netstat-ano|findstr”3333″UDP0.0.0.0:3333*:*85242.tasklist|findstr”8524…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号