一:IO流的分类
1.按数据流的方向:输入流、输出流
输入与输出是相对于应用程序而言的,比如文件读写,读取文件是输入流,写文件是输出流 。
2.按处理数据单位:字节流、字符流
字节流和字符流的用法几乎完成全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的单元是数据单元是8位的字节,字符流操作的是数据单元为16位的字符。
3.按功能:节点流、处理流
节点流:直接操作数据读写的流类,比如FileInputStream
处理流:对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能,例如BufferedInputStream(缓冲字节流)
二:字节流
概念:
一次可以读取一个字节 或者写入一个字节 (写入字节数组以及读取字节数组)
字节流的老祖宗:
InputStream(字节输入流——读取内容)
OutputStream(字节输出流——写入内容)
字节流下的具体子实现类:
- FileInputStream:以字节的方式将磁盘中的文本文件中的内容读取到Java程序中
- FileOutputStream:以字节的方式将Java程序中生成的数据写入到电脑磁盘中
- 针对文本文件的操作
- 读取磁盘中的内容
通过FileInputStream的构造函数可以实现
FileInputSteam(file)
1.构建一个File对象指定磁盘下指定读取的文件路径
File file = new File("D:\\情书.txt");
2.构建FileInputStream对象以此将file对象传递到
该构造函数内后可以直接通过流的方式进行读取文件中的内容到java程序中进行显示
FileInputStream fis = new FileInputStream(file);
- 一次读取一个字节
int n = fis.read();
while(n!=-1) {
System.out.print((char)n);
n = fis.read();
}
int n = 0;//定义一个变量存储每次读取的字节内容
while(-1!=(n = fis.read())) {
System.out.print((char)n);
}
- 一次读取一个字节数组
byte[] bys = new byte[1024];
int n = 0;
while(-1!=(n = fis.read(bys))) {
System.out.println(new String(bys).trim());
System.out.println(new String(bys, 0, n));
}
- Java程序运行后,将指定的内容通过FileOutputSteam对象写入到磁盘指定的文件内
- FileOutputSteam(file) 构造函数 输出流 负责写入数据
- 写入数据write
File file = new File("D:\\鑫鑫.txt");
//新建FileOutputStream()
FileOutputStream fos = new FileOutputStream(file);
fos.write(97);
System.out.println("写入成功");
- 一次性写入一个字节数组
String str = "mynameisxinxin";
//getBytes()将字符串转换成字节数组
fos.write(str.getBytes());
System.out.println("写入成功");
//关闭所有流的资源
fos.close();
重点:解决文件写入重复操作后覆盖的问题。
解决方案:先读取 后拼接 最后一起写入即可
File file = new File("D:\\鑫鑫.txt");
//输入流 读取
FileInputStream fis = new FileInputStream(file);
//一次读取一个字节数组
String content = "";
byte[] bys = new byte[1024];
int len = 0;
while(-1!=(len = fis.read(bys))) {
System.out.println(new String(bys,0,len));
content+=new String(bys,0,len);
}
System.out.println(content);
//输出流 写入
FileOutputStream fos = new FileOutputStream(file);
String result = content+"\nabcdefg";
fos.write(result.getBytes());
System.out.println("写入成功");
//关闭所有流资源
高效字节缓冲流
BufferedInputStream 缓冲字节输入流 读取
BufferedOutputSteam 缓冲字节输出流 写入
这2个缓冲流比FileInputStream以及FileOutputStream要高效。
案例:演示高效字节缓冲流操作方法
File file = new File("D:\\鑫鑫.txt");
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
int read = bis.read();
System.out.println((char)read);
int len = 0;
while(-1!=(len = bis.read())) {
System.out.print((char)len);
}
File file = new File("D:\\鑫鑫2.txt");
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(new String("hello").getBytes());
bos.close();
fos.close();