Java读写IO流详解
一、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:\\文件目录1
与D:\\文件目录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流详解相关推荐
- Java 中IO流详解(附实例代码/面试题)
Java I/O流详解 前言 一.I/O流是什么? 二.IO流分类: 1. 流程图: io流对象 2. io流的优缺点: 3. io 流Java中用途有哪些? 三.一些 io 实例 四.面试题: 前言 ...
- java中IO流详解
不断更新中!!! 1.流的定义及分类 流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输操作都是以"流"的方式进行.设备可以是文件,网络,内存等.将数据从 ...
- Java输入输出(io)流详解、图解
stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源.在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括两种类型: (1)字节流 ...
- java io流详解_一文带你看懂JAVA IO流,史上最全面的IO教学啦
一.IO流是什么 惯例引用百科的回答流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作 ...
- c++文件流读取一行_「软帝学院」Java挑战者专栏:IO流详解2
软帝学院笔记Day18 IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符 ...
- zipfile中怎么关闭流_深入学习JAVA -IO流详解
(一)IO流基本概念 Java对数据的操作是通过流的方式,io是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相 ...
- java IO流详解及特性
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- Java IO流 详解(字节流、字符流、输入流、输出流、刷新)
一.IO流概述 I:Input输入 从其他存储设备[读]数据到内存中 输入过程 O:OutPut输出 从内存中[写]数据到其他存储设备 输出过程 二.IO流分类 1.根据数据的 ...
- 基于java洗浴中心管理系统_Java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
最新文章
- 美国 2006 年机器学习和知识发现年会数据挖掘使用率较高算法排名
- redhad yum 安装mysql_yum安装Mysql
- Matlab实现字符串分割
- GIS实战应用案例100篇(七)-基于GIS和ENVI的矢量化提取水体边界
- vasp和ms_科学网—VASP如何计算铁磁和考虑强关联作用 - 叶小球的博文
- H264解码的一个測试程序
- 【英语学习】【Level 07】U02 Live Work L2 A place to call my home
- Oracle开发环境安装与使用
- CentOS ifconfig无IP地址解决办法
- 注册使用GAC【转载】
- ​Fruits 360数据集
- 软件测试达内视频笔记(一)
- JS jeDate日期控件使用
- win10 1803官方原版镜像
- mysql 支持嵌套查询吗_【转】MySql 嵌套查询
- html5 歌词自动滚动效果,简单的HTML5音乐播放器(带歌词滚动)
- PS透明婚纱抠图(超详细)
- 2017中国之旅系列之九:山西平遥古城之旅
- 创业失败的那些人都在干什么?是去打工了还是继续创业了。丨国仁网络资讯
- 计算机专业对于未来的规划,对所学专业的认识及对未来的规划.doc
热门文章
- SAP ECC6.0 R3 IDES FOR ORACLE 安装笔记 (一)
- Ubuntu连接本地服务器失败修复
- 我不是java的布道者
- 一张图看看我的iPhone小圆点AssistiveTouch设置和布局技巧
- .mdf数据库恢复mysql_sql server 如何通过mdf文件和ldf文件恢复数据库
- 详解网络基础知识:IP地址、子网掩码、网关
- Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]
- 二叉树——HDU 3999
- html中怎么让一个div显示或隐藏,怎么让一个div显示一个div隐藏?
- pagerank算法实现matlab,【MATLAB】pagerank算法