什么是流:内存与存储设备之间传输数据的通道,数据借助流传输
《-------------按方向分类--------------》
输入流:将<存储设备>中的内容读入到<内存>z中。input
输出流:将<内存>中的内容写入到<存储设备>中。output
《-------------按单位分类--------------》
字节流:以字节为单位,可以读写所有数据
字符流:以字符为单位,只能读写文本数据
《-------------按功能分类--------------》
节点流:具有实际传输数据的读写功能
过滤流:在节点流的基础之上增强功能
<------------------------------------------------------------------------------>
字节流的父类(抽象类):{
InputStream:字节输入流
OutputStream:字节输出流
文件字节流
FileInputStream;
public int read (byte[ ] b)//从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数;如果达到文件尾部,则返回-1;
FileInputStream fileInputStream = new FileInputStream("E:\\ch1\\之上.txt");//创建FileInputStream,并指定文件路径,*抛出异常
byte a[]=new byte[3];
int count = 0 ;
while ((count=fileInputStream.read(a))!=-1){
System.out.println(new String(a,0,count));//把字符数组a的0到最后的数编程数组输出出来
}//最后别忘了fileInputStream.close关闭流
FileOutputStream;
public void write(byte[ ] b)//一次写多个字节,将b数组中所有字节,写入输出流
<---------------------------------------------------------------------------------------------------------->
字节缓冲流:BufferedInputStream/BufferedOutputStream(提高IO效率,减少访问磁盘的次数;数据存储在缓冲区,flush是将缓存区的内容写入文件中,也可直接close)
BufferedInputStream:首先创建底层流 FileInputStream fileInputStream = new FileInputStream("E:\\ch1\\之上.txt");
BufferedInputStream buffer = new BufferedInputStream(fileInputStream);//填装底层流
buffer.close();//别忘了关闭流
输出方式于底层流类似//可以不用自定义缓冲区,因为BufferedInputStream自带缓冲区,也可自行创建,和底层流类似
BufferedOutputStream:首先创建底层溜 FileOutputStream fileoutputstraem =new FileOutputStream("E:\\ch1\\之上.txt");
BufferedOutputStream buffer = = new BufferedOutputStream(fileoutputstraem);//填装底层流
buffer.write("xxx".getBytes());//写入缓冲区中,不直写硬盘
buffer.flush();//刷新到硬盘的操作
buffer.colse;//关闭流
<---------------------------------------------------------------------------------------------------------->
对象流:ObjectOutputStream/(序列化,对象转换为字节)ObjectInputStream/(反序列化,字节重构为对象) (增强了缓冲区的功能,增强了读写8种基本数据类型和字符串功能,增强了读写对象的功能)
readObject()从流中读取一个对象;writeObject(Object obj)向流中写入一个对象
使用流传输对象的过程称为序列化,反序列化。
(序列化)使用ObjectOutputStream实现对象的序列化,*序列化的类必须要实现Serializable【序列化】接口(该接口无任何方法)
1.创建底层流 fos;2.创建ObjectOutputStream流oos
3.序列化:Person p1 = new Person("XX",20);
oos.writeObject(p1);//把对象写入硬盘 别忘了关闭流
(反序列化)使用ObjectInputStream实现对象的反序列化,
1,创建底层流fos;2,创建ObjectInputStream流ois
3,反序列化:Persion p2 = (Persion)ois.readObject(p1);//ois.readObject()出来的是对象,转一下类型
##注意事项:在使用ObjectOutputStream实现对象的序列化时,序列化对象属性要求Serializable接口
反序列化ID会影响反序列化(serialVersionUID),静态属性不能序列化 ,使用transient修饰属性,可以让属性不能序列化
序列化多个对象,可以用集合解决。
<----------------------------------------------------------------------------------------------------------------------->
字符编码{
ISO-8859-1收录除ASCII外,还包括西欧,希腊语,泰语,阿拉伯语,希伯来语对应的文字符号。
UTF-8:针对Unicode码表的可变长度字符编码
GB3212:简体中文//GBK:简体中文,扩充//BIG5:台湾,繁体中文}
字符流{
字符流的父类(抽象类):Reader字符输入流,Writer字符输出流。
文件字符流:FlieReader: public int read(char[ ] c)从流中读取多个字符,将内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,返回-1,使用方式和文件字节输入流类似
FileWriter:public void write(String str) 一次写多个字符,将b数组中所有字符,写入输出流//E://xxx//xx.txt
文件复制:与文件字节流相似,但是文件字符流不能复制图片和二进制文件
字符缓冲流BufferedReader/BufferdeWriter:高效读写,支持输入换行符,可一次写一行,读一行。
BufferedReader 使用字节缓冲流读取文件:基本操作与上边的类似,但是多了一个read.Line()方法,一次读一行
String str= null;
while ((str=bufferedReader.readLine())!=null){
System.out.println(str);
}
BufferedWriter 使用字节缓冲流写入文件:基本操作与上边的类似,但是多了一个new.Line()方法,自动换行省去了\r\n
<--------------------------------------------------------------------------------------------------------------->
打印流PrintWriter:封装了print()/println()方法,支持写入后换行;支持数据原样打印类似于基础流
PrintWriter pw = new PrintWriter("E://xx//xxx.txt");
pw.println();pw.print()//向文件里面打印
<--------------------------------------------------------------------------------------------------------------->
转换流:桥转换流:InputStreamReader/OutputStreamWriter——可将字节流转换为字符流。可设置字符的编码方式
首先创建基础的字节流,在创建桥转换流并且声明编码方式
FileInputStream fileInputStream = new FileInputStream("E:\\ch2\\new.txt");
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"utf-8");
输出方式:和上面类似,由于是变成字符流,所以用char强转型(OutputStreamWriter类似)
<--------------------------------------------------------------------------------------------------------------->
File类:代表物理盘符中的一个文件或者文件夹。
方法(文件操作):
createNewFile()//创建一个新文件
mkdir()//创建一个新目录
delete()//删除文件或空目录 deleteOnExit()//jvm退出时自动删除
exists()//判断File对象所代表的对象是否存在
getAbsolutePath()//获取文件的绝对路径 Thread.sleep()//休眠
getName()//取得名字 getParent()//获取文件/目录所在的目录
isDirectory()//是否是目录 isFile()//是否是文件 lengh()//获取文件的的长度
listFiles()//列出目录中的所有内容 renameTo()//修改文件名为
can.Write()//判断是否能读 isFile()//判断是否是文件 isHidde()//是否隐藏
lastModified()//返回文件创建时间long类型的 (new Date(file.lastModified()).toLocaleString())转换成Date类型并且变成字符串
exists()函数是Java中File类的一部分。此函数确定是否存在以抽象文件名表示的文件或目录。如果抽象文件路径存在,则该函数返回true,否则返回false
方法(文件夹操作)
getAbsolutePath()//获取文件夹的绝对路径 getPath()//获取路径 getName()//获取最底层的文件夹名字
getParent()//获取文件/目录所在的目录 mkdir()//创建单级目录 mkdirs()//创建多层文件夹
delete()//删除空目录的底层文件夹 deleteOnExit()//使用jvm删除空目录的底层文件夹
lastModified()//返回文件夹创建时间long类型的 (new Date(dir.lastModified()).toLocaleString())转换成Date类型并且变成字符串
isDirectory()//判断是否为文件夹 isHidden()//判断文件夹是否隐藏
便利文件夹: File dir = new File("d:\\xxx");
String[] files = dir.list();// 用list()方法返回字符串数组
for(String str:files){sout(string);}// 用for each循环便利
FileFilter接口的使用
File [] file = dir.ListFiles(new FileFilter(){};) 匿名内部类实现方法 pathname.getName().endWith(".jpg")过滤文件尾名为.jpg
foreach便利file数组
递归遍历
import java.io.File;
public class Demo10 {
public static void main(String[] args) {
add(new File("E:\\ch2"));
pdd(new File("E:\\ch2"));
}
public static void add(File dir){//递归方法查看文件夹内部
File[] file = dir.listFiles();
System.out.println(dir.getAbsolutePath());
if (file!=null&&file.length>0){
for (File file1:file){
if (file1.isDirectory()){//如果是文件夹重新调用add方法
add(file1);
}
else {//不是文件夹直接获取文件名
System.out.println(file1.getAbsolutePath());
}
}
}
}
public static void pdd(File dir){//递归方法删除文件夹
File[] file = dir.listFiles();
if (file!=null&&file.length>0){
for (File file1:file) {
if (file1.isDirectory()){
pdd(file1);//如果是文件夹直接再次调用pdd方法
}
else {//不是文件夹直接删除文件
System.out.println("删除"+file1.delete());
}
}
dir.delete();//删除文件夹
}
}
}
}
}
}
补充:Properties 属于集合(存储属性名和属性值,属性名和属性值都是字符串类型,没有泛型,和流有关)
Properties p = new Properties();//类似于键值对
p.setProperty();//添加属性
遍历 keySet--------entrySet ;
Set<String> propertyNames = p.stringPropertyNames();//独特的遍历
for (String pro:propertyNames){
System.out.println(pro+"="+p.getProperty(pro));
和流有关的方法 list方法 properties.list(pw)//pw为打印流
store方法(保存) properties.store(fos,"注释");fos为字节输出或字符输出流
load方法(加载) properties2.load(fis);//用新的 properties2去接受,fis为字节输入或字符输入流
}