十九.IO流

持久化:将内存中的数据  输出到其他设备中(比如硬盘),用于长时间保持数据

流:数据传输的管道或通道

i是in的缩写表示输入,o是out的缩写表示输出,io则表示了两个不同方向流

一般的 我们以内存为参照物,往内存中写入的方向我们称之为输入,从内存往外输入的方向我们称之为输出

一.IO流的分类

注意:一般描述一个流时,需要通过方向,内容,功能等三个方面进行描述,所以说不同的分类键

需要三者组合

1.按照方向划分

a.输入流——往内存中写

b.输出流——从内存往外输出

2.按照传输的内容划分

a.字节流——传输所有以字节为单位的内容(任何内容)

b.字符流——传输的是文本内容,如果一个文件使用Notepad++打开不是乱码一般都是文本内容

3.按照功能划分

a.节点流——只提供了最基本的输入输出功能——相当于,没有配件的基础枪械

b.过滤流——用来给节点流拓展功能的,本身不具备基础功能——相当于,枪械的配件

二.字节流

字节流与字符流的区分:一般以Stream结尾的是字节流 以er结尾的是字符流

输入输出流的区分input/Reader输入流  output/Writer输出流

1.字节输入输出节点流

InputStream/OutputStream

但是二者都是抽象类,无法实例化对象

常用的字节输入输出的节点流,分别是:

FileInputStream——字节输入节点流

FileOutputStream——字节输出节点流

2.FileOutputStream字节输出节点流

a.创建对象的语法:

FileOutputStream os=new FileOutoutStream(String name);

该构造方法,参数为数据输出到哪个文件的路径,默认表示覆盖源文件内容

FileOutoutStream os=new FileOutoutStream(String name,boolean append);

第一个参数,参数为数据输出到哪个文件的路径,第二个参数为布尔类型,表示是否覆盖源文件的内容

如果为false则覆盖,如果为true就不覆盖并在原来的内容中进行追加

注意:

字节输出流输出所写的文件不存在,那么就会主动创建一个文件  并写入内容

当前路径中的文件夹书写不正确时,才会出现java.io.FileNotFoundException

b.常用方法:

void write(int b);每次向外,写出一个字节的内容

void close();关闭流,释放资源

3.文件路径书写的注意事项

(1)因为\在java时一种特殊的字符,所以需要使用转义字符,用\\代表\

例:D:\2002JAVA\day24\课上练习\a.txt   改为D:\\2002JAVA\\day24\\课上练习\\a.txt

(2)或者把所有的\换成/

例:D:\2002JAVA\day24\课上练习\a.txt   改成D:/2002JAVA/day24/课上练习/a.txt

(3)绝对路径与相对路径

绝对路径:从盘符写起来寻找文件路径  例:D:/2002JAVA/day24/课上练习/a.txt

相对路径:相对于某个位置的路径信息 Eclipse以项目的根目录为参照目录

例:test/a.txt 会从项目的根目录去查找 b文件夹下的a.txt

4.FileInputStream字节输入节点流

a.创建对象语法:

FileInputStream is=new FileInputStream(String name);

参数是指定  该输入流  是将哪个文件中的内容读取到内存中,所以参数是文件的路径

注意:此处只要是文件路径写错,无论是文件名还是文件夹名,只要无法找到该文件都会出现

java.io.FileNotFoundException且不会主动创建文件

b.常用方法:

int read();每次从文件中读取一个字节的内容,当文件中没有新内容时,读到是特殊在-1

void close(); 关闭流,释放资源

c.如何把一个文件中的内容都读完?

while(true){

int read=is.read();;

if(read==-1){ //判断每次读进来的值是否是特殊值-1

break;

}

System.out.println((char)read);

}

5.文件的拷贝  重要

a.文件拷贝的思想:读一次 写一次 读完了就写完了  从而就复制完了

b.文件拷贝的1.0版本:

public static void main(String[] args)throws IOException{

//准备好一个输入流  一个输出流

//输入流  文件路径 写的是否需要被拷贝的目标文件

FileInputStream is=new FileInputStream("D:\\2002JAVA\\day24\\课上练习\\a.txt");

//输出流  文件路径  写的是复制出的新文件的路径

FileOutputStream os=new FileOutoutStream(D:\\2002JAVA\\day24\\作业\\a.txt);

//读一个字节  写一个字节

while(true){

int read=is.read();;

if(read==-1){ //判断每次读进来的值是否是特殊值-1

break;

}

//没读完  就把读到的写进去

os.write(read);

}

//释放资源

is.close();

os.close();

}

c.文件拷贝2.0 使用了缓冲流来增强读写效率  从而加快拷贝速度

public static void main(String[] args)throws IOException{

//准备好一个输入流  一个输出流

//输入流  文件路径 写的是否需要被拷贝的目标文件

FileInputStream is=new FileInputStream("D:\\2002JAVA\\day24\\课上练习\\a.txt");

//给输入流  加装缓冲流

BufferedInputStream bis=new BufferedInputStream(is);

//输出流  文件路径  写的是复制出的新文件的路径

FileOutputStream os=new FileOutoutStream(D:\\2002JAVA\\day24\\作业\\a.txt);

//给输出流 加装缓冲流

BufferedOutputStream bos=new BufferedOutputStream(os);

//读一个字节  写一个字节

while(true){

int read=is.read();;

if(read==-1){ //判断每次读进来的值是否是特殊值-1

break;

}

//没读完  就把读到的写进去

os.write(read);

}

//释放资源

bis.close();

bos.close();

}

6.字节过滤流中的缓冲流BufferedInputStream/BufferedOutputStream

没有提供更丰富的方法功能 但是对于读写能力进行了加强  因为读写能力的加强依靠缓冲区的

所以这组过滤流又被称为缓冲流

a.使用过滤流的流程  必须掌握!!!!非常重要,考试必考

(1)先创建节点流——必须先有基础枪械

(2)给节点流包装过滤流——给枪械加配件,注意选择过滤流时方向需要一致

(3)使用过滤流对象进行读写——使用提高 了能力的枪械进行射击

(4)关闭流释放资源——变成盒子精

b.BufferedOutputStream为写操作提供了一个8192个字节的缓冲区

缓冲区在什么时候会和硬盘进行一次交互?

(1)当该流被关闭时,缓冲区会和硬盘进行交互——强制

(2)当缓冲区被写满时,缓冲区会和硬盘进行交互——被动

(3)当缓冲流对象主动调用flush方法时,缓冲区会和硬盘进行交互——主动

c.缓冲区的好处:

减少内存与硬盘的交互次数,从而提高IO效率

7.过滤流PrintStream

PrintStream提供了丰富的向外输出内容的方法  也具备缓冲能力

注意PrintStream向外输出的 是字符串的表示形式  不是参数的值

常用方法:

print();向外输出参数数字符串内容  不换行

println();向外输出参数参数字符串内容  换行

代码实例:

public static void main(String[] args)throws FileNotFoundException{

FileOutputStream os=new FileOutputStream("D:\\2002JAVA\\day24\\课上练习\\a.txt");

PrintStream pos =new PrintStream(os);

//pos.println("晖哥");

//pos.println("666);

pos.println(new Student("ZZZ",15);

pos.close();

}

8.过滤流ObjectInputStream/ObjectOutputStream

提供了八种数据类型的读写功能,提供了对象类型包括String的读写功能 还提供了缓冲功能

常用方法:

ObjectOutputStream:

writexxx 向外输出各种数据类型的数据  xxx代表数据类型

ObjectInputStream:

readxxx 向内读入各种数据类型的数据   xxx代表数据类型

注意:

在使用ObjectInputStream的  readxxx方法时:

读到文件末尾不再是个特殊值  而是抛出一个java.io.EOFException异常   来表明文件读到末尾

代码案例:

while(true){

try{

Long read = ois.readLong();

System.out.println(read);

}catch(EOFException e){

System.out.println("读到末尾");

break;

}

}

9.对象的序列化问题    很常见  面试必问  后续内容重要的知识点

对象序列化:将对象放置在流中  从内存传输到其他设备中的过程被称为对象序列化

需要使用ObjectOutputStream writeObject(Object obj);

对象的反序列化:将对象放置在流中  从其他设备传输到内存中的过程被称为对象反序列化

需要使用ObjectInputStream readObject();

对象序列化的注意事项:

(1)注意序列化一个对象时,要保证他所对应的类实现了Serializable接口

(2)如果不想让对象的某个属性参与序列化,那么可以让该属性被transient修饰

(3)如果一个对象的属性是引用类型,那么必须保证该属性所对应的类型实现了Serializable接口

(4)在集合进行序列化的时候,要保证集合中所存元素,都可以被序列化

10.IO处理的标准处理  会写

语法:JDK1.7推出的自动关闭机制

try(声明并创建需要调用close方法的对象){

}catch(Exception e){

e.printStackTrace();

throw new RuntimeException;

}

注意:try后的()中可以声明赋值多个对象 每个声明赋值语句  使用; 结尾

案例:

try( FileInputStream is=new FileInputStream("D:\\2002JAVA\\day24\\课上练习\\a.txt");

FileOutputStream os=new FileOutputStream("D:\\2002JAVA\\day24\\课上练习\\a.txt");){

os.write();

int read=is.read();

}catch(Exception e){

e.printStackTrace();

throw new RuntimeException;

}

三.编码

为了计算机也能认知人类的符号  字体  出现了编码表(字符集)

编码表(字符集):储存了符号/字体  与数字的对应关系

常见的编码表(字符集):

美国的第一个编码表:ASC码

欧洲:ISO8859-1   记录了欧洲人习惯下的符号与字体

中国大陆:

简体中文

GB2312  收录了少量中文  不包含少数民族的文字与符号   陶吉吉

GB18030  收录了更多的中文  包含少数民族的文字与符号  藏文 蒙文

GBK   收录了上千中文的字符集  也是目前简体中文释义最多的字符集

中国台湾:

繁体中文

Big5   大5码

万国码  Unicode码  UTF-8   UTF-16

a.编码:将符号  通过字符集  转化为数据的过程  被称为编码

b.解码:将数据  通过字符集  转化为符号的过程  被称为解码

当编解码释义的字符集不一致时,会出现乱码的现象

所有字符集中都收入了ASC码表  所以英文什么时候都不会乱码   因为在所有

的编码表中英文对应的数据都是一样的

四.字符流

1.字符输入输出流的顶级父类

字符流的顶级父类时Writer与Reader 他们都是抽象类  不能创建对象  如果想使用字符流的

输出输入功能  需要使用其子类创建对象

2.字符节点流FileReader/FileWriter

字节流可以用来操作所有文本文件

字符流只能用来操作相关文本文件

a.FileWriter 提供字符最基本的输出功能

文件不存在则创建 路径错误则出错   也可以指定是否覆盖原内容的操作

常用方法:

write(int i); 每次输出一个字符

write(String str); 每次输出一个字符串

close();关闭流

b.FileReader 提供字符最基本的输入功能

文件不存在则直接出错

read(); 每次读入一个字符  且如果读到末尾  返回的也是-1

close();关闭流

3.字符过滤流 BufferedReader/PrintWriter

字符过滤流使用流程与字节过滤流使用流程是一致的

a.BufferedReader:提供了更强大的  读取文本文件的功能

常用方法:

readline(); 每次读取一行文本,读到末尾时,返回值为null

close(); 释放资源,关闭流

b.PrintWriter:提供了更强的输出字符串的能力

常用方法:

println系列  将参数转化为字符串输出 并换行

close();关闭流

4.桥转换流  重点!!!

可以将字节流转化为字符流,并指定字符流的编码或解码使用的字符集

InputStreamReader:将字节输入流转化为字符输入流

OutputStreamWriter:将字节输出流转化为字符输出流

桥转换流的使用流程:

(1)创建字节流

(2)使用桥转换流将字节流转换为字符流  并设置字符集

如果是输出流,则设置的字符集,是编码字符集

Writer  writer = new  OutputStreamWriter(字节输出流, 编码字符集);

如果是输入流,则设置的字符集,是解码字符集

Reader  reader = new   InputStreamReader(字节输入流 , 解码字符集);

(3)可以给字符流添加过滤流,方便操作

(4)释放资源

桥转换流案例:

某个文件的编码格式是UTF-8   内容为  专业的我们成就专业的你

将该文件进行复制,并把UTF-8的编码,改为GBK编码

读进来:使用解码字符集为UTF-8的字符流进行读取,保证读到的数据是无误的

写出去:使用编码集为GBK的字符流进行输出

设置一个文件的编码:用notepade++打开一个空文件,将编码设置为UTF-8无BOM格式

在文件中输入内容,此时这些内容会被UTF-8进行编码

桥转换流设置解码:

FileInputStream is=new FileInputStream("text.txt");

Reader reader = new InputStreamReader(is,"UTF-8");

BufferedReader br=new BufferedReader(reader);

桥转换流设置编码:

FileOutputStream os=new FileOutputStream("test_copy.txt");

Writer writer=new OutputStreamWriter(os,"GBK");

PrintWriter pw=new PrintWriter(wrier);

进行读一行,写一行

while(true){

String line=br.readLine();

if(line==null){

break;

}

pw.println(line);

}

pw.close();

br.close();

五.File类

IO流:用来操作文件内容

File类:用来对文件和文件夹本身进行操作 比如删除一个文件/文件夹

1.关于File对象的

new  File(路径);

(1)如果路径是一个文件路径,则该File对象指代的是一个文件对象

(2)如果路径是一个文件夹路径,则该File对象指代的是一个文件夹对象

(3)如果路径中的文件或文件夹不存在,则表示该文件和文件夹是内存中文件或文件夹,可对该文件和文件夹进行创建等操作

2.File类的常用方法

public boolean createNewFile();

创建文件,创建成功返回true,如果文件存在返回值为false

public boolean  mkdir();

创建文件夹,创建成功返回true,如果文件夹存在返回值为false

pubic boolean delete();

删除文件夹/文件,删除成功返回true,否则返回false

当删除文件夹时,只有当文件夹为空时,才可以删除

而删除文件时,不管文件内容是否为空,都会被删除

public String getName();

获取文件名(含拓展名),文件夹名

public boolean exists();

判断一个文件或是目录是否存在,存在返回true,否则为false

public String getAbsolutePath();

获取绝对路径

public File[] listFiles();

获取当前文件下所有的文件,文件夹

public boolean isFile();

判断File对象所对应的是否为文件,而不是目录

public boolean  isDirectory();

判断File对象所对应的是否为目录,而不是文件

3.File类的案例

如何找出D:\\eclipse-workspace下的所有.java文件

public static void findJava(File file){

//获取目录中所有的文件或文件夹

File[] listFiles=file.listFiles();

//判断文件夹内容是否为空

if(listFiles.length==0){

return;

}

//遍历这个目录里所有的文件或文件夹

for(File file2 : listFiles){

if(file2.isFile()){  //如果是文件  则验证该文件是否是.java结尾

if(file2.getName().endswith(".java")){

System.out.println(fiile2.getName());

}

}else{  //如果是文件夹 则继续进入该文件夹,寻找.java

findJava(file2);

}

}

}

六.IO知识点的梳理

Java基础(19)IO流相关推荐

  1. 【Java基础】· IO流习题详解

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

  2. Java基础学习—— IO流

    Java基础学习-- IO流 1 文件 1.1 文件的创建 1.2 文件常用的方法 2 IO流 2.1 FileInputStream 2.2 FileOutputStream 2.3 文件的拷贝 2 ...

  3. Java基础进阶IO流概述

    1.IO流,什么是IO? I : Input O : Output 通过IO可以完成硬盘文件的读和写. 2.IO流的分类? 有多种分类方式: 一种方式是按照流的方向进行分类: 以内存作为参照物 往内存 ...

  4. 学Java基础19 字符流 编码表 转换流 字符高效流 对象流 序列化 以及所有的IO流总结

    一.字符流概述 1.字符流 就是用于来读写字符操作的流 2.字符流使用的原因: 使用字节流来读取文件中中文会出现乱码 因为中文不是一个字节组成的 所以读取中文的时候 需要使用字符流 字符实际上也是使用 ...

  5. Java基础之IO流

    IO流用来处理设备间数据传输,java对数据的操作是通过流的方式,而这些操作流的对象被封装在IO包中.流可以分为字符流和字节流.字符流可以设置编码方式,这就使得处理文本更加方便. IO常用基类 字节流 ...

  6. Java基础知识——IO流

    简介 IO是指Input/Output,即输入和输出.以内存为中心: Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等等 Output指把数据从内存输出到外部,例 ...

  7. 【java基础】IO流是啥?有啥用?(上)

    今天我们说说java代码中对文件的操作,比如新建删除文件,读取文件内容等. File类 File类用于操作文件和目录,可对文件或目录进行新建,删除和重命名等操作.但是如果要访问文件内容本身,就需要用到 ...

  8. Java基础:IO 流中的 flush

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点 这里 可以跳转到教程. 内容概要 Java IO ...

  9. Java基础之IO流(一)

    IO流(一) IO流:输入输出的流动 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 流按操作数据分为两种:字节流与字符流 . 流按流向分为 ...

  10. java基础之 IO流

    javaIO流 IO流 : (input  output) 输入输出流 :输入 :将文件读到内存中 输出:将文件从内存输出到其他地方. IO技术的作用:主要就是解决设备和设备之间的数据传输问题.比如: ...

最新文章

  1. php中getdistance函数_php计算两个经纬度地点之间的距离
  2. Linux无法联网怎么办?解析VMware上的CentOS7(Linux)系统无法联网的解决办法
  3. MySQL自增字段并发插入导致死锁
  4. 京瓷6525_京瓷6525扫描怎么设置?
  5. 台式计算机不用待机还是关机好,电脑应该选择“关机”还是“休眠”?不关机对电脑有损伤吗?...
  6. 剑指offer 顺时针打印矩阵
  7. 感知算法论文(八):Generalized Intersection over Union:A Metric and A Loss for Bounding Box Regression(2019)
  8. C语言实用算法系列之学生管理系统_单向链表外排序_栈内数组存储链表节点指针
  9. CentOS安全设置
  10. Laravel核心解读 -- 扩展用户认证系统
  11. Docker-创建和分享应用(3)
  12. 英文c语言笔试题,关于C语言模拟笔试题
  13. Android的JNI【实战教程】2⃣️--AS下NDK环境配置及第一个工程
  14. 虚幻4 配置打包安卓
  15. 激光雷达工作原理简介
  16. 易语言 文件捆绑机的原理【转载】
  17. C++之字符串大小写转换
  18. 移动磁盘提示设备未就绪文件怎么恢复
  19. AI期末考试基础知识点复习(AI入门)
  20. 编程n的阶乘使用while语句_谷歌工程师新作,东北话编程

热门文章

  1. php浮点转int少1,PHP中浮点数计算比较及取整不准确的解决方法
  2. 加载json文件注意事项
  3. Matlab的D算法
  4. 150首中国翻唱韩国原歌曲
  5. php5.3 register_globals,在PHP 5.3中PHP寄存器全局支持?(PHP register globals support in PHP 5.3?)...
  6. C语言 深度剖析数据在内存中的存储(2)
  7. mac按键难回弹(按下去软软的)
  8. google map 离线数据
  9. Linux ❉ sudo 命令
  10. KEIL中左侧project 的文件编译后没有显示.h文件