一、缓冲流
1、概念: 一种自带缓冲区的字节流、可提高原始字节流、字符流读写数据的性能。
2、缓冲流高性能原理: 磁盘与内存之间有一块存储区域,当磁盘向内存传输数据时,先传输到缓冲区,当缓冲区满了之后,一起传输给内存中,如图所示。
3、缓冲流类型
- BufferedInputStream 字节缓冲输入流
- BufferedOutputStream 字节缓冲输出流
- BufferedReader 字符缓冲输入流
- BufferedWriter 字符缓冲输出流
4、字节缓冲流性能优化原理: 字节缓冲流自带8KB缓冲池,以便我们读取写入数据。
5、创建缓冲流API
构造器 | 说明 |
---|---|
BufferedInputStream(InputStream in) | 为指定字节输入流创建缓冲区 |
BufferedInputStream(InputStream in,int size) | 为指定字节输入流创建指定大小的缓冲区 |
BufferedOutputStream(OutputStream in) | 为指定字节输出流创建缓冲区 |
BufferedOutputStreamStream(OutputStream in,int size) | 为指定字节输出流创建指定大小的缓冲区 |
BufferedReader(Reader in) | 为指定字符输入流创建缓冲区 |
BufferedReader(Reader in,int size) | 为指定字符输入流创建指定大小的缓冲区 |
BufferedWriter=(Writer in) | 为指定字符输出流创建缓冲区 |
BufferedWriterStream(Writer in,int size) | 为指定字符输出流创建指定大小的缓冲区 |
缓冲字符流新增API
方法 | 说明 |
---|---|
String readLine() | 读取文本的一行 |
public class BufferedStreamDemo{public static void main(String[] args) {try(/*1、创建字符缓冲输入流*/BufferedReader br = new BufferedReader(new FileReader("D:\\JavaBase\\JavaSEpro\\src\\com\\zengoo\\logback\\loco.txt"));) {while(br.ready()){System.out.println(br.readLine());}System.out.println("复制完整");} catch (IOException e) {throw new RuntimeException(e);}}
}
二、转换流
1、概念: 由于不同编码会导致读取乱码问题,所以转换流能够转换成指定编码的输入流。
2、类型
- InputStreamReader 字符输入转换流
- OutputStreamReader 字符输出转换流
3、获取转换流
构造器 | 说明 |
---|---|
InputStreamReader(InputStream is) | 把原始字节流按照代码默认编码转换成字符输入流 |
InputStreamReader(InputStream is, String charset) | 把原始字节流按照指定编码转换成字符输入流 |
OutputStreamWriter(OutputStream is) | 把原始字节流按照代码默认编码转换成字符输出流 |
OutputStreamReader(OutputStream is, String charset) | 把原始字节流按照指定编码转换成字符输出流 |
三、序列化与反序列化
1、对象序列化的概念: 以内存为基准,把内存中的对象存储到磁盘文件中,称为序列化,反之则为反序列化。
2、对象字节IO流:
- ObjectInputStream
(1)获取输入流
构造器 | 说明 |
---|---|
ObjectInputStream(InputStream out) | 把低级字节输入流包装成高级的对象字节输入流 |
(2)写入输入流
方法 | 说明 |
---|---|
void readObject() | 把对象从流中读出 |
反序列化对象
public class ObjectOutputStreamDemo {public static void main(String[] args) {/*1、空对象*/User user = new User();try (/*2、创建对象字节流*/ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\JavaBase\\JavaSEpro\\src\\com\\zengoo\\logback\\out.txt"));){user = (User) ois.readObject();System.out.println(user);} catch (IOException | ClassNotFoundException e) {throw new RuntimeException(e);}}
}/*打印输出*/
User{id='9fd3f9ea-2783-4327-bdd3-b10e7683d59a', username='Administrator', password='asfdsgasdfdEW1245EWFC', age=25}
- ObjectOutputStream
获取输出
构造器 | 说明 |
---|---|
ObjectOutputStream(OutputStream out) | 把低级字节输出流包装成高级的对象字节输出流 |
写入数据
方法 | 说明 |
---|---|
void writeObject(Object obj) | 将对象序列化输出至流中 |
序列化对象
public class ObjectOutputStreamDemo {public static void main(String[] args) {/*1、对象初始化*/User user = new User(UUID.randomUUID().toString(),"Administrator","asfdsgasdfdEW1245EWFC",25);try (/*2、创建对象字节流*/ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\JavaBase\\JavaSEpro\\src\\com\\zengoo\\logback\\out.txt"));){/*3、写入文件*/oos.writeObject(user);System.out.println("序列化完成");} catch (IOException e) {throw new RuntimeException(e);}}
}/*实现Serializable接口才能序列化*/
class User implements Serializable{private String id;private String username;private String password;private int age;public User() {}public User(String id, String username, String password, int age) {this.id = id;this.username = username;this.password = password;this.age = age;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
out.txt
�� sr com.zengoo.logback.User8�b�Xy� I ageL idt Ljava/lang/String;L passwordq ~ L usernameq ~ xp t $9fd3f9ea-2783-4327-bdd3-b10e7683d59at asfdsgasdfdEW1245EWFCt
Administrator
注意: 若对象中有属性不希望被序列化,则添加transient关键字声明
四、打印流
1、概念: 打印流实现方便、高效的在文件中写入数据。
2、类型
- PrintStream(支持字节打印)
构造器 | 说明 |
---|---|
PrintStream(OutputStream out) | 打印流直接通向字节输出流管道 |
PrintStream(File f) | 打印流直接通向文件对象 |
PrintStream(String apth) | 打印流直接通向文件路径 |
方法 | 说明 |
---|---|
void print(E e) | 打印任何类型的数据 |
打印数据到文件示例
public class PrintDemo {public static void main(String[] args) {try(/*1、创建打印流*/PrintStream printStream = new PrintStream("D:\\JavaBase\\JavaSEpro\\src\\com\\zengoo\\logback\\out.txt");) {printStream.println("东临碣石".toCharArray());printStream.println("以观沧海".toCharArray());printStream.println("水何澹澹".toCharArray());printStream.print("山岛竦峙".toCharArray());System.out.println("打印完毕");} catch (FileNotFoundException e) {throw new RuntimeException(e);}}
}
out.txt
东临碣石
以观沧海
水何澹澹
山岛竦峙
- PrintWriter(支持字符打印)
构造器 | 说明 |
---|---|
PrintWriter(OutputStream out) | 打印流直接通向字节输出流管道 |
PrintWriter(Writer writer) | 打印流直接通向字符输出流管道 |
PrintWriter(File f) | 打印流直接通向文件对象 |
PrintWriter(String apth) | 打印流直接通向文件路径 |
方法 | 说明 |
---|---|
void print(E e) | 打印任何类型的数据 |
3、输出语句重定向(打印流的应用)
主要用于将控制台打印的语句输出到文件中保存。
PrintStream ps = new PrintStream("文件地址");
System.setOut(ps)
五、Propertis
1、概念: Propertis 意思是 属性,所以它虽然是隶属于集合类,但通常不用它作为集合使用。
2、作用: Propertis代表一个属性文件,可以将自己的键值对信息存入到数据文件中去。
3、Propertis常用API
方法 | 说明 |
---|---|
void load(InputStream inStream) | 从输入字节流中读取属性列表(键值对) |
void load(Reader reader) | 从输入字节流中读取属性列表(键值对) |
void store(OutputStream out, String comments) | 将此属性列表写入此Propertis列表中,以适用于使用load(InputStream) 方法的格式写入输出字节流 |
void store(Writer writer, String comments) | 将此属性列表写入此Propertis列表中,以适用于使用load(InputStream) 方法的格式写入输出字符流 |
Object setProperty(String key, String value) | 保存键值对(put) |
String setProperty(String key) | 使用键搜索属性值(get) |
Set<String> stringPropertiesNames() | 所有键名集合(keySet()) |
使用Properties示例
public class PropertiesDemo {public static void main(String[] args) throws IOException {/*创建属性集合*/Properties properties = new Properties();properties.setProperty("id","123");properties.setProperty("username","Admin");properties.setProperty("password","avtbhn324t@");properties.setProperty("sex","male");System.out.println(properties);/*保存管道*/properties.store(new FileWriter("D:\\JavaBase\\JavaSEpro\\src\\com\\zengoo\\logback\\users.properties"),"It's user base-info");}
}/*打印输出*/
{password=avtbhn324t@, sex=male, id=123, username=Admin}
users.properties
#It's user base-info
password=avtbhn324t@
sex=male
id=123
username=Admin
加载Properties文件
public class PropertiesLoadDemo {public static void main(String[] args) throws IOException {Properties properties = new Properties();properties.load(new FileReader("D:\\JavaBase\\JavaSEpro\\src\\com\\zengoo\\logback\\users.properties"));System.out.println(properties);}
}/*打印输出*/
#It's user base-info
password=avtbhn324t@
sex=male
id=123
username=Admin
获取Properties中的数据
public class PropertiesGet {public static void main(String[] args) throws IOException {Properties properties = new Properties();properties.load(new FileReader("D:\\JavaBase\\JavaSEpro\\src\\com\\zengoo\\logback\\users.properties"));/*根据键值获取值*/System.out.println(properties.getProperty("username"));System.out.println(properties.getProperty("password"));/*获取所有键名*/System.out.println(properties.stringPropertyNames());}
}/*打印输出*/
Admin
avtbhn324t@
[password, sex, id, username]
六、IO框架——commons-io
具体的API查看commons-io的技术文档。
1、概述: commons-io是apache开源基金组织提供的一组有关IO操作的类库,可以提高IO功能开发的效率。
2、主要类
- FileUtils
常用API
方法 | 说明 |
---|---|
String readFileToString(File file, String encoding) | 读取文件中的数据,返回字符串 |
void copyFile(File srcFile, File destFile) | 复制文件 |
void copyDirectoryToDirectory(File srcFile, File destDir) | 复制文件夹 |
- IOUtils
3、使用commons-io
(1)下载commons-io-xx.jar
(2)加载到项目中
(3)导包使用