文章目录
- 0. 老韩带你学英语
- 1.文件
- 1.1 文件介绍
- 1.2 文件流
- 1.3 流
- 1.4 输入流
- 1.5 输出流
- 1.6 创建文件对象相关构造器和方法
- 1.7 获取文件相关信息
- 1.8 常用文件操作
- 2.IO流原理及流的分类
- 2.1 IO流分类
- 3.FileInputStream和FileOutputStream
- 4.FileReader和FileWriter
- 4.1 基本介绍
- 5.节点流和处理流
- 5.1 基本介绍
- 5.2 节点流和处理流区别和联系
- 5.3 处理流的功能主要体现
- 6.BufferInputStream和BufferedOutputStream
- 7.BufferedReader和BufferedWriter
- 8.对象流-ObjectInputStream和ObjectOutputStream
- 8.1注意事项和细节说明
- 8.2节点流和处理流
- 8.3打印流-PrintStream和PrintWriter
- 9.转换流InputStreamReader和OutputStreamWriter
- 10.Properties类
- 10.1 基本介绍
- 10.2Properties常见方法
0. 老韩带你学英语
英语 | 含义 |
transformation | 转型 |
- 纸上得来终觉浅,绝知此事要躬行
- 读书破万卷,下笔如有神
- 读码破万行,写码如有神
- 需求-》思路-》代码
1.文件
1.1 文件介绍
文件是保存数据地方,比如大家经常使用的word文档,txt文件,excel文件…都是文件,它即可以保存一张图片,也可以保持视频,声音。
1.2 文件流
文件是在程序中以流的形式来操作的
1.3 流
数据在数据源(文件)和程序(内存)之间经历的路径
1.4 输入流
数据从数据源(文件)到程序(内存)的路径
1.5 输出流
数据从程序(内存)到数据源(文件)的路径
1.6 创建文件对象相关构造器和方法
相关方法
new File(String pathname)//根据路径构建一个File对象
new File(File parent,String child)//根据父目录文件+子路径构建
new File(String parent,String child)//根据父目录+子路径构建
1.7 获取文件相关信息
- getName
- getAbsolutePath
- getParent
- length
- exists
- isFile
- isDirectory
1.8 常用文件操作
目录操作和文件删除
- mkdir创建一级目录,mkdirs创建多级目录,delete删除空目录或文件
2.IO流原理及流的分类
- I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输如读写文件、网络通讯等
- java程序中,对于数据的输入/输出操作以流"的方式进行。
- java.io包下提供了各种"流“类和接口,用以获取不同种类的数据,并能通过方法输入或输出数据
2.1 IO流分类
- 按操作数据单位不同分为:字节流二进制文件,字符流(按字符)文本文件
- 按数据流流向不同分为:输入流、输出流
- 按流的角色不同分为:节点流、处理流、包装流
抽象基类 | 字节流 | 字符流 |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
3.FileInputStream和FileOutputStream
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class _05_Output {
public static void main(String[] args) {
}
@Test
public void writeFile(){
String filePath = "e:\\a.txt";
FileOutputStream fileOutputStream = null;
try {
//1. new FileOutputStream(filePath) 创建方式,当写入内容是,会被覆盖1原来的内容
//2. new FileOutputStream(filePath,true)创建方式,当写入内容是,
fileOutputStream = new FileOutputStream(filePath,true);
String str = "hello world-----------sadfasddf";
//fileOutputStream.write(str.getBytes());
fileOutputStream.write(str.getBytes(),0,str.length());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
import org.junit.jupiter.api.Test;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;
public class _04_FileInput {
public static void main(String[] args) {
}
@Test
public void readFile01(){
String filePath = "e:\\hello.txt";
int readData = 0;
FileInputStream fileInputStream = null;
try{
fileInputStream = new FileInputStream(filePath);
while((readData = fileInputStream.read()) != -1){
System.out.println((char)readData);
}
}catch (IOException e){
e.printStackTrace();
}finally {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void readFile02(){
String filePath = "e:\\hello.txt";
byte[] buf = new byte[8];
int readLen = 0;
FileInputStream fileInputStream = null;
try{
fileInputStream = new FileInputStream(filePath);
while((readLen = fileInputStream.read(buf)) != -1){
System.out.println(new String(buf,0,readLen));
}
}catch (IOException e){
e.printStackTrace();
}finally {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4.FileReader和FileWriter
4.1 基本介绍
FileReader和FileWriter是字符流,即按照字符来操作io
方法 | 含义 |
new FileReader(File/String) | 构造函数 |
read | 每次读取单个字符,返回该字符,如果到文件末尾返回-1 |
read(char[][) | 批量读取多个字符到数组,返回读取到字符数,如果到文件末尾返回-1 |
new String(char[]) | 将char[] 转换成String |
new String(char[],off,len) | 将char[] 的指定部分转换成String |
new FileWriter(File/String) | 覆盖模式,相当于流的指针在首端 |
new FileWriter(File/String,true) | 追加模式,相当于流的指针在尾端 |
write(int) | 写入单个字符 |
write(char[]) | 写入指定数组 |
write(char[],off,len) | 写入指定数组的指定部分 |
write(string) | 写入整个字符串 |
write(string,off,len) | 写入字符串指定部分 |
import java.io.FileWriter;
import java.io.IOException;
public class _08_FileWriter02 {
public static void main(String[] args) {
String filePath = "e:\\b.txt";
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(filePath);
for (int i = 0; i < 10; i++) {
fileWriter.write("hello");
fileWriter.write(11);
fileWriter.write('A');
char[] chars = {'a','b'};
fileWriter.write(chars);
fileWriter.write("韩顺平教育".toCharArray(),0,3);
fileWriter.write("abc",0,1);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
5.节点流和处理流
5.1 基本介绍
- 节点流可以从一个特定的数据源读写数据,如FileReader,FileWriter
- 处理流(也叫包装流)是"连接"在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如BufferedReader,BufferedWritter
5.2 节点流和处理流区别和联系
- 节点流是底层流/低级流,直接跟数据源相接
- 处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供方便的方法来完成输入输出
- 处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连
5.3 处理流的功能主要体现
- 性能提高:主要以增加缓冲的方式来提高输入输出的效率
- 操作便捷:处理流可能提供一系列便捷方法来一次输入输出大批量的数据,使用更加灵活方便
6.BufferInputStream和BufferedOutputStream
7.BufferedReader和BufferedWriter
8.对象流-ObjectInputStream和ObjectOutputStream
- 序列化就是在保存数据时,保存数据的值和数据类型
- 反序列化就是在恢复数据时,恢复数据的值和数据类型
- 需要让其某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类1必须实现如下两个接口之一:Serializable 与Externalizable
8.1注意事项和细节说明
- 读写顺序要一致
- 要求实现序列化或反序列化对象,需要实现Serializable
- 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性
- 序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
- 序列化对象时,要求里面属性的类型也需要实现序列化接口
- 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经1默认实现了序列化。
8.2节点流和处理流
函数 | 含义 | 类型 | 默认设备 |
System.in | 标准输入 | InputStream | 键盘 |
System.out | 标准输出 | PrintStream | 显示器 |
- InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成(转换)Reader(字符流)
- OutputStreamWriter:Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流)
3… 当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
可以在使用时指定编码格式(比如utf-8,gb2312,iso8859-1)
8.3打印流-PrintStream和PrintWriter
打印
9.转换流InputStreamReader和OutputStreamWriter
10.Properties类
10.1 基本介绍
- 专门用于读写配置文件的集合类,键=值,键=值
- 注意:键值对不要有空格,值不需要用引号一起来,默认类型是String
10.2Properties常见方法
方法 | 含义 |
load | 加载配置文件的键值对到Properties对象 |
list | 将数据显示到指定设备 |
getProperty(key) | 根据键获取值 |
setProperties(key,value) | 设置键值对到Properties对象 |
store | 将properties中的键值对存储到配置文件,在idea中,保存信息到配置文件,如果含有中文,会存储为unicode码 |