IO流介绍以及输入输出以及流向的介绍
- I:Input 输入
O:Output 输出 - IO流:将一个数据从一个设备上传输的到另一个设备上的技术
- 为啥要学IO流?
之前我们学过数组和集合,用于存储数据,但是数组和集合都是临时存储的,后面我们要用数据的话,就没了
所以我们就想,将数据永久保存起来,可以保存到硬盘的文件中
而我们学的IO流可以将数据保存到硬盘上的文件中,后续使用的话可以从文件中读出来使用
IO流的流向
1.输出:将数据从内存中写到硬盘上 ----- write
2.输入:将数据从硬盘上读到内存中 ----- read
IO流分类
1.字节流:一切皆字节,万能流
字节输出流:OutputStream 父类
字节输入流:InputStream 父类
2.字符流: 专门操作文本文档的
a.文本文档:用记事本打开,人能够看懂的文档
字符输出流:Writer 父类
字节输入流:Reader 父类
3.我们将要学以下几个流:
FileOutputStream//字节输出流
FileInputStream//字节输入流
FileWriter//字符输出流
FileReader//字符输入流
BufferedOutputStream//字节缓冲输出
BufferedInputStream//字节缓冲输入
BufferedWriter//字符缓冲输出
BufferedReader//字符缓冲输入
OutputStreamWriter
InputStreamReader
PrintStream
ObjectOutputStream
ObjectInputStream
扩展:Commons-IO
IO流分类 OutputStream中的子类FileOutoutStream的介绍以及方法的简单介绍
1.概述:OutputStream(抽象类)
2.子类:FileOutputStream输出流对象
3.作用:将数据从内存中写到硬盘上
4.构造:
FileOutputStream(File path)
FileOutput(String path)
5.方法
void write(int b) 一次写一个字节
void write(byte[] b) 一次写一个字节数组
void write(byte[] b, int off, int len)一次写一个字节数组一部分
b:要操作的数组
off:从数组的哪个索引位置开始写
len:写多少个
void close()->关流
6.注意:如果指定的文件不存在,输出流会自动创建
public class test10 {
public static void main(String[] args) throws IOException {
final File file = new File("D:\\Ajava\\output.txt");
final FileOutputStream fileOutputStream = new FileOutputStream(file);
//一次写一个字节
fileOutputStream.write(98);
//fileOutputStream.close();
//一次写一个字节数组
byte[] bytes = {97,98,99,100};
fileOutputStream.write(bytes);
//fileOutputStream.close();
//一次写一个数组的一部分,从哪一个开始写,写多长
fileOutputStream.write(bytes,2,2);
//fileOutputStream.close();
//写中文
fileOutputStream.write("李云龙".getBytes(StandardCharsets.UTF_8));
fileOutputStream.close();
}
}
1.注意:FileOutputStream默认情况下,每次运行都会创建一个新的文件
覆盖老文件,然后将在写入的内容放到新文件中
2.续写追加
FileOutputStream(String name, boolean append) append:true 则不会副高老文件,会继续直接续写追加的内容
3.换行
\r \n window系统换行符
public class test01 {
public static void main(String[] args) throws IOException {
final File file = new File("D:\\Ajava\\output1.txt");
final FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write("古藤老树昏鸦,\r\n".getBytes(StandardCharsets.UTF_8));
fileOutputStream.write("小桥流水人家,\r\n".getBytes(StandardCharsets.UTF_8));
fileOutputStream.write("古道西风瘦马,\r\n".getBytes(StandardCharsets.UTF_8));
fileOutputStream.write("夕阳西下,断肠人在天涯!\r\n".getBytes(StandardCharsets.UTF_8));
fileOutputStream.close();
}
}
InputStream子类[fileInputStream]的介绍以及方法的使用
1.概述 InputStream 抽象类
2.子类 FileInputStream
3.作用 将数据从硬盘上读到内存中
4.构造:
FileInputStream(File file)
FileInputStream(String path)
5.方法:
int read() ----- 一次读取一个字节,返回的是读取的那个字节
int read(byte[] b) 一次读取一个字节数组,返回的是读取的个数
int read(byte[] b, int off, int len) 一次读取一个字节数组一部分,返回的是读取的个数
b:要读取的数组
off 从数组数组的哪个字节开始读
len:读多少个
void close() 关流
一次读取一个字节
public class test02 {
public static void main(String[] args) throws IOException {
final File file = new File("D:\\Ajava\\output.txt");
final FileInputStream fileInputStream = new FileInputStream(file);
int read01 = fileInputStream.read();
System.out.println("read01 = " + read01);
int read02 = fileInputStream.read();
System.out.println("read01 = " + read02);
int read03 = fileInputStream.read();
System.out.println("read01 = " + read03);
int read04 = fileInputStream.read();
System.out.println("read01 = " + read04);
int a ;
while ((a = fileInputStream.read())!=-1){
System.out.println(a);
}
fileInputStream.close();
}
}
注意:
1.不要判断的时候read一次,输出的时候再read一次,否则输出结果会跳着输出
2.不要读完之后,再重新读了,因为读不出来了
3.如果流被关闭了,流就不能再使用了
一次读取一个字节数组
int read(byte[] b)一次读取一个字节数组,返回的是读取的个数
首先定义一个数组,此数组是一个临时存储空间,读取的内容先保存到数组中,从数组中获取
将来我们不知道文件中存储了多少内容,所以byte数组长度无法定义
所以我们一般长度都指定1024或者其倍数
public class test03 {
public static void main(String[] args) throws IOException {
final File file = new File("D:\\Ajava\\output.txt");
final FileInputStream fileInputStream = new FileInputStream(file);
//注意数组长度为几,就读取几个
byte[] bytes =new byte[4];
//System.out.println("fileInputStream.read() = " + fileInputStream.read());
//int read() 返回的是读取的个数
int num = fileInputStream.read(bytes);
System.out.println(num);
//读取数组中的内容
System.out.println(new String(bytes,0,num));
int len;
while ((len = fileInputStream.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
fileInputStream.close();
}
}
字节流实现图片复制代码实现
public class test04 {
public static void main(String[] args) throws IOException {
final File file = new File("C:\\Users\\94863\\Pictures\\Saved Pictures\\huahua.jpg");
final File file1 = new File("C:\\Users\\94863\\Pictures\\Saved Pictures\\xiaohua.jpg");
final FileInputStream fileInputStream = new FileInputStream(file);
final FileOutputStream fileOutputStream = new FileOutputStream(file1);
final byte[] bytes = new byte[1024];
//final int read = fileInputStream.read(bytes);
int read;
//边读边写
while ((read = fileInputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0,read);
}
//关流
fileInputStream.close();
fileOutputStream.close();
}
}