IO流
什么是流
- 指一连串流动的字符,是以先进先出方式发送信息的通道
根据数据的流向分为:输入流 和 输出流
- 输入流:把数据从其他设备上读取到内存中的流
- 输出流:把数据从内存中写出到其他设备上的流
根据数据的类型分为:字节流和字符流
- 字节流:以字节为单位,读写数据的流。可以读写任何类型的文件
- 字符流:以字符为单位,读写数据的流。只能读写文本
对应的超类
输入流 | 输出流 | |
---|---|---|
字节流 | InputStream | OutputStream |
字符流 | Reader | Writer |
字节流
OutputStream(字节输出流)
是所有字节输出流的所有类的超类,将指定的字节信息写出到目的地
字节输出流的共性功能
public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b):将 b.length个字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。 也就是说从off个字节数开始读取一直到len个字节结束
public abstract void write(int b) :将指定的字节输出流。
FileOutputStream
文件输出流,用于数据写出到文件
构造方法
其中 public FileOutputStream(String name)最常用
类似这样创建字节输出流对象都做了三件事情:
- 调用系统功能去创建文件【输出流对象才会自动创建】
- 创建fos对象
- 把foutputStream对象指向这个文件
FileOutputStream写字节数据
通过write方法实现字节数据的写入
FileOutputStream的换行实现与追加写入
换行实现
windows \r\n
Linux \n
Mac \r
eclipse/IDEA 中的记事本软件以及editplus这样的第三种软件都做了平台的兼容
追加写入
public FileOutputStream(File file, boolean append)
public FileOutputStream(String name, boolean append)
这两个构造方法,第二个参数中都需要传入一个boolean类型的值,true 表示追加数据,false 表示不追加也就是清空原有数据。这样创建的输出流对象,就可以指定是否追加续写了
代码演示
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("a.txt");
//当输出流所关联的文件不存在,就会自动创建一个文件,不会报错
FileOutputStream out = new FileOutputStream(file);
//创建一个向具有指定名称的文件中写入数据的输出字节流
FileOutputStream out1 = new FileOutputStream("b.txt");
//一次写入一个字节
out1.write(97);
out1.write(98);
out1.write(99);
out1.flush();
//一次写入一个字节数组
//.getBytes()
byte[] bytes = "我想和你一起闯入森林潜入海底".getBytes();
out.write(bytes);
out.flush();
//0表示从字节数组的哪个索引开始 12 表示写了多少个字节
//一个汉字在UTF-8中占3个字节
out.write(butes,0,12);
out.flush();
//true表示追加写入,不会造成覆盖
FileOutputStream out2 = new FileOutputStream("c.txt",true);
byte[] bytes1 = "人类的本质".getBytes();
out2.write(bytes1);
out2.flush();
// 换行符的使用
out2.write("\r\n".getBytes());
out2.flush();
//最后记得关闭
out.close();
out1.close();
out2.close();
}
}
生成结果
a.txt
我想和你一起闯入森林潜入海底
b.txt
abc
c.txt
程序运行几次,就会写几次,不会造成覆盖
人类的本质
人类的本质
人类的本质
人类的本质
InputStream(字节输入流)
抽象类,是表示字节输入流的所有类的超类
字节输入流的共性功能
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read(): 从输入流读取数据的下一个字节。
public int read(byte[] b): 该方法返回的int值代表的是读取了多少个字节,读到几个返回几个,读取不到返回-1
FileInputStream
文件输入流,从文件中读取字节
构造方法
其中 public FileInputStream(String name)最常用
读取字节
**read()**方法
(d.txt)内容为 abcd
public class Test2 {
public static void main(String[] args) throws IOException {
File file = new File("d.txt");
file.createNewFile();
FileInputStream in = new FileInputStream(file);
int r1 = in.read();
System.out.println(r1);
int r2 = in.read();
System.out.println(r2);
int r3 = in.read();
System.out.println(r3);
int r4 = in.read();
System.out.println(r4);
int r5 = in.read();
System.out.println(r5);
}
}
输出结果
97
98
99
100
-1
使用字节数组读取
read(byte[] b),每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回-1
public class Test2 {
public static void main(String[] args) throws IOException {
File file = new File("d.txt");
file.createNewFile();
FileInputStream in = new FileInputStream(file);
byte[] bytes = new byte[1024];
int len=0;
int read = in.read(bytes);
for (byte aByte : bytes) {
System.out.println(aByte);
}
System.out.println(read);
in.close();
}
}
输出结果
97
98
99
100
(1020个0)
4
字符流
Reader(字符输入流)
抽象类,字符输入流的所有类的超类,可以读取字符信息到内存中
字符输入流的共性方法
public void close() :关闭此流并释放与此流相关联的任何系统资源。
public int read(): 从输入流读取一个字符。
public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
InputStreamReader/FileReader
InputStreamReader是字节流通向字符流的桥梁
FileReader是读取字符文件的便利类
构造方法
Writer(字符输出流)
抽象类,字符输出流的所有类的超类,将指定的字符信息写出到目的地
字符输出流的共性方法
void write(int c) 写入单个字符
void write(char[] cbuf)写入字符数组
abstract void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数
void write(String str)写入字符串
void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数
void flush()刷新该流的缓冲
void close() 关闭此流,但要先刷新它
OutputStreamWriter/FileWriter
OutputStreamWriter是字符流通向字节流的桥梁
FileWriter是写出字符到文件的便利类
构造方法