IO流基础知识

文件是保存数据的地方,而文件在程序中又按流的形式操作。

常用文件操作

1.创建文件

new File 创建的只是文件对象,必须执行了createNewFIle方法后,才能在磁盘创建该文件。

2.获取文件相关信息

先创建文件对象

File file = new File("e:\\news.txt");

3.对目录的操作

可以把目录也当作文件来操作

-----------------------------------

IO流原理

字节流适合操作二进制文件,不会造成损失,字符流适合操作文本文件

对任何的流,在操作后都要执行close方法关闭。

体系类图

字节输入流InputStream:

这是一个抽象类,是所有字节输入流的超类

FileInputStream文件输入流:

构造器和常用方法:

FileInputStream(String filePath),指定文件名称

FileInputStream(File file),指定文件

read()使用时通常搭配while循环,来读取文件,读取的字节可以通过强制类型转换后输出

read()每次只能读取一个字节,效率低下,可以每次读取一个字节数组

read(byte[] b)

首先要定义一个字节数组,比如

byte[]  buf = new byte[8]; //一次读取8个字节

如果读取完毕,该方法返回-1,读取正常,返回实际读取的字节数

读取的字节数组可以转换成字符串后输出,new String(buf,0 ,readLength);

------------------------------------

文件输出流FileOutputStream

FileOutputStream可以对写入文件,若要写入的文件不存在,则会创建该文件。

先创建FileOutputStream对象

String filePath = "文件路径";

FileOutputStream fileOutputStream = null;

fileOutputStream = new FileOutputStream(filePath);

可以使用write方法来写入(int b 和 char b一样,因为存在转换关系)

从字节数组的第off个元素开始,写入len个元素。

new FileOutputStream(filePath)对同一个文件的多次写入,会覆盖上一次的写入,若不想覆盖,可以使用追加append模式,即在构造器定义是,加上true;

//new FileOutputStream(filePath,true)  //true表示打开追加模式

----------------------------

文件的拷贝(即read和write)

1.先创建输入流读取文件到程序

2.创建输出流把读取的数据写入新文件

不可以使用write(buf),这样有可能造成文件损失!

---------------------------

文件字符流FileReader 和 FileWriter

调用read方法时,注意参数不再是字节数组,而是字符数组了

------------------------------------

节点流和处理流

节点流就是从特定的数据源进行读写的流,如FileReader

处理流(修饰器设计模式)是对一系列的数据源都能操作的流,它封装了一个节点流属性(如Reader,Writer),可以传入任意子类的节点流,来使用对应的方法。

本质仍是对应的节点流

-----------------------------------------

处理流BufferedReader和BufferWriter都属于字符流,关闭处理流只需关闭外层流即可

BufferReader使用:

BufferWriter使用:

newLine()方法可以往文件写入换行符,达到换行的效果,如果需要追加写入,则在构造器中可以置为true。

Buffered拷贝,先读取后写入,注意不要操作二进制文件,因为这是字符流,会导致文件损坏!

--------------------------------

可以使用BufferedInputStream  BufferedOutputStream字节处理流来操作文本文件和二进制文件

当使用BufferedInputStream / BufferedOutputStream时,继承了父类的in / out属性,只需传入InputStream / OutputStream的子类即可,比如传入文件流

--------------------------------

对象处理流,专用于处理对象

ObjectInputStream 和 ObjectOutputStream

优先实现Serializable接口,因为这样更加简便,实现Externalizable接口,必须要再去重写里面的2个抽象方法。

比如序列化一个Dog对象(name,age),此时Dog类必须实现序列化接口,并保存到dat文件中

依然是先定义路径,创建对象流对象

通过write方法序列化数据到对应路径的文件中

既然有序列化,那如何能反序列化,恢复数据呢,就可以用ObjectInputStream来读取对应的文件

注意反序列化的顺序需要和序列化的顺序一致!

可以通过readObject方法来反序列化对象,此时会自动发生转型

-------------------------------

标准输入输出流

就比如Scanner(System.in)从键盘输入数据,System.out.print()标准输出到显示器

--------------------------

转换流InputStreamReader 和 OutputStreamWriter

该转化流就是将一种字节流转换成字符流,可以解决因编码方式不同而导致的中文乱码问题,即指定编码方式

InputStreamReader

OutputStreamWriter可以按照指定的编码方式对文件进行写入

-----------------------------------

字节打印流PrintStream

该流只有输出流PrintWriter,没有输入流,可以打印在显示器,文件里面等等

在默认下打印流会打印在显示器上

PrintWriter可以传入Writer,文件,OutputStream来控制打印位置

print方法底层是write方法,所以直接通过将输出的东西转换成字节后(getBytes方法)来使用write效果也是一样

如果想修改打印的位置,可以使用

System.setOut(new PrintStream (文件路径));

------------------------------

Properties类的父类是HashTable,专门用于读写配置文件的集合类,要求配置文件的格式必须是   键=值     键值对不需要空格,不需要引号分号

如果要读取配置文件,还要修改其中的键值对,只要使用setProperty方法即可,如果该文件没有key就是创建新的键值对,如果有,就是修改键值对。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值