IO流总结
2020-09-04 10:22:27 0 举报
AI智能生成
Java中的IO
作者其他创作
大纲/内容
File类
概述:java提供对系统中文件或者文件夹进行操作的类
相对路径和绝对路径
相对路径:相对路径的参照物是项目的根目录,比如,如果直接访问xxx.txt,相当于访问:你的工作空间路径/项目路径/xxx.txt
绝对路径:盘符加上路径名, 也就是你右键一个文件属性,里面的位置再加上文件名就是这个文件的绝对路径
构造方法
FIle(String str) 传入一个文件或者文件夹的路径(默认是相对路径)(常用)
File(String parent, String child) 传入一个父路径,再传入一个子路径
File(File parent, String child) 传入一个父文件对象,再传入一个子路径
成员方法
createNewFile() 创建文件,如果存在则不创建
isDirectory() 是否是文件夹
mkdirs() 创建多级目录
File[] listFiles() 获得文件夹下的所有文件和文件夹 File对象
getAbsolutePath() 获得绝对路径
getName() 获得文件或则文件夹名字
length() 获得文件大小,字节数
String[] list() 获得文件夹下的所有文件和文件夹名称
文件名过滤器:创建一个 FilenameFilter 接口匿名子类
delete() 删除文件或者文件夹,如果文件夹不是空的则不能删除,这个删除方法不走回收站.
mkdir() 创建单级目录
exists() 传入的路径是否存在
renameTo(File f) 如果是相同路径下则是改名,如果是不同路径下则是剪切效果.
canRead() 是否能读(Windows系统所有文件都是可读的)
isFile() 是否是文件
canWrite() 是否可写(Windows系统可设置为不可写)
isHidden() 是否是隐藏文件
getPath() 获得构造方法传入的路径
lastModified()获得最后修改时间
递归
概述:方法自己调用自己.(构造方法除外)
递归的弊端:不能调用次数过多,容易导致栈内存溢出
递归的好处:不用知道循环次数
递归调用是否必须有返回值? 可有可无
案例:查询出指定文件夹路径下所有以.java结尾的文件.
1.通过给定的文件夹路径创建 File 对象.
2.利用 File.listFiles() 方法获取文件夹下的第一级目录中所有的文件对象.
3.循环判断每个文件对象是否是文件且已.java结尾
4.如果是打印出结果,如果不是再判断是否是文件目录
5.如果是文件目录,用文件对象重复2-3-4-5步骤,
直到查询完所有的文件对象.(只有这一步才算递归)
字节流
InputStream 字节输入流
FileInputStream 文件字节输入流
构造方法
FileInputStream(File f)
通过File对象创建
FileInputStream(String name)
通过文件名创建,不存在会报错.
常用方法
read(byte[] arr) 每次读取一个数组
read() 每次读取一个字节
BufferedInputStream 缓冲流
底层有一个 8192的字节数组,缓冲区
构造方法
BufferedInputStream(InputStream is)
常用方法
read(byte[] arr) 每次读取一个数组
read() 每次读取一个字节
OutputStream 字节输出流
FileOutputStream 文件字节输出流
构造方法
FileOutputStream(String name)
通过文件名称创建,不存在直接创建,会直接覆盖原来有的内容
FileOutputStream(String name,boolean append)
通过文件名称创建,append=true 追加.不覆盖
常用方法
write(byte[] arr,int offset,int len)
BufferedOutputStream 缓冲流
底层有一个 8192的字节数组,缓冲区
构造方法
BufferedOutputSteam(OutputStream os)
常用方法
write(byte[] arr,int offset,int len)
copy文件代码
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("aaa.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bbb.txt"));
int len;
byte[] arr = new byte[1024];
while((len = bis.read(arr)) != -1) {
bos.write(arr,0,len);
}
bis.close();
bos.close();
flush()和close()的区别
flush()是把缓冲区里面的内容刷新出来,可以每次写的完之后马上刷新.
不是缓冲流的类,flush方法不起任何作用,方法体为空
close()方法也能把缓冲区的内容刷新出来,但是调用close()方法之后流就关闭了,不能再对流做读写操作.
flush方法只有输出流才有的方法
字节流读写中文
使用字节流只读或者只写中文是不推荐使用,只读的时候在控制台可能会读成乱码,因为一个中文占2个字节.只写的情况下需要讲字符串转成字符数组再写如,操作太繁琐,不推荐使用,推荐使用字符流.
1.6版本异常处理代码
字符流
Reader 字符输入流 (传输单元是字符)
FileReader 文件字符输入流
常用方法
read() 读取一个字符
read(char[]) 读取一个字符数组
BufferedReader 缓冲字符输入流
构造方法
BufferedReader(Reader r)
常用方法
readLine() 读一行数据 \r\n 为结束标记,末尾时返回null
构造方法中常用来包裹 FileReader 对象
Writer 字符输出流 (传输单元字符)
FileWriter 文件字符输出流
常用方法
write() 写一个字符
write(char[] arr,int offset,int len)
write(String s)
BufferedWriter 缓冲字符输出流
构造方法
BufferedWriter(Writer w)
常用方法
newLine() 换行,跨平台换行
newLine() 和 \r\n的区别:
newLine()是跨平台的,mac(\r) Linux(\n)都能用
\r\n只能在Windows平台使用
构造方法中常用来包裹FileWriter
什么时候使用字符流
只读或者只写纯文本文件的时候使用
字符流是否可以拷贝非纯文本的文件
不能,拷贝之后文件可能会乱码,拷贝过程中会把2个字节通过码表获取对应的字符,如果找不到,就会问号代替,比如mp3文件
装饰类
是你还有你,一切拜托你
降低耦合性,被装饰的类改变不会影响装饰类
拿到被装饰类的引用
通过构造方法传入装饰类或者其子类,初始化装饰类的引用
对原有功能的升级
格式
class 装饰类 /*实现某个接口*/ {
private 被装饰类名 引用变量;
public 装饰类(被装饰类名 引用变量) {
this.引用变量=引用变量
}
//3.对原有功能升级 一般是方法复写
}
转换流
Reader的子类
InputStreamReader 字节转成字符输入流
构造方法:InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader
Writer的子类
OutputStreamWriter 字符流转换成字节流
OutputStreamWriter(OutputStream out, String charsetName)
//创建使用指定字符集的 OutputStreamWriter
作用:
让字节流和字符流直接进行转换
设定流中字符编码
IO流中其他流
OutputStream(字节输出流)
内存输出流ByteArrayOutputStream
作用:使用字节流读取文本的时候,很容易将中国字符进行切割,导致乱码,可通过该流解决这种情况。
常用方法
toString()
将内存中的所有内容一次性转为字符串
write(byte[] arr,int offset,int len)
将数组中的内容写入到内存中
打印流
特殊:里面重载了各种print 和 println 的方法,其中参数为数组的只有 char[],其他数组都是以Object类型传入
Writer(字符输出流)
类PrintWriter
OutputStream(字节输出流)
类 PrintStream
标准输入输出流
System.in
默认输入源是: 键盘
使用 System.setIn(InputStream in) 可以更改输入源为某个文件
包装: 可以通过InputStreamReader转换流转换为字符流,再通过BufferedReader转换为缓冲流,每次读取一行
System.out
默认输出源是: 控制台
使用 System.setOut(PrintStream out) 可以更改输出源为某个文件
对象流
(反序列化)对象输入流ObjectInputStream(InputStream is)
readObject()读取一个对象,需要强转
(序列化)对象输入流ObjectOutputStream(OutputStream os)
writeObject(Object o) 必须实现Serializable接口
不被序列化的字段
static修饰的字段(属性)
transient 修饰的字段
版本ID
本地的版本ID一旦发生变化,之前序列化的所有文件都不可以进行反序列化了
Properties 类(掌握)
Properties 是 Hashtable 的子类,可以作为双列集合使用,
一般使用 Properties 读写配置文件,键和值都是字符串,因此 Properties 没有泛型.
特有功能
setProperty(String key,String value)
getProperty(String key)
stringPropertyNames():获取所有键枚举(类似Map中的keySet())
load(InputStream is) //通过流将配置文件的键值对加载到Properties中(在开发中一般都是封装这个方法)
store(OutputStream out, String comments)
0 条评论
下一页