Java之IO流详解

时间:2022-08-27 14:20:03

IO流

Input/Output 完成输入/输出

应用程序运行时——数据在内存中  ←→ 把数据写入硬盘(磁带)  内存中的数据不可持久保存的

   输入:从外部存储器(硬盘、磁带、U盘)把数据读入内存。

   输出:从内存中把数据写入外部存储区(硬盘、磁带、U盘)中,这样就可以保证:即使程序退出了,数据依然不会丢失。

File — 代表磁盘上的文件或目录。

  ●  listRoots() :列出磁盘上所有的根目录

  ● exists:判断是否存在

  ● mkdir:创建目录

  ● listFiles():列出当前目录下所有的文件和子目录

  ● listFiles(FileFilter filter) :列出当前目录下符合指定条件的文件和子目录

  ● File[] listFiles(FilenameFilter filter) :列出当前目录下符合指定条件的文件和子目录

    列出某个磁盘所有的文件 —— 这就要用到递归

--------------------->>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<-----------------------

IO流 File的特征:只能访问磁盘上的文件和目录  它无法访问磁盘上的内容 如果要访问文件的内容,必须使用IO流。

--------------------->>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<-----------------------

流的分类:

按流的方向来分(从程序所在的内存的角度来看):

  —输入流:把外部输入读入当前程序所在内。

  —输出流:把当前程序所在内存的数据输出到外部

按流处理得数据来分:

  — 字节流:它处理数据单元是字节(8bit),适应性广、功能强大。

  — 字符流:它处理的数据单元是字符。通常来说它主要处理文本文件,   它在处理文本文件时,比字节流更方便。

按流的角色来分:

  — 节点流:直接和一个IO的物理节点(磁盘上的文件、网络)关联。

  — 包装流(处理流):以节点为基础,包装之后得到的流。都继承FilterXxx等基类。

流的概念模型

输入流:负责把外部的数据、读入到程序所在的内存。

缓存流

  外部存储器的速度比内存速度要慢,外部存储器的读写与内存的读写并不同步!!

    ——通过缓存就可以解决这种不同步的问题

  反正你把流用完了,别调用了flush(把缓存中的内容刷入实际的节点)方法  调用close()也可以

    ——系统会在关闭之前,自动刷缓存。

IO流一共涉及到40多个类

  字节流                                                        字符流

InputStream                  OutputStream                     Reader            Writer(抽象)根基类不会拿来使用

FileInputStream             FileOutputStream                  FileReader           FileWriter(访问文件)

ByteArrayInputStream    ByteArrayOutputStream       CharArrayReader   CharArrayWriter(数组)

PipedInputStream           PipedOutputStream             PipedReader     PipedWriter(访问管道)

   -->(两个进程之间通信的时候)

                                  SringReader     StringWriter(访问字符串)

BufferInputStream           BufferOutputStream           BufferReader     BufferWriter(缓存)

  --> 性能得到提升

FilterInputStream             FilterOutputStream            FilterReader      FilterWriter(过滤、抽象)

PrintStream            PrintWriter(打印)

InputStreamReader          OutputSteramWriter(转换)      DataInputStream      DataOutStream   (特殊)

  所有以InputStream结尾的都是【字节输入流】

  所有以OutputStream结尾的都是【字节输出流】

  所有以Reader结尾的都是【字符输入流】

  所有以Writer结尾的都是【字节输出流】

-------------------------------->>>>>>>>>>>>>><<<<<<<<<<<<<<<<-------------------------------------------------

节点流直接与IO节点关联

——IO节点很多:键盘、网络、文件、磁带....

把节点流包装成过滤流:消除节点流的差异:

而且PrintStream的

      PrintStream ps = new PrintStream(fos);//fos为文件

      ps.println("我有一个房子");

      ps == System.out   都属于PrintStream的属性

过滤流,建立在节点流的基础之上。

  过滤流的好处:

    — 消除底层节点之间的差异

    — 使用过滤流的方法执行IO更加便捷

     FileOutPutStream → PrintStream

     FileWiter → PrintWiter

    如果已经知道要读的内容是字符内容,就可以按如下的方式转换

    InputStream       → InputStreamReader     →     BufferedReader

    FileInputStream  fis = new InputStreamReader("ReadFile.java");

    InputStreamReader     reader = new InputStreamReader(System.in);

    BufferedReader     br = new BufferedReader(reader);

    换为一行:

    BufferedReader br = new BufferedReader(

                             new InputStreamReader(

                             new InputStreamReader("ReadFile.java")));

-------------------------------->>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<----------------------------------------

DataInputStream与DataOutputStream

  它们是两个特殊的流

    ——它们并不是节点流,是过滤流(建立在已有IO的基础之上)

    —— 它们只要增加一些特定的方法来读取特定的数据。

重定向标准输入输出:

  System.in —  标准输入。通常代表键盘

  System.out — 标准输出。通常代表屏幕

  System.setOut() —— 可以将标准重定向到另一个输出流

  System.setIn() —— 可以将标准重定向到另一个输入流

  System.setOut(new PrintSteam("out.txt")) ;  可以将输出的内容直接放入文件...

  System.setIn(new FileInputStreamSteam("out.txt")) ;  可以从文件读取内容并输出

Java虚拟机读取其他进程的数据:

Java如何启动其他进程:Runtime实例.exec()

该方法的返回值是一个Process对象

    Process — 代表一个进程

      进程就是运行中的应用程序。

    Runtime runtime = Rintime getRuntime();

    //启动javac应用程序返回

    Process proc = runtime.exec("java.exe");

    //要得到javac应用程序输出的内容,此处应该用输入流?还是输出流

    //对javac来说,是输出;但对于我们应用程序来说,用输入流

    InuputStreamReader reader =  new    InuputStreamReader (proc.getErrorStream());

    BuffereReader br = new BuffereReader(reader);  String line =null;

    System.out.println("编译出错,错误信息如下");  //控制BufferedReader每次读取一行

    while((line = br.readLine()) != null)  {

      System.out.println(line);

    }

StringWriter sw = new StringWriter();

sw.Writer(line);

RandomAccessFile — 随机(任意)访问

  Random — 想访问文件的那个点,就访问文件的哪个点(任意)。

    特征:A。即可读,又可写、还可追加。------>   【相当于DataInputStream与DataOutputStream】合体   RandomAccessFile它不会覆盖原有的文件内容。               B。只能访问文件!!这就是它的局限性。  创建RandomAccessFile,需要指定读(r)、写(rw)模式。 体现它的“random【任意】”性的方法是:

    ● seek(long pos) — 用于把记录指针移动到任意位置,想要访问哪个点就访问哪个点   一开始,它的记录指针位于文件的开始位置。

    使用RandomAccessFile来追加文件内容:1.把记录指针移动到最后; 2.执行输出即可

    使用RandomAccessFile来插入文件内容:1.把记录指针移动到指定位置; 2.从当前位置到文件结尾的内容,先读取、并保存 3.输出要插入的内容。4.输出之前保存的内容。

IO体系------>>>

------------------------------------->>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<-------------------------------------------

Java传统IO的基本体系:

      字节输入流                   字节输出流                   字符输入流          字符输出流

      InputSteam                OutputStream                 Reader              Writer

访问文件  FileXxx

访问数组  ByteArrayXxx              CharArrayXxx

访问管道  PipedXxx

访问字符串   StringXxx

过滤流     FileterInputStream      FileterOutputStream     FileterReader      FilterWriter

缓冲流    BufferedXxx

打印流               PrintStream                 PrintWriter

转换流                          InputStreamReader    OutputStreamWriter

特殊流  DataInputStream         DataOutputStream

    ObjectInputStream      ObjectOutputStream

RandomAccessFile  —  1.它只能访问文件。相当于DataInputStream和DataOutputStream组合

            2.任意,由seek(int pos)。

------------------------------------->>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<-------------------------------------------

序列化  java对象(内存)  ←→ 二进制流

目的:  A。在有些时候,需要把对象存储到外部存储中持久保持

         B。在有些时候,需要把对象通过网络传输。

        ......

● 可序列化的对象,Java要求可序列化的类实现下面两个接口的任意之一:

  — Serializable:接口只是一个标记性的接口,实现该接口无需实现任何方法。

   — Externalizable 实现该接口要实现方法。

● 序列化的IO流:

  ObjectInputStream — 负责从二进制流“恢复”对象。readObject

  ObjectOutputStream — 负责把对象保存到二进制中。writeObiect

● 引用变量的序列化机制

   A。引用变量所引用的对象的所有属性的类都应该是可序列化的。

   B。序列化的底层机制:

    (1)每序列化一个对象,都会给为该对象设置一个编号

    (2)如果程序第一次序列化某个对象。系统会真的将该对象序列化、并输出。

    (3)如果要序列化的对象是之前已经序列化的。此时系统只输出一个编号。   这种序列化机制,就是为了保存磁盘里的二进制与内存中的对象是对应的。

● transient — 修饰符。

  用于修饰实例成员变量。(不能与static同时使用!)

    transient 用于执行被修饰的Field不会被序列化。

    static修饰的是类变量 — 序列化机制负责序列化实例。

    static修饰的类变量存储在类信息中,并不是在存储在对象里    ——因此static修饰的类变量不会被序列化!

为什么要用transient?

  对于一些敏感信息,比如银行卡帐号、密码,就不应该被序列化出来,此时就可以通过transinet来修饰这些属性。

● 完全自定义的序列化

  对于一些敏感信息,可以使用transient来阻止它们进行序列化。

  但将一些属性完全阻止在序列化之外,有时候也并不完善。

此时可以借助与“定制序列化”,

  自定义序列化机制,为序列化类增加如下两个方法:

                        --> 系统会调用这两个方法完成实际的序列化

 private void writeObject(java.io.ObjectOutputStream out)
throws IOException
{
out.writeUTF(account);//自然也可以做更复杂的加密
out.writeUTF(new StringBuilder(password).reverse().toString)
} private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException
{
//恢复的顺序要与之前写入的顺序保持一致
this.account = in.readUTF();
this.password = new StringBuilder(in.readUTF().reverse().toString());
}

● 版本号

  当我们的类经常使用时,有时候系统无法确定“反序列化”的class文件是否还正确。

  建议显示为“可序列化”指定一个版本号。

  /*即使你不指定,系统也默认一个版本号,但不稳定*/

  seralver.exe — 专门用于查看该类的版本号

  seralver — show:显示图形化界面

  seralver 完整的类名:显示制定的类的版本号

   定义版本号:十分简单:  static final long serialVersionUID = 50L;

   ——  自定义的版本号的好处:更稳定。     只有当我们修改了类定义时,可由程序员显示地控制改变版本号。

Java 7  传统的Java里,只有一个File类,即代表文件,又代表目录。

===  Arrays       Object  、Collections 、Paths 、Files    ====

Path — 接口,专门代表了一个平台无关的路径。

Paths — 工具类。所有的方法都是static的。

Files — 操作文件的工具类。   提供了大量的方法来操作文件。

------------------------------------->>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<-------------------------------------------

Java之IO流详解的更多相关文章

  1. JAVA中IO流详解

    IO流:数据传输是需要通道的,而IO流就是数据传输的通道. IO流可以形象的比喻为运送货物的传输带. IO流的分类: ①根据操作的数据类型的不同可以分为 :字节流与字符流. ②根据数据的流向分为:输入 ...

  2. java之IO流详解(一)

    IO流的分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流  InputStream 字节输出流  OutputStream 字符流 字符输入流  Reader 字 ...

  3. java之IO流详解(二)

    好了,昨天讲了字节流,现在我们就来讲字符流吧... 字符流可以这样理解,字符流 = 字节流 + 编码表,目的是为了更好的操作中文字符(注:字符流只可以可以操作字符类型的文件,不能操作影音图像文件,要操 ...

  4. 基于JavaSE阶段的IO流详解

    1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...

  5. Java io流详解四

    转载地址:http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html 写在前面:本文章基本覆盖了java IO的全部内容,jav ...

  6. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  7. Java io流详解二

    原文地址https://www.cnblogs.com/xll1025/p/6418766.html 一.IO流概述 概述: IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间 ...

  8. Java io流详解一

    原文地址http://www.cnblogs.com/xdp-gacl/p/3634409.html java基础学习总结——流 一.JAVA流式输入/输出原理

  9. 《Java基础知识》Java IO流详解

    Java IO概念 1. 用于设备之间的数据传输. 2. Java 将操作数据流的功能封装到了IO包中. 3. 数据流流向分:输入流和输出流,操作对象为文件. 4. 流按照操作数据分:字节流(通用)和 ...

随机推荐

  1. split拆分数组长度问题

    package test; public class test1_format { public static void main(String[] args) { System.out.printl ...

  2. GitHub 基本常用知识解答2

    1.如何拥有一个Git仓库的两种途径 (1)在已有的目录中,初始化一个新的. (2) 比如一个新的项目,或者一个已存在的项目,但该项目尚未有版本控制.如果你想要复制一份别人的项目, 或者与别人合作某个 ...

  3. Vue&period;2&period;0&period;5-组件

    什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能.在 ...

  4. 转:十九、Java的接口及实例

    http://blog.csdn.net/liujun13579/article/details/7736116 一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合 ...

  5. Java第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  6. linux的定时任务服务crond(crontab)服务

    1,Crond: Crond是linux系统中用来定期执行命令或指定程序任务的一种服务或者软件.(Centos5以后默认存在) 当优化开机自启动的时候,第一个就是crond. Crond服务默认情况( ...

  7. 如何解决git&equals;&equals;&equals;&equals;push 过程中出现的。error&colon; failed to push some refs

    当我们在利用git  push 文件到仓库时出现了一下问题: ! [rejected] master -> master (fetch first)error: failed to push s ...

  8. springboot中使用freemarker生成word文档并打包成zip下载(简历)

    一.设计出的简历模板图以及给的简历小图标切图         二.按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件:    三.直 ...

  9. 2&period; github创建 git仓库,克隆,拉取和推送操作(所有的git命令前提是一定在当前项目目录下)

    步骤: 1.点击小猫,回到初始页面 2.点击start a project,首先会出现一个验证email地址(我们注册的时候,有一个email输入,进去邮箱验证一下) 3.重新点击start a pr ...

  10. 生成pyd文件时提示&OpenCurlyDoubleQuote;Unable to find vcvarsall&period;bat”的问题

    本文内容 Unable to find vcvarsall.bat的问题描述 问题分析 总结 一.问题描述 我们在windows下通过pip安装一些外部Python 模块(比如,pycrypto)时通 ...