一、IO流要明确的几点

(1)明确要操作的数据是数据源还是数据目的(是读还是写)

        源/读

        InputStream    Reader

        目的/写

        OutputStream        Writer

(2)明确操作设备上的数据是字节还是文本

        源/读

        字节:InputStream

        文本:Reader

        目的/写

        字节:OutputStream

        文本:Writer

(3)明确数据所在具体地点

        设备:

        硬盘:文件File开头

        内存:数组、字符串

        硬盘:System.in

        网络:Socket

        对应目的地的设备

        硬盘:文件File开头

        内存:数组、字符串

        硬盘:System.out

        网络:Socket

(4)明确是否需要额外功能

        需要转换——转换流 InputStreamReader、OutputStreamWtiter

        需要高效率——缓冲流 Bufferedxxx

       对象序列化——ObjectInputStream、ObjectOutputStream

IO流主要分类:

二、File概述

 至于IO流,也就是输入输出流,从文件出发到文件结束,至始至终都离不开文件,所以IO流先从文件File类讲起。

File跟流无关,File类不能对文件进行读和写也就是输入和输出!
File主要表示类似D:\\文件目录1D:\\文件目录1\\文件.txt,前者是文件夹(Directory)后者则是文件(file),而File类就是操作这两者的类。

2.1  常用方法(建议熟记)

绝对路径:一个完整的路径,以盘符开头,例如  F://Java//aaa//b.txt。也可以用单斜杠 /
相对路径:一个简化的路径,不以盘符开头,例如  //aaa//b.txt。也可以用单斜杠 /

以上方方法测试,代码如下【注意测试以自己的电脑文件夹为准】:

public class Test {public void creat(File file)throws Exception{if (!file.exists());//判断文件是否存在file.createNewFile();//创建新的文件}public void show(File file){if (file.exists()){//如果文件存在if (file.isFile()){//如果是文件 输出文件信息System.out.println("文件名称:"+file.getName());//文件名//文件绝对路径System.out.println("文件绝对路径:"+file.getAbsolutePath());System.out.println("文件相对路径:"+file.getPath());//相对路径System.out.println("文件大小:"+file.length());//文件字节大小}if (file.isDirectory()){//测试文件是否是目录System.out.println("此文件是目录");}}else{System.out.println("此文件不存在");}}public void delete(File file){if (file.exists()){//如果文件存在file.delete();//删除文件System.out.println("文件已删除");}}public static void main(String[] args)throws Exception {File file=new File("a.txt");//文件名Test te=new Test();//创建对象  调动方法te.creat(file);//创建文件方法te.show(file);// 展示文件信息方法}
}

2.2文件目录创建事项

1.如果目录可达,可以直接用 createNewFile() 创建文件,也可用 mkdir() 创建目录

2.如果父级目录不存在,需要先用getParentFile() 获取父级File对象,用父级对象 .mkdirs() 可以递归创建全部的父级目录

文件File的操作

增:createNewFile()     mkdir()     mkdirs()

删: delete()     deleteOnExit()

改: renameTo()

查: getName()    getPath()    getAbsolutePath()     getParentFile()     list()     liftFiles()

三、IO流的定义

        读文件是指把文件中的数据读取到内存中。反之,写文件就是把内存中的数据写到文件中,那通过什么读写文件呢?答案就是流。

        流是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道

我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流,流出内存的输出流。

Java中I/O操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。

1.1 IO的分类
根据数据的流向分为:输入流 和 输出流。

划分流的方式:按流向区分、按处理数据单元划分

1.流向区分:输出流:OutputStream 和 Writer作为基类

输入流:InputStream 和 Reader作为基类

2.处理数据单元划分: 字节流:字节输入流InputStream基类

字节输出流OutputStream基类

字符流:字符输入流Reader基类

字符输出流Writer基类

字节流是8位通用字节流,字符流是16位 Unicode 字符流

四、字节流

        字节输入流的基本方法:

        InputStream常用方法:抽象类---基类 (读)

1、 public void close() :关闭此输出流并释放与此流相关联的任何系统资源。

2、int available():可以从输入流中读取的字节数目

3、int read():从输入流一个字节一个字节的读,返回的是该字节的整数表示形式,如果读到了输入流的末尾,返回-1
4、int read(byte[ ] b):从输入流读取若干字节,把这些字节保存到数组b中,返回的是读取的字节数,如果读到了输入流的末尾,返回-1
5、int read(byte[ ] b,int off,int len):从输入流读取若干字节,把这些字节保存到数组b中,off指的是字节数组中开始保存数据的起始下标;len 指定读取的字节数目。如果读到了输入流的末尾,返回-1

使用步骤:

1.引入相关的类

2.构造文件输入流 FileInputStream 对象

3.读取文本文件的数据

4.关闭文件流对象

不抛出异常的方法:try catch

抛出异常的方法:throws IOException

OutputStream字节输出流(抽象类---基类) (写)

常用方法:

1、void write(int c): 往输出流中写入一个一个的字节

2、void write(byte[ ] buf): 往输出流中写入一个字节数组

3、void write(byte[ ] b,int off,int len): 往输出流中写入一个字节数组,off代表开始从字节数组的off位置开始往外写,len代表往外写len长度的字节

4、void colse(): 关闭输出流

5、void flush(): 强制把缓冲区的数据写到输出流中

FileOutputStream创建构造方法:

FileOutputStream(File file)

FileOutputStream(Stream name)

FileOutputStream(Stream name,boolean append) 可以在末尾追加内容

前两种构造方法在向文件写数据时将覆盖文件原有内容

创建FileOutputStream实例时,如果相应的文件不存在,则会自动创建一个空的文件

使用步骤:

1.引入相关的类

2.构造文件输出流 FileOutputStream对象

3.把数据写入文本文件

4.关闭文件流对象

不抛出异常的方法:try catch

抛出异常的方法:throws IOException

五、字符流

字符流的由来:因为数据编码的不同,因而有了对字符进行高效操作的流对象,字符流本质其实就是基于字节流读取时,去查了指定的码表,而字节流直接读取数据会有乱码的问题(读中文会乱码)

大纲:

字符输入流(Reader):1.FileReader 、 2. InputStreamReader(解决中文乱码) 、 3.BufferedReader(提高效率)、4.BufferedReader读取包含中文的文件文本时,需要使用InputStreamReader

字符输出流(Writer):1.FielWrtier 、 2. Writer 子类 OutputStreamWriter(解决中文乱码) 、 3.BufferedWriter(提高效率)

1.1

字符输入流(Reader):

以Reader为基类 FileReader,Reader的常用方法以及作用,字符流FileReader的创建方式

1、public void close() :关闭此流并释放与此流相关联的任何系统资源。
2、 public int read(): 从输入流读取一个字符。
3、 public int read(char[ ] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中

FileReader类是Reader的孙子类,new FileReader类对象变成实际的字符输入流对象,从而对文件操作

1、FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象。
2、 FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的字符串名称。

FileReader读取文件流程

1.引入资源 IO流包

2.创建FileReader对象

3.调用相应read()读取文件

4.关闭字符流

1.2

中文乱码原因:文件与环境编码不一致

获取本地平台的编码:

System.out.println(System.getProperty("file.encoding"));

        字符存入文件是按照字符编码格式编码后存储的

解决方案:(把一个字节流包成一个字符流,同时指定编码格式)

1.手动调整文件编码格式与程序环境编码一致,弊端:可能会导致代码乱码

2.使用Reader子类 InputStreamReader

① InputStreamReader(InputStream in)

②InputStreamReader(InputStream in,Stream charsetName)

Stream charsetName:字符编码格式

BufferedReader类:提高字符流读取文本文件的效率

常用构造方法:BufferedReader(Reader in)

子类BuferedReader特有方法: readLine()

BufferedReader读取包含中文的文件文本时,需要使用 InputStreamReader

示例代码:

1.3 字符输出流 Writer及其子类

Writer常用方法其作用 FileWrtier 构建及使用 OutputStreamWriter 解决中文乱码

Writer类常用方法:

1、void write(int c)         写入单个字符。
2、void write(char[ ] cbuf)        写入字符数组。
3、void write(char[ ] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
4、 void write(String str)写入字符串。
5、void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
6、void flush( ) 刷新该流的缓冲。
7、void close() 关闭此流,但要先刷新它。

FileWriter类是Writer的孙子类

覆盖原有内容:

FileWriter(File file)

FileWrtier(String name)

boolean类型的参数构造方法

FileWriter类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型

解决办法: Writer 子类 OutputStreamWriter 的常用构造方法

OutputStreamWriter(OutputStream out)

OutputStreamWriter(OutputStream out,Stream charsetName)

BufferedWriter类 和 BufferedReader类一样

提高字符流写文本文件的效率

BufferedWriter类是Writer类的子类

BufferedWriter类带有缓冲区

常用构造方法: BufferedWrtier(Wtiter out)

六、对象流 (序列化、反序列化)

        序列化:简单的说序列化就是将对象的状态存储到特定存储介质中的过程,也就是将对象状态转换为可保存或可传输格式的过程。

        反序列化:顾名思义就是与序列化相反,序列化是将对象的状态信息保存到存储介质中,反序列化则是从特定存储介质中读取数据并重新构建成对象的过程

序列化过程:

        1.创建一个对象  输出流 ObjectOutputStream ,它可以包装一个其他类型的输出流,如文件输出流 FileOutputStream

        2.通过对象输出流的 writeObject()方法写对象,也就是输出可序列化对象。

反序列化过程:

        1.创建一个对象  输入流 ObjectInputStream ,它可以包装一个其他类型的输入流,如文件输入流 FileInputStream

        2.通过对象输入流的 readObject()方法读取对象,该方法返回一个 Object 类型的对象,如果程序知道该 Java 对象的类型,则可以将该对象强制转换成其真实的类型。

Java读写IO流详解相关推荐

  1. Java 中IO流详解(附实例代码/面试题)

    Java I/O流详解 前言 一.I/O流是什么? 二.IO流分类: 1. 流程图: io流对象 2. io流的优缺点: 3. io 流Java中用途有哪些? 三.一些 io 实例 四.面试题: 前言 ...

  2. java中IO流详解

    不断更新中!!! 1.流的定义及分类 流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输操作都是以"流"的方式进行.设备可以是文件,网络,内存等.将数据从 ...

  3. Java输入输出(io)流详解、图解

    stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源.在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括两种类型: (1)字节流 ...

  4. java io流详解_一文带你看懂JAVA IO流,史上最全面的IO教学啦

    一.IO流是什么 惯例引用百科的回答流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作 ...

  5. c++文件流读取一行_「软帝学院」Java挑战者专栏:IO流详解2

    软帝学院笔记Day18 IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符 ...

  6. zipfile中怎么关闭流_深入学习JAVA -IO流详解

    (一)IO流基本概念 Java对数据的操作是通过流的方式,io是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相 ...

  7. java IO流详解及特性

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

  8. Java IO流 详解(字节流、字符流、输入流、输出流、刷新)

    一.IO流概述 I:Input输入  从其他存储设备[读]数据到内存中  输入过程         O:OutPut输出  从内存中[写]数据到其他存储设备  输出过程 二.IO流分类 1.根据数据的 ...

  9. 基于java洗浴中心管理系统_Java IO流详解

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

最新文章

  1. 美国 2006 年机器学习和知识发现年会数据挖掘使用率较高算法排名
  2. redhad yum 安装mysql_yum安装Mysql
  3. Matlab实现字符串分割
  4. GIS实战应用案例100篇(七)-基于GIS和ENVI的矢量化提取水体边界
  5. vasp和ms_科学网—VASP如何计算铁磁和考虑强关联作用 - 叶小球的博文
  6. H264解码的一个測试程序
  7. 【英语学习】【Level 07】U02 Live Work L2 A place to call my home
  8. Oracle开发环境安装与使用
  9. CentOS ifconfig无IP地址解决办法
  10. 注册使用GAC【转载】
  11. ​Fruits 360数据集
  12. 软件测试达内视频笔记(一)
  13. JS jeDate日期控件使用
  14. win10 1803官方原版镜像
  15. mysql 支持嵌套查询吗_【转】MySql 嵌套查询
  16. html5 歌词自动滚动效果,简单的HTML5音乐播放器(带歌词滚动)
  17. PS透明婚纱抠图(超详细)
  18. 2017中国之旅系列之九:山西平遥古城之旅
  19. 创业失败的那些人都在干什么?是去打工了还是继续创业了。丨国仁网络资讯
  20. 计算机专业对于未来的规划,对所学专业的认识及对未来的规划.doc

热门文章

  1. SAP ECC6.0 R3 IDES FOR ORACLE 安装笔记 (一)
  2. Ubuntu连接本地服务器失败修复
  3. 我不是java的布道者
  4. 一张图看看我的iPhone小圆点AssistiveTouch设置和布局技巧
  5. .mdf数据库恢复mysql_sql server 如何通过mdf文件和ldf文件恢复数据库
  6. 详解网络基础知识:IP地址、子网掩码、网关
  7. Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]
  8. 二叉树——HDU 3999
  9. html中怎么让一个div显示或隐藏,怎么让一个div显示一个div隐藏?
  10. pagerank算法实现matlab,【MATLAB】pagerank算法