IO流
一、IO流概述和分类
IO流介绍
- IO:输入/输出(Input/Output)
- 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
- IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载
IO流的分类 按照数据的流向
按照数据类型来分
- 字节流
字节输入流(InputStream) 字节输出流(OutputStream) - 字符流
字符输入流(Reader) 字符输出流(Writer)
IO流的使用场景
- 如果操作的是纯文本文件,优先使用字符流
- 如果操作的是图片、视频、音频等二进制文件。优先使用字节流
- 如果不确定文件类型,优先使用字节流。字节流是万能的流
今天我们这里主要讲解的是字节流,字符流在下一篇中讲解
二、字节输出流(OutputStream)
字节流写数据的三种方式
方法名 | 说明 |
---|
void write(int b) | 将指定的字节写入此文件输出流 一次写一个字节数据 | void write(byte[] b) | 将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据 | void write(byte[] b, int off, int len) | 将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据 |
示例代码
public class FileOutputStreamDemo02 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt");
byte[] bys = "abcde".getBytes();
fos.write(bys,1,3);
fos.close();
}
}
字节流写数据的两个小问题
字节流写数据如何实现换行
- windows:\r\n
- linux:\n
- mac:\r
字节流写数据如何实现追加写入
- public FileOutputStream(String name,boolean append)
- 创建文件输出流以指定的名称写入文件。如果第二个参数为true ,则字节将写入文件的末尾而不是开头
示例代码
public class FileOutputStreamDemo03 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("myByteStream\\fos.txt",true);
for (int i = 0; i < 10; i++) {
fos.write("hello".getBytes());
fos.write("\r\n".getBytes());
}
fos.close();
}
}
三、字节输入流(InputStream)
字节流读数据 我们通过两个案例来体会读数据的操作 1.字节流读数据(一次读一个字节) 实现步骤
-
复制文本文件,其实就把文本文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目的地) -
数据源: ? E:\itcast\xxx.txt — 读数据 — InputStream — FileInputStream 。我们从E盘的itcast文件中读取一个txt文件。 -
目的地: ? myByteStream\xxx.txt — 写数据 — OutputStream — FileOutputStream。将读到的数据写入到myByteStream模块下的txt文档中
示例代码
public class CopyTxtDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("E:\\itcast\\xxx.txt");
FileOutputStream fos = new FileOutputStream("myByteStream\\xxx.txt");
int by;
while ((by=fis.read())!=-1) {
fos.write(by);
}
fos.close();
fis.close();
}
}
2.字节流读数据(一次读一个字节数组) 如果我们需要一次读一个字节数组则需要知道一次读一个字节数组的方法
public int read(byte[] b)
示例代码
public class FileInputStreamDemo02 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("myByteStream\\fos.txt");
byte[] bys = new byte[1024];
int len;
while ((len=fis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
fis.close();
}
}
字节流我们了解了,现在再来了解他的扩展,字节缓冲流
四、字节缓冲流
字节缓冲输出流(BufferOutputStream):通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用 字节缓冲输入流(BufferedInputStream):当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节 字节缓冲流的构造方法
方法名 | 说明 |
---|
BufferedOutputStream(OutputStream out) | 创建字节缓冲输出流对象 | BufferedInputStream(InputStream in) | 创建字节缓冲输入流对象 |
示例代码
public class BufferStreamDemo {
public static void main(String[] args) throws IOException {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("myByteStream\\bos.txt"));
bos.write("hello\r\n".getBytes());
bos.write("world\r\n".getBytes());
bos.close();
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("myByteStream\\bos.txt"));
byte[] bys = new byte[1024];
int len;
while ((len=bis.read(bys))!=-1) {
System.out.print(new String(bys,0,len));
}
bis.close();
}
}
|