十二、io包 io流

一、io包 i:in o:out 表示进和出

1.File :文件和目录路径名的抽象表示 不要轻易调用delete删 真的能删掉

如果出现抛出异常不能操作 那么编辑器管理员身份运行 或者换d盘

在这里插入图片描述

在这里插入图片描述

File dir = new File"c://1.txt"//返回文件的父文件夹

dir.getParentFile()

//创建文件

dir.createNewFile();

//创建文件夹

dir.mkdir();

//创建一层文件夹

dir.mkdirs();

2.创建文件的三种方法:

在这里插入图片描述

length方法是返回文件大小 get…()方法返回文件路径 renameTo 重命名并移动

在这里插入图片描述

3.对于不同的操作系统有不同的路径分隔符和名称分隔符

java统一使用: 路径分隔符(;) :File.pathSeparator 名称分隔符(\):File.separator

4.查找文件

在这里插入图片描述

在这里插入图片描述

e.listFiles() :把这一层的所有文件装进一个数组中 判断是否是文件夹:.isDirectory()

必须先判断不为空且长度大于0

5.文件过滤器:接口FileFileter 必须实现才能使用

在这里插入图片描述

二、相对路径和绝对路径

绝对路径:从盘符开始,是一个完整的路径。例如:c://a.txt

相对路径:在JAVA代码中是相对于项目目录的路径,这是一个不完整的便捷路径,在java开发中很常用 例如: . a.txt的路径就在这个项目路径的文件夹里

三、io流概述 :

1.可以将这种数据传输的操作,看做是一种数据的流动,按照流动的方向分为输入input和输出 output

2.java中的io操作主要指的是java.IO包下的一些常用类的使用,通过这些类对数据进行读取(输入input)和写出(输出output)

3.分类:

按照流的方向来分,分为:输入流和输出流

按照流动的数据类型:字节流 和 字符流

字节流 :

  • 输入流 :顶级父类 ImputStream
  • 输出流 :顶级父类OutputStream

字符流 :

  • 输入流 :顶级父类 Reader
  • 输出流 : 顶级父类 Write

5.字节流概念:一切皆字节 计算机中的任何数据(文本,图片,视屏,音乐等)都是以二进制的形式存储的

在数据传输时,也是以二进制形式存储的。任何流,在传输时底层都是二进制

5.1OutputStream 字节输出流 把程序的东西写到文件里

5.1.1方法:

​ close() :关闭输出流并释放资源 使用完一定要把流关掉

​ flush():刷新输出流并写出缓冲的输出字节

​ nullOutputStream() :返回新的outputstream 丢弃所有字节

​ write(byte[] b): 写一个字节数组的所有内容

​ write(byte[] b , int off ,int length) :在指定数组中从下表 off开始 写的长度为length

​ write(int b ):将字节写入此输出流 写的是int实际是字节

5…1.2常用子类:

​ FileOutputStream : 文件输出流 构造方法:1.传文件名 2.传文件路径 两个传参的时候都可以加上boolean类型值用来判断是接着写还是 清空重写 只有同一个流调用时判断是否接着写 两个流不会清空 在关闭流以后不要在写东西 会出错

​两种方法:

在这里插入图片描述

在这里插入图片描述

5.2 InputStream :字节输入流 把文件的内容传到程序中

5.2.1 方法:

close():关闭流

read():从流中读取下一个字节

read(byte[] b):将从流中读取到的数据 存储到字节数组中 文件有100字节 数组10字节 存满10字节 返回值为int类型存取多少字节 如果读完没东西可读返回 -1

5.2.2常用子类:

FileInputStream:文件输入流 构造方法:1.传文件名 2.传文件路径

在这里插入图片描述

在这里插入图片描述

四、文件加密

System.out.println("请输入文件位置");
Scanner s = new Scanner(System.in);
String file = s.next();
File old = new File(file);
File news = new File(old.getParent(),"mi"+old.getName());
FileInputStream fis = new FileInputStream(old);
FileOutputStream fos = new FileOutputStream(news);
while (true){
    int b = fis.read();
    if(b == -1)
        break;
    fos.write(b^10);

原理:异或运算 任何数据异或相同数字两次 结果就是其本身

五、字符编码

在这里插入图片描述

常用编码 UTF-8

六、字节流读取文字可能出现的乱码

输出乱码:项目默认使用UTF-8 记事本不是 在项目里创建一个File 因为字节流在存储时数组可能读取一个字的半个编码 所以有时候会乱码 字符流是读一个字

七、字符流

close() append():是否追加输入 write()

1.文件字符流

写:

FileWriter f = new FileWriter(“文件名或路径”,true决定是否追加)

f.write("要写入的字符串")

f.write('要写入的字符')

f.append(“要追加写入的数据”).append("")//...可以一直追加  

//他的返回值是writer  要强转 
FileWriter f2 = (FileWriter)f.append(“要追加写入的数据”)

f.close();

读:

FileReader f = new  FileReader(“文件名或路径”)

int c = f.read();  \\返回一个字符

syso((char)c);\\一次读一个字符

while(true){

int c = f.read();

if(c == -1)

break;

syso((char)c);

}

f.close();

打印字符串:

FileReader f = new  FileReader(“文件名或路径”)char[] c = new char[100]; 要考虑是否有100个字符 他的默认存储时0 也就是空格

int length = f.read(c);

String t = new String(c,0,length);

syso(t);

syso(t.length());

八、字节流和字符流的区别

字符输出一般会加一个操作:f.flush(); 刷新缓存空间 强制把缓存空间里的内容写到文件中去 关闭的时候相当于进行了一次刷新 如果正常不写关闭不写刷新 append追加不会写入

字符输出时每写一段内容要刷新一下

九、转化流:将字节流转换(装饰)为字符流 :使用装饰者设计模式

输入流:

FileInputStream f = new FileInputStream("c://a.txt");

//将字节输入流转换为字符输入流;

//参数1.要转换的字节流

//参数2.指定编码名称

InputStreamReader i = new InputStreamReader(f,"gbk");

while(true){

int c = i.read();

if(c == -1)

break;

syso((char)c)

}
f.close();

输出流:

FileOutputStream f = new FileOutputStream("c://a.txt");

//将字节输出流转换为字符输出流;

OutputStreamWriter i = new OutputStreamWriter(f);

i.write("床前明月光");

i.flush();

i.close();

十、打印流:用于打印字符(syso) 和 缓存读取流:

//字符输出(打印流)

像文件里输出一行内容

用Stream 或 Writer  用PrintWriter 需要刷新管道

PrintStream p = new PrintStream("c://a.txt");

p.println("aaaa");

/*缓存读取流  将字符输入流 转换为带有缓存 可以一次读取一行的缓存字符读取流  
要是字节流 先转换成字符流 在转缓存读取流*/

FileReader f = new FileReader("c://c.txt");

BufferedReader b = new BufferedReader(f);

String t = b.readLine(); 读到结尾返回null

syso(t);

十一、收集异常日志

在这里插入图片描述

通过try catch捕捉异常然后通过e.printStackTrace(打印流文件)打印异常 传入文件里

十二、Properties 属于map集合 扩展部分跟io有关联

配置文件

Properties p = new Properties();

//存储 键->值

在这里插入图片描述

p.store(存储文件,首行注释)

.load(写入文件);

十三、序列化 与反序列化

序列化:存储的数据必须实现Serializable接口 这是一个标记接口没有抽象方法 同时如果这个对象类中有自定义属性也必须实现这个接口

在这里插入图片描述

反序列化

在这里插入图片描述

十四、try - with - resources既算io知识点也算异常处理知识点

1.7之前 因为io流引用完要关闭 但是嵌套trycatch会很麻烦 所以引入此操作 try catch运行结束后会自动调用close()关闭流 前提是他必须实现一个Closeable接口 也就是这个类里有close这个方法

在这里插入图片描述

1.9版本优化 1.7版本创建的流在trycatch结束后没有办法引用 因此更新之后在trycatch前创建 直接传入对象 多个对象用分号隔开

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值