目录
一、流的概念
二、流的分类
1.按方向
2.按单位:
3.按功能:
三、字节流
1、文件字节流
(1) FileInputStream:
(2)FileOutputStream:
(3)完成复制文件
2、字节缓冲流
(1)BufferedInputStream:
(2)BufferedOutputStream:
3、对象流
(1)序列化:
(2)反序列化:
四、字符编码
五、字符流
1. 文件字符流
(1)FileReader
(2)FileWriter
(3)完成复制文件
2.字符缓冲流
(1)BufferedReader
(2)BufferedWriter
3.打印流 ——PrintWriter
六、转换流
1. InputStreamReader
2.OutputStreamWriter
七、File类
1.分隔符
2.文件操作
3.文件夹操作
4. FileFilter 接口
5.递归遍历和递归删除
附加:Properties(属性集合)
1.特点:
2.使用
一、流的概念
概念:内存与存储设备之间传输数据的通道。
数据借助流传输。
二、流的分类
1.按方向
输入流(Input):将<存储设备>中的内容读入到<内存>中。
输出流(Output):将<内存>中的内容写入到<存储设备>中。
2.按单位:
字节流:以字节为单位,可以读写所有的数据。
字符流:以字符为单位,可以读写文本数据。
3.按功能:
节点流:具有实际传输数据的读写功能。
过滤流:在节点流的基础之上增强功能。
三、字节流
字节流的父类(抽象类)
InputStream:字节输入流
OutputStream:字节输出流
1、文件字节流
(1) FileInputStream:
public int read(byte[] b)
从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数,如果达到文件的尾部,则返回-1。
(2)FileOutputStream:
public void write(byte[] b)
一次写多个字节,将b数组中所有字节,写入输出流。
(3)完成复制文件
使用文件字节流实现文件的复制,先读取(FileInoutStream)再写入(FileOutputStream)。
2、字节缓冲流
缓冲流:BufferedInputStream / BufferedOutputStream
(1)提高IO效率,减少访问磁盘的次数;
(2)数据存储在缓冲区中,flush是将缓冲区的内容写入文件中。
(1)BufferedInputStream:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
/**
* 使用字节缓冲流读取
* BufferedInputStream
*/
public class Demo04 {
public static void main(String[] args)throws Exception {
//1.创建BufferedInputStream
FileInputStream file = new FileInputStream("d:\\aaa.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(file);
//2.读取
//方法一:
// int data = 0;
// while((data=bufferedInputStream.read())!=-1){
// System.out.println((char) data);
// }
//方法二:
byte[] buf = new byte[1024];
int count = 0;
while((count=bufferedInputStream.read(buf))!=-1){
System.out.println(new String(buf,0,count));
}
//3.关闭
bufferedInputStream.close();
}
}
(2)BufferedOutputStream:
3、对象流
对象流:ObjectOutputStream / ObjectInputStream
(1)增强了缓冲区功能
(2)增强了读写8种基本数据类型和字符串功能
(3)增强了读写对象的功能:
readObject() 从流中读取一个对象
writeObiect(Object obj) 向流中写入一个对象
使用流传输对象的过程称为序列化、反序列化。
(1)序列化:
(2)反序列化:
注意事项:
1. 序列化类必须实现Serializable接口;
2. 序列化类中的对象属性也要实现Serializable接口;
3. 写序列化版本号ID,可以保证序列化和反序列化的类是同一个类;
4. 使用 transient(瞬间的) 修饰属性,这个属性不能序列化;
5. 静态属性也不能序列化;
6. 序列化多个对象,放在同个集合里,一次序列化 / 反序列化。
四、字符编码
ISO-8859-1 收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。
UTF-8 针对Unicode码表的可变长度字符编码。
GB2312 简体中文
GBK 简体中文、扩充
BIG5 台湾,繁体中文
当编码方式和解码方式不一致时,就会出现乱码。
五、字符流
字符流的父类(抽象类)
Reader:字符输入流
Writer:字符输出流
1. 文件字符流
(1)FileReader
从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数,如果达到文件的尾部,则返回-1。
pubic int read (char[] c)
(2)FileWriter
一次写多个字符,将b数组中所有字符,写入输出流。
public void write(String str)
(3)完成复制文件
2.字符缓冲流
缓冲流:BufferedReader / BufferedWriter
高效书写
支持输入换行符
可一次写一行、读一行。
(1)BufferedReader
import java.io.BufferedReader;
import java.io.FileReader;
/**
* 使用字符缓冲流读取文件
*/
public class Demo4 {
public static void main(String[] args) throws Exception{
//1.创建缓冲流
FileReader fileReader = new FileReader("d:\\bbb.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
//2.读取
//2.1方法一:整个读取
// char[] buf = new char[1024];
// int count = 0;
// while((count=bufferedReader.read(buf))!=-1){
// System.out.println(new String(buf,0,count));
// }
//2.2方法二:一行一行的读取
String line= null;
while((line=bufferedReader.readLine())!=null){
System.out.println(line);
}
//3.关闭
bufferedReader.close();
}
}
(2)BufferedWriter
import java.io.BufferedWriter;
import java.io.FileWriter;
/**
* BufferedWriter的使用
*/
public class Demo5 {
public static void main(String[] args)throws Exception {
//1.创建BufferedWriter对象
FileWriter fileWriter = new FileWriter("d:\\bbb.txt");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
//2.写入
for (int i = 0; i < 10; i++) {
bufferedWriter.write("好好学习java\n");
bufferedWriter.newLine(); //写入一个换行符,相当于\n
bufferedWriter.flush();
}
//3.关闭
bufferedWriter.close();
System.out.println("执行完毕");
}
}
3.打印流 ——PrintWriter
封装了print() / println()方法,支持写入后换行。
支持数据原样打印。
import java.io.PrintWriter;
/**
* PrintWriter的使用
*/
public class Demo6 {
public static void main(String[] args) throws Exception{
//1.创建打印流
PrintWriter printWriter = new PrintWriter("d:\\print.txt");
//2.打印
printWriter.println(97);
printWriter.println(true);
printWriter.println('2');
printWriter.println('a');
printWriter.println(3.13);
//3.关闭
printWriter.close();
System.out.println("执行完");
}
}
六、转换流
桥转换流:InputStreamReader / OutputStreamWriter
可将字节流转换为字符流。
可设置字符的编码方式。
1. InputStreamReader
2.OutputStreamWriter
七、File类
概念:代表物理盘符中的一个文件或文件夹。
1.分隔符
2.文件操作
public class Demo10 {
public static void main(String[] args) throws IOException, InterruptedException {
fileOpe();
}
public static void fileOpe() throws IOException, InterruptedException {
//1.创建文件
File file = new File("d:\\file.txt");
if (!file.exists()){
boolean b = file.createNewFile();
System.out.println("创建结果:"+b);
}
//2.删除文件
//2.1直接删除
System.out.println("删除结果:"+file.delete());
//2.2使用jvm退出时删除
file.deleteOnExit();
Thread.sleep(5000); //休眠结束,就删除
//3.获取文件信息
System.out.println("获取文件的绝对路径:"+ file.getAbsolutePath());
System.out.println("获取路径:"+file.getPath());
System.out.println("获取文件名称:"+file.getName());
System.out.println("获取父目录:"+file.getParent());
System.out.println("获取文件的长度:"+file.length());
System.out.println("获取文件的创建时间:"+new Date(file.lastModified()).toLocaleString());
//4.判断
System.out.println("是否可写:"+file.canWrite());
System.out.println("是否是文件:"+file.isFile());
System.out.println("是否隐藏:"+file.isHidden());
}
}
3.文件夹操作
public class Demo10 {
public static void main(String[] args) throws IOException, InterruptedException {
directoryOpe();
}
public static void directoryOpe() throws IOException, InterruptedException {
//1.创建文件夹
File dir = new File("d:\\aa\\bb\\cc");
if (!dir.exists()){
dir.mkdir(); //只能创建单级目录
dir.mkdirs(); //创建多级目录
}
//2.删除文件夹
//2.1直接删除 只能删除空目录
System.out.println("删除结果:"+dir.delete()); //只删除最后一个,并且是空目录
//2.2使用jvm退出时删除
dir.deleteOnExit();
Thread.sleep(5000); //休眠结束,就删除
//3.获取文件夹信息
System.out.println("获取文件的绝对路径:"+ dir.getAbsolutePath());
System.out.println("获取路径:"+dir.getPath());
System.out.println("获取文件夹名称:"+dir.getName()); //最底层的文件名称
System.out.println("获取父目录:"+dir.getParent());
System.out.println("获取文件的创建时间:"+new Date(dir.lastModified()).toLocaleString());
//4.判断
System.out.println("是否是文夹件:"+dir.isFile());
System.out.println("是否隐藏:"+dir.isHidden());
//5.遍历文件夹
File file = new File("d:\\aa");
String[] list = file.list();
for (String string : list){
System.out.println(string);
}
}
}
4. FileFilter 接口
public interface FileFilter
boolean accept (File pathname)
当调用File类中的ListFiles()方法时,支持传入FileFilter接口实现类,对获取文件进行过滤,只有满足条件的文件才能出现在listFiles()的返回值中。
5.递归遍历和递归删除
public class Demo11 {
public static void main(String[] args) {
listDir(new File("c:\\MyJavaStudy"));
deleteDir(new File("c:\\MyJavaStudy"));
}
//递归遍历文件夹
public static void listDir(File dir){
File[] files = dir.listFiles();
System.out.println(dir.getAbsolutePath());
if (files!=null&&files.length>0){
for (File file:files){
if (file.isDirectory()){
listDir(file); //递归
}else {
System.out.println(file.getAbsolutePath());
}
}
}
}
//递归删除文件夹
public static void deleteDir(File dir){
File[] files = dir.listFiles();
System.out.println(dir.getAbsolutePath());
if (files!=null&&files.length>0){
for (File file:files){
if (file.isDirectory()){
deleteDir(file); //递归
}else {
//删除文件
System.out.println(file.getAbsolutePath()+"删除:"+file.delete());
}
}
}
//删除空文件夹
System.out.println(dir.getAbsolutePath()+"删除:"+dir.delete());
}
}
附加:Properties(属性集合)
1.特点:
1. 存储属性名和属性值
2.属性名和属性值都是字符串类型
3.没有泛型
4.和流有关
2.使用
public class Demo08 {
public static void main(String[] args) throws IOException {
//1.创建集合
Properties properties = new Properties();
//2.添加元素
properties.setProperty("username","zhangsan");
properties.setProperty("age","20");
System.out.println(properties.toString());
//3.遍历
//3.1 keySet
//3.2 entrySet
//3.3 StringPropertyNames()方法
Set<String> strings = properties.stringPropertyNames();
for (String pro : strings){
System.out.println(pro+"----"+properties.getProperty(pro));
}
//4.和流有关的方法
// 4.1 list方法 打印列表
PrintWriter pw = new PrintWriter("d:\\print.txt");
properties.list(pw);
pw.close();
//4.2 store方法 保存
FileOutputStream fileOutputStream = new FileOutputStream("d:\\store.properties");
properties.store(fileOutputStream,"注释");
fileOutputStream.close();
//4.3 load方法 加载
Properties properties1 = new Properties();
FileInputStream fileInputStream = new FileInputStream("d:\\store.properties");
properties1.load(fileInputStream);
fileInputStream.close();
System.out.println(properties1.toString());
}
}
重在理解!
感谢ლ(°◕‵ƹ′◕ლ)!!!