1. IO流的概述

理论部分

简单概括就是文件的输入与输出。

磁盘中文件的东西放到内存中的这个过程称为输入(Input)或称读(read),由于这个输入的过程会有数据的流动,就有了输入流(InputStream)这个概念

内存中的文件的东西放到磁盘中去的这个过程称为输出(Output)或称写(Write),输出过程的数据流动称为输出流(OutputStream)

(不难看出不管是输入流还是输出流,都是以内存为参照物的)

下面画图描述:

IO这样看的话就不难理解了,I:Input       O:Output

IO流的分类

1)按流的方向:内存为参照物分为:

输入流(InputStream):往内存中去

输出流(OutputStream):往内存中出来

2)读取数据的方式不同:

字节流:通过一个一个字节对数据进行读取或写入(可以说可用性很强)可用于文本文件,图片,声音文件,视频等......

字符流:一个一个字符对数据进行读取或写入,一般用来读取纯文本文件(word文本不能称为纯文本,不可以对其进行读取与写入)

IO流的“四大家族”

字节流:java.io.InputStream (读操作使用流)

java.io.OutStream(写操作使用流)

字符流:java.io.Reader(读取器)

java.io,Writer  (写入器)

为什么这样称呢?因为待会需要掌握的就是他们的子类,并且他们也有一些共同点:

  • 这四个类都是抽象类(抽象类不能实例化)
  • 这四个类都实现了java.io.Closeable接口——那么他们就都有close()这个方法,可以用来关闭流
  • 输出流中(OutStream和Writer)都实现了Flushable这个接口——那么就都有flush()这个方法,用来刷新该流的缓存,避免丢失数据(Reader和InputStream没有实现这个接口)

注意:在Java中只要”类名“以Stream结尾的都是字节流,以”Reader/Writer"结尾的都是字符流

需要掌握的流(16个)

文件专属:                                                                     数据流专属:

FileInputStream                                                              DateInputStream

FileOutputStream                                                           DateOutputStream

FileReader                                                                      标准输出流:

FileWriter                                                                         PrintWriter

缓冲专属:                                                                         PrintStream

BufferedReader                                                               转换流(将字节流转换成字符流):

BufferedWriter                                                                 InputStreamReader

BufferedInputStream                                                       OutputStreamWriter

BufferedOutputStream

对象专属流:ObjectInputStream        ObjectOutputStream

(这里说说文件专属那四个流,其他的用起来都差不多)

FileInputStream

需要知道的方法:

构造方法:

FileInputStream(File file)throws FileNotFoundException

FileInputStream(String name)throws FileNotFoundException  通过打开一个实际文件的连接来创建一个FileInputStream,这个name就是指那个文件的路径

方法:

int read()  从此输入流中读取一个数据字节(一次一个字节,内存与磁盘交互太频繁了,浪费资源,这个一般不用

int read(byte[] b)  从此输入流中将最多b.length个字节的数据都读入到一个byte数组中(这个常用)(看源声明可以知道,这个返回值是从流中读到的字节个数,没读到会返回-1)

void close()

int available()  返回还没有读取到的字节数

long skig(long n)  从输入流中跳过并丢弃n个字节的数据

实操:

avaliable函数能怎么用呢,起初是没有读取数据的,所以流对象.avaliable()就是文件中的数据字节长度,那我们之间new byte[对象名.avaliable]之间读数据一次不就行了吗。

注意:由于byte数组不能太大,所以使用时得注意,一俩mb的文档或图片啥的还是可以的。

关闭文件也可以用try with resources,把定义文件流对象写在try()这个括号里,运行完try会自动关闭(资源是一定要关的,防止丢失)

FileOutputStream

需要知道的方法:

构造方法:

FileOutputStream(File file)throws FileNotFoundException

FileOutputStream(File file,boolean append)

FileOutputStream(String name)throws FileNotFoundException  清空文件再进行写操作

FileOutputStream(String name,boolean append)  表示是否在原文件后追加内容

方法:

void close()

void write(int b)  将指定字节写入到此文件输出流

void write(byte[] b)  将b.length个字节从byte数组里面读入到文件中

void write(byte[] b,int off,int len)  将从off位置开始的len个字节写入文件输出流

实操:

学会了FileInputStream 和 FileOutputStream 俩流后(这俩可是万能流),那我们是不是可以试着拷贝一个文件啊?

实操(将xpp.txt中的内容,拷贝到xpp2.txt里):

那肯定就有人问能不能拼接图片呢?我试了下,就单纯这样直接往一图片后写入一张图片,是拼不了的,应该是要将拷贝图片的那个图片进行压缩,那样就可以使得俩图片拼接了。但单纯拷贝图片这还是挺快挺方便的。

FileReader

需要知道的方法:

构造方法:

FileReader(File file)

FileReader(String fileName)

方法:

void close()

int read()  读取单个字符

int read(char[] cbuf)  将字符读入数组

long skig(long n)  跳过字符

实操:

FileWriter

需要知道的方法:

构造方法:

FileWriter(File file)

FileWriter(File file,boolean append)

FileWriter(String fileName)

FileWriter(String fileName,boolean append)

方法:

close()

flush()

void write(char[] cbuf)

void write(int c)  //写入单个字符

void write(String str)
void write(String str,int off,int len) //输入字符串的某一部分

(有没有发现这“四大家族”的方法差不多,其实其他的也差不多,读数据的和写数据分类掌握会蛮轻松的)

实操:

有没有发现这个流提供的方法很适合写入东西进文本

(运行几次它就写入几次,想无限次复杂粘贴一个东西,暂时想不到比这快的)

使用学习的这俩个流进行拷贝练习:

注意:

1. 流进行操作完后一定要关闭,练习时候可以学会在finally关闭,也可以用try with resources进行操作,在try()括号里进行流的创建

2. 记事本可以编辑的文本都是普通文本,所以.java文本也是可以进行拷贝的(当有相同的代码不愿写想进行拷贝时候,就可以用了,当然复制粘贴还是yyds)

3. 当你想写入的文件名不存在的时候,会自动创建一个与你写的文本名一致以及类型一致的文本

如果嫌创建byte数组和char数组进行操作不方便,可以去看看BufferedReader和BufferedWriter流这俩虽然没前面操作运行起来那么快,但是BufferedReader流里面有个readline()可以读取一行的方法很方便,下面写一下,其他流都有共同点的,掌握起来很方便。

package com.io;
import java.io. *;public class BufferedReaderText {public static void main(String[] args) throws Exception{//这里创建一个文件字符输入流,注意该流是Reader的子类FileReader in1 = new FileReader("D:\\Java\\eclipse\\xpx.java");//构建一个缓冲字符输入流  它的构造方法:BufferedReader(Reader in) BufferedReader bin = new BufferedReader(in1);//String s = bin.readLine();//读一行//System.out.println(s);//读取行的这个方法没有读取文本里的换行符String s = null;while((s = bin.readLine())!=null)System.out.println(s);bin.close();}
}

(这里异常比较懒没进行处理,大家写代码别学我)(看完是不是觉得这样写比上面简单多了)

学无止境嘛~大家可以去了解了解,这里提了“四大家族”,其他所需要掌握的操作其实也差不多。

Java IO流的“四大家族”相关推荐

  1. JAVA~~IO流和文件

    ​​​​​​​​ Io流的分类 有多种分类方式: 一种方式是按照流的方向进行分类: 以内存作为参照物, 往内存中去,叫做输入(Input).或者叫做读(Read). 从内存中出来,叫做输出(Outpu ...

  2. java io流大全_Java IO流系统整理

    Java IO流的分类 Java中的流,可以从不同的角度进行分类. 按流向分类: 输入流: 程序可以从中读取数据的流. 输出流: 程序能向其中写入数据的流. 按数据传输单位分类: 字节流:以字节(8位 ...

  3. java io流 教程_Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...

  4. 关于Java IO流学习总结

    一.IO流的三种分类方式 1.按流的方向分为:输入流和输出流 2.按流的数据单位不同分为:字节流和字符流 3.按流的功能不同分为:节点流和处理流     二.IO流的四大抽象类: 字符流:Reader ...

  5. Java IO流大闯关--IO流的常用实现类

    这个系列的博客主要是对Java高级编程中IO流相关的知识点做一个梳理,内容主要包括File类.IO流原理及流的分类.文件流.缓冲流.转换流.标准输入输出流.打印流.数据流.对象流.随机存取文件流.NI ...

  6. Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter

    Java IO流学习总结四:缓冲流-BufferedReader.BufferedWriter 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/det ...

  7. Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream

    Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...

  8. Java IO流思维导图

    Java IO流

  9. Java读取文件流用什么对象_使用Java IO流实现对文本文件的读写过程中,通常需要处理下列( )异常。_学小易找答案...

    [论述题]请根据第一次平时作业的选题,结合第二次课内容,自拟一个论文提纲. [单选题]在 switch ( expression )语句中, expression 的数据类型不能是 ( ) [单选题] ...

最新文章

  1. AI 商用落地为什么比互联网更难?
  2. 关于python赋值语句下列选项中描述正确的是_关于Python的分支结构,以下选项中描述正确的是()。...
  3. 【TCP/IP 协议】 TCP/IP 基础
  4. SqlServer-COMPUTE BY
  5. AOE网的关键路径的计算
  6. TCL电子港股暴涨10% 股价创5年新高
  7. 【C/C++】C++98基础上的C++11新特性
  8. 20200427 FTL 模板语言参考 梳理 (常用)
  9. java中POJO类为什么要实现序列化
  10. PS|如何将Adobe Photoshop(PS)完全卸载
  11. [置顶] 关于Android图形系统的一些事实真相
  12. 让你的照片动起来!四种方法制作照片音乐视频
  13. python KMP算法查找子字符串
  14. 要不是这些沙雕插件,我早就被公司开除了。
  15. c++生成随机数详解(包含可执行代码)
  16. 使PC端网页宽度自适应手机屏幕大小
  17. SpringBoot发送html邮箱验证码
  18. [笔记]快乐的Linux命令行《二》文件系统中跳转
  19. CentOS7转发非3306端口到3306端口
  20. 【python趣味小代码】为你女(男)神打造专属素描照,hhhhhh

热门文章

  1. 比色皿对检测实验结果差距这么大
  2. 基于改进樽海鞘群寻优SVM的土壤含水量预测算法
  3. SpringCloud Gateway RequestRateLimiter
  4. IDEA黄色警告解析集锦 - 类名【xxx】应以Impl结尾
  5. 30个珍藏的程序员超实用自学网站,干货!
  6. TCP/IP的工作原理
  7. D3D中基本立体面的绘制
  8. nagios添加监控模块
  9. AMD(ATI)Mobility笔记本显示驱动修改工具DH Mobility Modder.NET 1.2.1.0正式版
  10. Flutter模型与json的相互转换