I/O框架
I/O框架
流的概念
- 概念:内存与存储设备之间传输数据的通道
流的分类
- 按方向【重点】
- 输入流:将<存储设备>中的内容读入到<内存>中
- 输出流:将<内存>中的内容写入到<存储设备中>
- 按单位
- 字节流:以字节为单位,可以读写所有数据
- 字符流:以字符为单位,只能读写文本数据
- 按功能
- 节点流:具有实际传输数据的读写功能
- 过滤流:在节点流的基础之上增强功能
字节流
字节缓冲流
- 缓冲流:BufferedInputStream/BufferedOutputStream
- 提高IO效率,减少访问磁盘的次数
- 数据存储在缓冲区中,flush是将缓存区的内容写入文件,也可以直接close
对象流
-
对象流:ObjectOutputStream/ObjectInputStream
-
增强了缓冲区功能
-
增强了读写八种基本数据类型和字符串功能
-
增强了读写对象的功能
- readObject()从流中读取一个对象
- writeObject(Object obj)向流汇总写入一个对象
使用流传输对象的过程称为序列化、反序列化
-
/**
*使用ObjectOutputStream实现对象的序列化
* 要求:序列化的类必须实现Serializable接口
* 序列化类中的对象属性要求实现Serializable
* 序列化版本号ID,保证序列化的类和反序列化的类是同一个类
* 使用transient(瞬时的)修饰属性,这个属性不能被序列化
* 静态属性不能被序列化
* 序列化多个对象可以借助集合实现
*/
public class Demo06 {
public static void main(String[] args) throws Exception{
FileOutputStream fos = new FileOutputStream("D:\\stu.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Student s1 = new Student("张三",20);
Student s2 = new Student("李四",21);
ArrayList<Student> list = new ArrayList<>();
list.add(s1);
list.add(s2);
oos.writeObject(list);
oos.close();
}
}
/**
* 使用ObjectInputStream实现反序列化
*/
public class Demo07 {
public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("D:\\stu.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
ArrayList<Student> list = (ArrayList<Student>) ois.readObject();//只能读取一次
System.out.println(list.toString());
ois.close();
}
}
编码方式
字符流
/**
* 使用FileReader读取文件
*/
public class Demo01 {
public static void main(String[] args) throws Exception{
FileReader fr = new FileReader("D:\\aaa.txt");
int data = 0;
/* while((data = fr.read())!=-1){
System.out.print((char)data);
}*///单个字符打印
char[] buf = new char[2];
while((data = fr.read(buf))!=-1){
System.out.println(new String(buf,0,data));
}
fr.close();
}
}
/**
* 使用FileWriter写入文件
*/
public class Demo02 {
public static void main(String[] args) throws Exception{
FileWriter fw = new FileWriter("D:\\write.txt");
for (int i = 0; i < 10; i++) {
fw.write("java是世界上最棒的语言\r\n");
fw.flush();
}
fw.close();
System.out.println("执行完毕");
}
}
/**
* 使用FileWriter和FileReader复制文本文件,不能复制图片或二进制文件
* 使用字节流能复制任意文件
*/
public class Demo03 {
public static void main(String[] args) throws Exception{
FileReader fr = new FileReader("D:\\aaa.txt");
FileWriter fw = new FileWriter("D:\\bbb,txt");
int data = 0;
while((data = fr.read())!=-1){
fw.write(data);
fw.flush();
}
fr.close();
fw.close();
System.out.println("执行完毕");
}
}
/**
* 使用字符缓冲流读取文件
* BufferedReader
*/
public class Demo04 {
public static void main(String[] args) throws Exception{
FileReader fr = new FileReader("D:\\write.txt");
BufferedReader bf = new BufferedReader(fr);
//读取
char[] c = new char[1024];
int data;
/* while((data = bf.read(c))!=-1){
System.out.println(new String(c,0,data));
}*/
String str = null;
while ((str= bf.readLine())!=null){
System.out.println(str);
}
}
}
/**
* 使用BufferedWriter使用演示
*/
public class Demo05 {
public static void main(String[] args) throws Exception{
FileWriter fw = new FileWriter("D:\\buffer.txt");
BufferedWriter bw = new BufferedWriter(fw);
for (int i = 0; i < 10; i++) {
bw.write("好好学习,天天向上");
bw.newLine();
bw.flush();
}
bw.close();
System.out.println("执行完毕");
}
}
/**
* 演示PrintWriter的使用
*/
public class Demo07 {
public static void main(String[] args) throws Exception{
PrintWriter pw = new PrintWriter("D:\\print.txt");
pw.println(108);
pw.println("你好世界");
pw.println('a');
pw.println(3.141592654281111111111111111111111111);//当做双精度保存
pw.close();
System.out.println("打印完毕");
}
}
/**
* 使用OutputStreamWriter写入文件
*/
public class Demo02 {
public static void main(String[] args) throws Exception{
FileOutputStream fos = new FileOutputStream("D:\\output.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
for (int i = 0; i < 10; i++) {
osw.write("我爱你家乡\r\n");
osw.flush();
}
osw.close();
System.out.println("执行完毕");
}
}
/**
*使用InputStreamReader,读取文件,指定编码
*/
public class Demo01 {
public static void main(String[] args) throws Exception{
FileInputStream is = new FileInputStream("D:\\write.txt");
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
//读取文件
int data = 0;
while((data= isr.read())!=-1){
System.out.print((char)data);
}
isr.close();
}
}
File类
文件夹的使用
/**
* file类的使用
* (1)分隔符
* (2)文件操作
* (3)文件夹操作
*/
public class Demo01 {
public static void main(String[] args) throws Exception{
/*separator();
fileOpe();*/
directoryOpe();
}
public static void separator() throws Exception{
//分隔符
System.out.println("路径分隔符:"+ File.pathSeparator);
System.out.println("名称分隔符:"+File.separator);
}
//文件操作
public static void fileOpe() throws Exception{
//创建文件
File file = new File("D:\\file.txt");
System.out.println(file.toString());
Boolean a = file.createNewFile();
System.out.println("创建结果为:"+a);
//删除文件
// System.out.println("删除结果为:"+file.delete());
//使用JVM删除
/* file.deleteOnExit();
Thread.sleep(5000);*/
//获取文件信息
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.canRead());
System.out.println("是否隐藏:"+file.isHidden());
}
//文件夹操作
public static void directoryOpe() throws Exception{
//创建文件夹
File dir = new File("D:\\aaa\\bbb\\ccc");
if(!dir.exists()){
//dir.mkdir();//只能创建单级文件夹
System.out.println("创建结果为:"+dir.mkdirs());
}
//删除文件夹
//直接删除(只能删除空目录)
//System.out.println("删除结果:"+dir.delete());
//使用Jvm删除
/* dir.deleteOnExit();
Thread.sleep(5000);*/
//获取文件夹的信息
System.out.println("获取文件的绝对路径:"+dir.getAbsolutePath());
System.out.println("获取文件路径:"+dir.getPath());
System.out.println("获取文件的名字:"+dir.getName());
System.out.println("获取文件的父目录:"+dir.getParent());
System.out.println("获取文件的创建时间:"+new Date(dir.lastModified()).toLocaleString());
//判断
System.out.println("是否是文件夹:"+dir.isDirectory());
System.out.println("是否隐藏:"+dir.isHidden());
//遍历文件夹
File dir2 = new File("D:\\CloudMusic");
String[] list = dir2.list();
for (String s : list) {
System.out.println(s);
}
}
}
FileFilter接口
- public interface FileFilter
- boolean accept(File pathname)
- 当调用File类中的listFiles()方法时,支持传入FileFilter接口实现类,对获取文件进行过滤,只有满足条件的文件才可出现在listFiles()的返回值中
System.out.println("------FileFilter接口的使用-----------");
File[] file2 = dir2.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.getName().endsWith(".mp3")){
return true;
}
return false;
}
});
for (File file:file2){
System.out.println(file.getName());
}
小案例
/**
* 递归遍历文件夹
* 递归删除文件夹
*/
public class ListDemo {
public static void main(String[] args) {
//listDir(new File("D:\\myfiles"));
deleteDir(new File("D:\\myfiles"));
}
//递归遍历文件夹
public static void listDir(File dir) {
File[] files = dir.listFiles();
System.out.println(dir.getAbsoluteFile());
if(files.length>0&&files!=null){
for (File file : files) {
if(file.isDirectory()){
listDir(file);
}else{
System.out.println(file.getAbsoluteFile());
}
}
}
}
public static void deleteDir(File dir){
File[] files = dir.listFiles();
if(files!=null&&files.length>0){
for (File file : files) {
if(file.isDirectory()){
deleteDir(file);
}else{
//删除文件
System.out.println(file.getAbsoluteFile()+"删除"+file.delete());
}
}
}
System.out.println(dir.getAbsoluteFile()+"删除"+dir.delete());
}
}
Properties集合
/**
* 演示Properties集合
*/
public class Demo02 {
public static void main(String[] args) throws Exception{
Properties properties = new Properties();
properties.setProperty("管理员:","张三");
properties.setProperty("年龄:","20");
System.out.println(properties.toString());
Set<String> proNames = properties.stringPropertyNames();
for (String s : proNames) {
System.out.println(s+"="+properties.getProperty(s));
}
//和流有关的方法
PrintWriter printWriter = new PrintWriter("D:\\print.txt");
properties.list(printWriter);
printWriter.close();
//---------store方法 保存----------
FileOutputStream fos = new FileOutputStream("D:\\fos.properties");
properties.store(fos,"注释");
fos.close();
//--------------使用load方法---------
Properties properties1 = new Properties();
FileInputStream fis = new FileInputStream("D:\\fos.properties");
properties1.load(fis);
fis.close();
System.out.println(properties1.toString());
}
}