I/O框架
- 流
- 1.什么是流
- 2.流的分类
- 字节流
- 1.文件字节流
- 2.字节缓冲流
- 3.对象流
- 3.1序列化
- 3.2反序列化
- 3.3序列化和反序列化的注意事项
- 字符流
- 1.文件字符流
- 2.字符缓冲流
- 3.打印流
- 转换流
- File类
- 1.FileFilter接口
流
1.什么是流
- 概念:内存与存储设备之间数据传输的通道
2.流的分类
- 按照流向
- 输入流:将存储设备中的数据内容传输到内存中
- 输出流:将内存中的数据内容写入存储设备中
- 按单位
- 字节流:以字节为单位,可读写所有数据
- 字符流:以字符为单位,只能读写文本数据
- 按功能
- 节点流:具有实际传输数据的读写功能
- 过滤流:在节点流的基础上增强功能
字节流
- 字节流的父类(抽象类 超类)
-InputStream:字节输入流
-OutStream:字节输出流
1.文件字节流
- FileInputSteam:
- public int read(byte[] b)//从流中读取多个字节,将读取到的内容存入b数组,返回实际读到的字节数;如果达到尾部折返回-1;
public class Demo01 {
public static void main(String[] args) throws Exception{
FileInputStream fileInputStream = new FileInputStream("d://1.txt");
// //单个字节读取
// int count=0;
// while ((count=fileInputStream.read())!=-1){
// System.out.print((char)count);
// }
//一次读取多个字节
byte[] buf=new byte[3];
int count1=0;
while ((count1=fileInputStream.read(buf))!=-1){
System.out.println(new String(buf,0,count1));
}
fileInputStream.close();
}
}
- FileOutSteam:
- public void wirte(byte[] b)//一次写多个字节,将b数组中所有的字节,写入输出流
public class Demo02 {
public static void main(String[] args) throws Exception{
//如果再添加true作为第二个参数,可以一直追加,否则覆盖数据
//FileOutputStream fileOutputStream = new FileOutputStream("d://bbb.txt",true);
FileOutputStream fileOutputStream = new FileOutputStream("d://bbb.txt");
//写入文件
// fileOutputStream.write(97);
// fileOutputStream.write('c');
// fileOutputStream.write('d');
String s = new String("abd");
fileOutputStream.write(s.getBytes());
//关闭流
fileOutputStream.close();
}
}
- 综合使用
/**
* 使用字节流实现文件复制
*/
public class Demo03 {
public static void main(String[] args) throws Exception{
//输入流
FileInputStream fileInputStream = new FileInputStream("d://1.jpg");
//输出流
FileOutputStream fileOutputStream = new FileOutputStream("d://2.jpg");
//创建缓存数组
byte[] bytes=new byte[1024];
int count=0;
//边读边写
while ((count=fileInputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0,count);
}
//关闭资源
fileInputStream.close();
fileOutputStream.close();
System.out.println("复制完成");
}
}
2.字节缓冲流
- 缓冲流:BufferedInputStream/BufferedOutputStream
- 提高io效率,减少访问磁盘的次数
- 数据存储在缓冲区中,flush是将缓冲区的内容写入文件中,也可以直接close
- BufferedInputStream
/**
* 使用字节缓冲流
*/
public class Demo04 {
public static void main(String[] args) throws Exception{
//创建字节缓冲流
FileInputStream fileInputStream = new FileInputStream("d://1.txt");
BufferedInputStream bis = new BufferedInputStream(fileInputStream);
//读取数据
int count=0;
while ((count=bis.read())!=-1){
System.out.println((char)count);
}
//关闭资源
bis.close();
}
}
- BufferedOutputStream
/**
* 使用字节缓冲流写入文件
*/
public class Demo05 {
public static void main(String[] args) throws Exception{
//创建字节缓冲输出流
FileOutputStream fileOutputStream = new FileOutputStream("d:1.txt");
BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
//写入数据
String s = new String("abcdefg");
bos.write(s.getBytes());
//关闭资源
bos.close();
System.out.println("写入成功!");
}
}
3.对象流
- 对象流:ObjectInputStream/ObjectOutputStream
- 增强了缓冲区功能
- 增强了读写8种基本数据类型和字符串功能
- 增强了读写对象的功能
- readObject()从流中读取一个对象
- writeObject(Object obj)向流中写入一个对象
- 使用流传输对象的过程称为序列化和反序列化
- 实体类需要实现Serializable才可以序列化和反序列化
public class Student implements Serializable {
private int sno;
private String name;
public Student() {
}
public Student(int sno, String name) {
this.sno = sno;
this.name = name;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"sno=" + sno +
", name='" + name + '\'' +
'}';
}
}
3.1序列化
/**
* 使用对象流实现序列化
*/
public class Demo06 {
public static void main(String[] args) throws Exception{
//创建对象流
FileOutputStream fileOutputStream = new FileOutputStream("d://1.txt");
ObjectOutputStream oos = new ObjectOutputStream(fileOutputStream);
//创建student对象
Student student = new Student(23, "张三");
//序列化写入文件
oos.writeObject(student);
//关闭资源
oos.close();
}
}
3.2反序列化
/**
* 使用对象流实现反序列化
*/
public class Demo07 {
public static void main(String[] args) throws Exception{
//创建对象流
FileInputStream fileInputStream = new FileInputStream("d://1.txt");
ObjectInputStream ois = new ObjectInputStream(fileInputStream);
//实现反序列化读取数据
Student student = (Student)ois.readObject();
//关闭资源
ois.close();
System.out.println(student.toString());
}
}
3.3序列化和反序列化的注意事项
- 序列化类必须要实现Serializable接口
- 序列化类中对象属性也需要实现Serializable接口
- 序列化版本id,保证序列化和反序列化是同一个类
private static final long SerialVersionUIDAdder - 使用transient(瞬间)修饰属性,这个属性不能序列化
- 静态属性不可以序列化
- 可以同时序列化多个对象,借助集合实现
字符流
- 当编码方式与解码方式不一致时,就会出现乱码
- 字符流的父类(抽象类 超类)
- Read:字符输入流
- Write:字符输出流
1.文件字符流
- FileReader:
- public int read(char[] c)//从流中读取多个字符,将读到的内容存入c数组中,返回实际读到的字符数;如果达到文件的尾部,则返回-1
public class Demo09 {
public static void main(String[] args) throws Exception{
//创建字符流
FileReader fileReader = new FileReader("d://1.txt");
//读取
// int data=0;
// while ((data=fileReader.read())!=-1){
// System.out.println((char) data);
// }
char[] chars=new char[1024];
int count=0;
while ((count=fileReader.read(chars))!=-1){
System.out.println(new String(chars,0,count));
}
//关闭资源
fileReader.close();
}
}
- FileWriter:
- public void wirte(String str)//一次写多个字符,将b数组中所有的字符,写入输出流中
public class Demo10 {
public static void main(String[] args) throws Exception{
//创建字符流
FileWriter fileWriter = new FileWriter("d://1.txt");
//写入内容到文件
for (int i = 0; i < 10; i++) {
fileWriter.write("世界上最好的语言是java\n");
fileWriter.flush();
}
//关闭资源
fileWriter.close();
}
}
- 综合使用
/**
* 使用字符流来实现复制文件,只可以复制文本,不可以复制图片和二进制文件
*/
public class Demo11 {
public static void main(String[] args) throws Exception{
//创建字符流
FileReader fileReader = new FileReader("d://1.txt");
FileWriter fileWriter = new FileWriter("d://2.txt");
//边读边写
int data=0;
while((data=fileReader.read())!=-1){
fileWriter.write((char)data);
}
//关闭资源
fileReader.close();
fileWriter.close();
}
}
2.字符缓冲流
- 缓冲流:BufferedReader/BufferedWriter
- 高效读写
- 支持输入换行符
- 可一次写一行,读一行
- BufferedReader
public class Demo12 {
public static void main(String[] args) throws Exception{
//创建字符缓冲流
FileReader fileReader = new FileReader("d://1.txt");
BufferedReader br = new BufferedReader(fileReader);
//读取数据
//1.第一种方式
// char[] chars = new char[1024];
// int count=0;
// while ((count=br.read(chars))!=-1){
// System.out.println(new String(chars,0,count));
// }
//2.第二种方式
String line=null;
while((line= br.readLine())!=null){
System.out.println(line);
}
//关闭资源
br.close();
}
}
- BufferedWriter
public class Demo13 {
public static void main(String[] args) throws Exception{
//创建字符缓冲流
FileWriter fileWriter = new FileWriter("d://3.txt");
BufferedWriter bw = new BufferedWriter(fileWriter);
//写入文件
for (int i = 0; i <5 ; i++) {
bw.write(new String("你好啊!!!!"));
bw.newLine();
}
//关闭资源
bw.close();
}
}
3.打印流
- PrintWriter:
- 封装了print()/println()方法,支持写入后换行
- 支持数据原样打印
public class Demo14 {
public static void main(String[] args) throws Exception{
//创建打印流
PrintWriter printWriter = new PrintWriter("d://2.txt");
//打印数据
printWriter.println(545);
printWriter.println('a');
printWriter.println(true);
printWriter.println("nsidhk");
//关闭资源
printWriter.close();
}
}
转换流
- 桥转换流:InputSteamReader/OutputsteamWriter
- 可将字节流转换成字符流
- 可设置字符的编码方式
- InputSteamReader
public class Demo15 {
public static void main(String[] args) throws Exception{
//创建转换流
FileInputStream fileInputStream = new FileInputStream("d://1.txt");
InputStreamReader isr = new InputStreamReader(fileInputStream,"utf-8");
//读取内容
int data=0;
while ((data=isr.read())!=-1){
System.out.print((char)data);
}
//关闭资源
isr.close();
}
}
- OutputsteamWriter
public class Demo16 {
public static void main(String[] args) throws Exception{
//创建转换流
FileOutputStream fileOutputStream = new FileOutputStream("d://4.txt");
OutputStreamWriter osw = new OutputStreamWriter(fileOutputStream, "utf-8");
//写入文件
for (int i = 0; i < 5; i++) {
osw.write("你好啊兄弟!\n");
}
//关闭资源
osw.close();
}
}
File类
- 概念:代表物理磁盘符中的一个文件或者文件夹
- 方法:
/**
* File类使用
*/
public class Demo17 {
public static void main(String[] args) throws Exception {
separator();
fileopen();
directoryopen();
}
//分割符
public static void separator(){
System.out.println("路径分隔符"+ File.pathSeparator);
System.out.println("名称分隔符"+File.separator);
}
public static void fileopen() throws Exception {
//创建文件
File file = new File("d://5.txt");
System.out.println(file);
if (!file.exists()){
boolean newFile = file.createNewFile();
System.out.println("创建结果"+true);
}
//删除文件
//1.直接删除
// boolean delete = file.delete();
// System.out.println("删除结果"+delete);
// //2.使用jvm删除
// file.deleteOnExit();
// Thread.sleep(2000);
//获取文件信息
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());
//判断
System.out.println("是否可写:"+file.canWrite());
System.out.println("是否为文件:"+file.isFile());
System.out.println("是否隐藏:"+file.isHidden());
}
public static void directoryopen(){
//创建文件夹
File file = new File("d://aa//bb//cc");
System.out.println(file);
if (!file.exists()){
//file.mkdir();//只能创建单级目录
System.out.println("创建结果:"+file.mkdirs());//创建多级目录
}
//删除文件
//file.delete();//只能删除空目录
//file.deleteOnExit();
//获取文件夹信息
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());
//判断
System.out.println("是否可写:"+file.canWrite());
System.out.println("是否为文件:"+file.isFile());
System.out.println("是否隐藏:"+file.isHidden());
//遍历文件夹
File file1 = new File("d://");
String[] list = file1.list();
System.out.println("-------------");
for (String s : list) {
System.out.println(s);
}
}
}
1.FileFilter接口
- public interface FileFilter
- boolean accept(File pathname)
- 当调用File类中的listFiles()方法时,支持传入FileFilter接口接口实现类,对获取文件进行过滤,只有满足要求的文件才可以出现在listFiles()的返回值中
public class Demo18 {
public static void main(String[] args) {
File file = new File("d://");
System.out.println(file);
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.getName().endsWith(".txt")) {
return true;
}
return false;
}
});
for (File file1 : files) {
System.out.println(file1.getName());
}
}
}
- 综合使用
- 递归遍历文件夹和删除文件夹
public class Demo20 {
public static void main(String[] args) throws Exception{
//创建集合
Properties properties = new Properties();
//添加数据
properties.setProperty("username","张三");
properties.setProperty("age","20");
System.out.println(properties);
//遍历
//1.keySet
//2.entrySet
Set<Map.Entry<Object, Object>> entries = properties.entrySet();
Iterator<Map.Entry<Object, Object>> iterator = entries.iterator();
while (iterator.hasNext()){
Map.Entry<Object, Object> next = iterator.next();
Object key = next.getKey();
Object value = next.getValue();
System.out.println(key+"=========="+value);
}
//3.stringPropertyNames()
Set<String> strings = properties.stringPropertyNames();
for (String string : strings) {
System.out.println(string+"======"+properties.getProperty(string));
}
//和流有关的方法
PrintWriter printWriter = new PrintWriter("d://6.txt");
properties.list(printWriter);
printWriter.close();
//store方法保存
FileOutputStream fileOutputStream = new FileOutputStream("d://store.properties");
properties.store(fileOutputStream,"注释");
fileOutputStream.close();
//load方法加载
FileInputStream fileInputStream = new FileInputStream("d://store.properties");
Properties properties1 = new Properties();
properties1.load(fileInputStream);
fileInputStream.close();
}
}