IO流
- IO流用来处理设备之间的数据传输
- Java对数据的操作是通过流的方式
- Java用于操作流的对象都在IO包中
- 流按操作数据分为两种:字节流与字符流
- 流按流向分: 输入流与输出流
计算机中, 主机 = cpu +内存
内存属于易失性存储介质。所以,在计算机主机中,是无法长期保存数据的 (所以通常我们将数据保存在主机之外的,主机之外,不管是硬盘,键盘,显示器,鼠标这些统统称之为输入输出设备。)
计算机中要处理的数据都是来自于外部设备,同时也可以将处理过后的数据,写入硬盘等输入输出设备。这些工作,都是在java 中的流来实现
字节流:二进制数据 byte[] 反应在代码上
字符流:字符数据 char [] 反应在代码上
字符流的由来:
其实就是:字节流读取文字字节数据后,不直接操作而是指定的编码表。获取对应的文字。在对这个文字进行操作。简单说:字节流+编码表。
什么情况使用哪种流?
如果数据所在的文件通过windows 自带的记事本打开并能读懂里面的内容,就用字符流。
其他用字节流。
因为不管什么样的数据,都可以用字节流来处理,之所以引入字符流,仅仅只是为了方便堆文本数据的操作
输入流和输出流相对与内存设备而言:
将外设中的数据读取到内存中:输入
将内存的数写入到外设中:输出
IO流常用基类
字节流的抽象基类(顶层父类):1、InputStream 2、 OutputStream
字符流的抽象基类(顶层父类):1、Reader 2、Writer
由这四个类派生出来的子类名称都是以其父类名作为子类类名的后缀。
而子类名的前缀描述的是功能。
- 如:InputStream 的子类 FIleInputStream
从熟悉的文字开始字符流:
//需求:将一些文字存储到硬盘的一个文件中。
`记住:
如果要操作文件数据,建议优先考虑字符流中的输出流。Writer
硬盘的数据基本体现是文件。希望找到一个可以操作文件的 Writer
找到操作文件对象的FileWriter
package com.file;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//渐渐一个可以往文件中写入字符数据的字符输出流对象
/*
* 既然是往一个文件中写入文字数据,那么在创建对象时,就是
* 必须明确该文件(用于存储数据目的地)
*
* 如果文件不存在,则会自动创建
* 如果文件存在,则会被覆盖。
*/
FileWriter fw = new FileWriter("demo.txt");
/*
* 调用Writer对象中的Writer(String)方法,写入数据
* 其实数据写入到了临时存储缓冲区中(流中)。
*/
fw.write("abfbfd");
/*
* 进行刷新,将数据直接写入到目的地中
*/
//fw.flush();
/*
* 关闭流,关闭资源
* 关闭此流前,会先调用flush刷新缓冲流中的数据目的地
*/
fw.close();
// fw.write("haha");//java.io.IOException: Stream closed
}
}
创建字节流到底做了哪些事情?*
/*如果该文件存在,但它是一个目录,而不是一个常规文件;或者该文件不存在,
但无法创建它;抑或因为其他某些原因而无法打开它,则抛出 FileNotFoundException。
*/
//和File对文件路径的抽象表示,如果通过抽象路径,来创建FileOutStream对象,那么
//1.如果该路径所代表的文件确实存在:
// a. 创建 FileOutStream 对象
// b. 将刚刚创建的FileOutStram 与实际文件关联
//
//2. 如果该抽象路径所代表的文件不存在:
// a. 首先物理创建该抽象路径所代表的文件
// b. 创建 FileOutStream 对象
// c. 将刚刚创建的FileOutStram 与实际文件关联
数据写入成功后,为什么要close() ?
//close 一定不能少,因为垃圾回收器无法直接回收操作系统资源
1)释放系统资源
2)关闭流,若要维护流,需要消耗系统资源,写完了以后,就不需要去维护他,可以把它关掉。
如何实现数据的追加写入?
//创建通道的时候去指明它的第二个参数为true
FileOutputStream fos = new FileOutputStream("a.txt",true);
fos.write(chars,0,2);
FileOutputStream(String name, boolean append)
创建一个向具有指定 name 的文件中写入数据的输出文件流。
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
即:
//创建通道的时候去指明它的第二个参数为true
FileOutputStream fos = new FileOutputStream("a.txt",true);
fos.write(chars,0,2);
fos.close();
如何实现数据的换行?
//可用BufferedWriter newLine
//声明一个静态常量:
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
fileWriter.write("abcde"+LINE_SEPARATOR+"hhhha");//换行