1.2 流的分类
1.2.1 按方向【重点
】
- 输入流:将<存储设备>中的内容读入到<内存>中。
- 输出流:将<内存>中的内容写入到<存储设备>中。
1.2.2 按单位
字节流:以字节为单位,可以读写所有数据 。
字符流:以字符为单位,只能读写文本数据 。
1.2.3 按功能
- 技术流、节点流:具有实际传输数据的读写功能。
- **包装流、**过滤流:在节点流的基础之上增强功能。
InputStream:字节输入流基类,抽象类是表示字节输入流的所有类的超类。
// 从输入流中读取数据的下一个字节 abstract
int read()
// 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中
int read(byte[] b)
// 将输入流中最多 len 个数据字节读入 byte 数组
int read(byte[] b, int off, int len)
// 跳过和丢弃此输入流中数据的 n个字节
long skip(long n)
OutputStream:字节输出流基类,抽象类是表示输出字节流的所有类的超类。
// 将 b.length 个字节从指定的 byte 数组写入此输出流
void write(byte[] b)
// 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
void write(byte[] b, int off, int len)
// 将指定的字节写入此输出流 abstract
void write(int b)
//刷新输出流,强制写出缓冲的输出字节
void flush();
字节文件操作:
FileInputStream:字节文件输入流,从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流。
//1创建FileInputStream,并指定文件路径
FileInputStream fis=new FileInputStream("d:\\aaa.txt");
//FileInputStream 用 read 添加数据
//public int read(byte[] b) 从流中读取多个字节,将独到的内容存入b数组中,返回实读到的字节数
//如果达到尾部 返回-1
//2读取文件
//fis.read()
//遍历读取打印
int data;
while((data=fis.read())!=-1) {
System.out.print((char) data);
}
//1创建文件字节输出流对象
FileOutputStream fos=new FileOutputStream("d:\\bbb.txt",true);
//FileOutputStream 用 write 添加数据
流的方法:
File类:
常见方法:
方法名 | 描述 |
---|---|
createNewFile() | 创建一个新文件。 |
mkdir() | 创建一个新目录。 |
delete() | 删除文件或空目录。 |
exists() | 判断File对象所对象所代表的对象是否存在。 |
getAbsolutePath() | 获取文件的绝对路径。 |
getName() | 取得名字。 |
getParent() | 获取文件/目录所在的目录。 |
isDirectory() | 是否是目录。 |
isFile() | 是否是文件。 |
length() | 获得文件的长度。 |
listFiles() | 列出目录中的所有内容。 |
renameTo() | 修改文件名为。 |
2.3 字节缓冲流
缓冲流:BufferedOutputStream/BufferedInputStream
- 提高IO效率,减少访问磁盘的次数。
- 数据存储在缓冲区中,flush是将缓存区的内容写入文件中,也可以直接close。
- **mkdir( )**方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
- **mkdirs()**方法创建一个文件夹和它的所有父文件夹。
FileInputStream fis=new FileInputStream("d:\\aaa.txt");//创建输入字节流
BufferedInputStream bis=new BufferedInputStream(fis);//创建输入缓冲流
//2.2一次读取多个字节
byte[] buf=new byte[1024];
int count=0;
while((count=bis.read(buf))!=-1) {
System.out.println(new String(buf,0,count));
}
带缓冲区的输入输入字符流:
BufferedWriter
BufferedReader
对象流:
ObjectOutputStream
ObjectInputStream
- 增强了缓冲区功能。
- 增强了读写8种基本数据类型和字符串功能。
- 增强了读写对象的功能:
- readObject() 从流中读取一个对象。
- writeObject(Object obj) 向流中写入一个对象。
四、字符流【重点
】
4.1 字符抽象类
Reader:字符输入流
- public int read(){}。
- public int read(char[] c){}。
- public int read(char[] b,int off,int len){}。
Writer:字符输出流
- public void write(int n){}。
- public void write(String str){}。
- public void write(char[] c){}。
4.2 字符节点流
FileWriter:
- public void write(String str) 。
- 一次写多个字符,将b数组中所有字符,写入输出流。
FileReader:
- public int read(char[] c) 。
- 从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1。
四、字符流【重点
】
4.1 字符抽象类
Reader:字符输入流
- public int read(){}。
- public int read(char[] c){}。
- public int read(char[] b,int off,int len){}。
Writer:字符输出流
- public void write(int n){}。
- public void write(String str){}。
- public void write(char[] c){}。
4.2 字符节点流
FileWriter:
FileWriter fw=new FileWriter("d:\\buffer.txt");
- public void write(String str) 。
- 一次写多个字符,将b数组中所有字符,写入输出流。
FileReader:
FileReader fr=new FileReader("d:\\write.txt");
- public int read(char[] c) 。
- 从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1。
4.4 打印流
PrintWriter:
PrintWriter pw=new PrintWriter("d:\\print.txt");
//2打印
pw.println(97);
- println会直接输出你所输入的字符
- 封装了print() / println()方法,支持写入后换行。
- 支持数据原样打印。
4.5 转换流
转换流:
InputStreamReader
FileInputStream fis=new FileInputStream("d:\\write.txt"); InputStreamReader isr=new InputStreamReader(fis, "gbk");
OutputStreamWriter
FileOutputStream fos=new FileOutputStream("d:\\info.txt"); OutputStreamWriter osw=new OutputStreamWriter(fos, "utf-8");
- 可将字节流转换为字符流。
- 可设置字符的编码方式。
- 对象流
- 内存流
序列化
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
ing:
1、根据处理数据类型的不同分为:
字符流:1)Reader 读取字符流的抽象类
常用方法: read() 读取单个字符
read(char[] cbuf) 将字符读入数组。
read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。
close() 关闭该流并释放与之关联的所有资源。
2)Writer 写入字符流的抽象类
常用方法:write(int c) 写入单个字符。
write(String str) 写入字符串
write(String str, int off, int len) 写入字符串的某一部分。
write(char[] cbuf) 写入字符数组。
write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
flush() 刷新该流的缓冲。
close() 关闭此流,但要先刷新它。
字节流:
1)InputStream 此抽象类是表示字节输入流的所有类的超类
常用方法:read() 从输入流中读取数据的下一个字节。
read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。
close() 关闭此输入流并释放与该流关联的所有系统资源。
2) OutputStream 此抽象类是表示字节输出流的所有类的超类
常用方法:write(int b) 将指定的字节写入此输出流。
write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。
write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的
flush() 刷新此输出流并强制写出所有缓冲的输出字节。
close() 关闭此输出流并释放与此流有关的所有系统资源。
2、根据数据流向不同分为:输入流和输出流
3、字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
4、字节流和字符流的区别:
(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
(2)处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。
5、结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
6、输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。
RandomAccessFile 随机访问流
…seek(1);偏移量 //表示指针所指方向
拥有指针
针对文件写入操作的时候,不会清空数据,从指针开始进行写入覆盖原有的数据。
复制文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6F5XtDE5-1599036743181)(E:\zuomian\笔记\image\断点续传.PNG)]
读写 =BIO
先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
6、输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。
RandomAccessFile 随机访问流
…seek(1);偏移量 //表示指针所指方向
拥有指针
针对文件写入操作的时候,不会清空数据,从指针开始进行写入覆盖原有的数据。
复制文件: