JAVA I/O框架(二)

JAVA I/O框架(二)

五. 字符流

字符流的父类(抽象类)

Reader:字符输入流

  • public int read(){ }
  • public int read(char[] c){ }
  • public int read(char[] b, int off, int len ){ }

Writer:字符输出流

  • public void write(int n){ }
  • public void write(String str){ }
  • public void write(char[] c){ }

1. 文件字符流

FileReader:

  • public int read(char[ ] c)
    从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1

FileWriter:

  • public void write(String str)
    一次写多个字符,将b数组中所有字符,写入输出流

实例:

//文件字符输入流
import java.io.FileReader;

public class Demo02 {
    public static void main(String[] args) throws Exception{
        //创建文件字符输入流
        FileReader fr = new FileReader("D:\\a.txt");
        //读取  单个字符读取
//        int data=0;
//        while ((data=fr.read())!=-1){
//            System.out.print((char)data);
//        }
        //自定义缓冲区
        char[] str=new char[1024];
        int count=0;
        while ((count=fr.read(str))!=-1){
            System.out.println(new String(str,0,count));
        }
        //关闭
        fr.close();
    }
}
---------------结果---------------
好好学习
//文件字符输出流
import java.io.FileWriter;

public class Demo03 {
    public static void main(String[] args) throws Exception{
        //创建文件字符输出流
        FileWriter fw = new FileWriter("D://a.txt");
        //写入
        for (int i = 0; i < 10; i++) {
            fw.write("Java是最好的语言\r\n");
        }
        //关闭
        fw.close();
        System.out.println("程序结束!");
    }
}
---------------结果---------------
程序结束!
-------------文件内容-------------
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言

用字符流复制文件

import java.io.FileReader;
import java.io.FileWriter;

public class Demo04 {
    
    public static void main(String[] args) throws Exception{
        //创建文件字符输入输出流
        FileReader fr = new FileReader("D://a.txt");
        FileWriter fw = new FileWriter("D://b.txt");
        //读写
        int data=0;
        while ((data=fr.read())!=-1){
            fw.write((char)data);
        }
        //关闭
        fr.close();
        fw.close();
        System.out.println("执行结束!");
    }
}
---------------结果---------------
执行结束!
-------------文件内容-------------
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言

注意:

  • 用文件字符流复制文件,不能复制图片或其他二进制文件
  • 使用字节流可以复制任意文件。

2. 字符缓冲流

缓冲流: BufferedReader/ BufferedWriter

  • 高效读写
  • 支持输入换行符。
  • 可一次写一行、读一行。

实例:

//使用字符缓冲流来读取文件
import java.io.BufferedReader;
import java.io.FileReader;

public class Demo05 {
    public static void main(String[] args) throws Exception{
        //创建字符缓冲流
        FileReader fr = new FileReader("D://a.txt");
        BufferedReader br = new BufferedReader(fr);
        //读取  第一种方式
//        int data=0;
//        while ((data=br.read())!=-1){
//            System.out.print((char) data);
//        }
        //读取  第二种方式
//        int count=0;
//        char[] chr = new char[1024];
//        while ((count=br.read(chr))!=-1){
//            System.out.print(new String(chr,0,count));
//        }
        //读取  第三种方式
        String line=null;
        while ((line=br.readLine())!=null){
            System.out.println(line);
        }
        //关闭
        br.close();
        System.out.println("执行结束");
    }
}
---------------结果---------------
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
执行结束

实例:

//演示字符缓冲输出流
import java.io.BufferedWriter;
import java.io.FileWriter;

public class Demo06 {
    public static void main(String[] args) throws Exception{
        //创建字符缓冲输出流
        FileWriter fw = new FileWriter("D://b.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        //输出
        for (int i = 0; i < 5; i++) {
            bw.write("Hello World!");
            bw.newLine();//写入一个换行符
            bw.flush();
        }
        //关闭
        fw.close();
        System.out.println("执行结束");
    }
}
---------------结果---------------
执行结束
-------------文件内容-------------
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!

3. 打印流

PrintWriter
封装了 print()/ println方法,支持写入后换行
支持数据原样打印

//演示PrintWriter的使用
import java.io.PrintWriter;

public class Demo07 {
    public static void main(String[] args) throws Exception{
        //创建打印流
        PrintWriter pw = new PrintWriter("D://a.txt");
        //打印
        pw.println(97);
        pw.println(true);
        pw.println(3.14);
        pw.println('a');
        //关闭
        pw.close();
        System.out.println("执行结束");
    }
}
---------------结果---------------
执行结束
-------------文件内容-------------
97
true
3.14
a

4. 转换流

桥转换流: InputStreamReader/ OutputStreamWriter
可将字节流转换为字符流
可设置字符的编码方式。

实例:

//使用InputStreamReader读取文件,指定使用编码
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class Demo08 {
    public static void main(String[] args) throws Exception{
        //创建转换流
        FileInputStream fis = new FileInputStream("D://a.txt");
        InputStreamReader isr = new InputStreamReader(fis,"gbk");
        //读取文件
        int data=0;
        while ((data=isr.read())!=-1){
            System.out.print((char) data);
        }
        //关闭
        isr.close();
    }
}
---------------结果---------------
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
Java是最好的语言
//使用OutputStreamWriter写入文件,使用指定的编码
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

public class Demo09 {
    public static void main(String[] args) throws Exception{
        //创建OutputStreamWriter
        FileOutputStream fos = new FileOutputStream("D://b.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
        //写入
        for (int i = 0; i < 5; i++) {
            osw.write("HELLO WORLD\r\n");
            osw.flush();
        }
        //guanbi
        osw.close();
        System.out.println("执行结束");
    }
}
-------------文件内容-------------
HELLO WORLD
HELLO WORLD
HELLO WORLD
HELLO WORLD
HELLO WORLD

六. File类

概念:

  • 代表物理盘符中的一个文件或者文件夹

方法:

  • createNewFile()–创建一个新文件
  • mkdir()–创建一个新目录
  • delete()–删除文件或空目录
  • exists()–判断File对象所代表的对象是否存在
  • getAbsolutePath()–获取文件的绝对路径
  • getName()–取得名字
  • getParent()–获取文件/目录所在的目录
  • isDirectory()–是否是目录
  • isFile()–是否是文件
  • length()–获得文件的长度
  • listFiles()–列出目录中的所有内容
  • renameTo()–修改文件名为

1. 分隔符

public class Demo01 {
    public static void main(String[] args){
        //(1)分隔符
       separator();
	}
	
	//分隔符
    public static void separator(){
		System.out.println("路径分隔符:\t"+ File.pathSeparator);
		System.out.println("名称分隔符:\t"+File.separator);
    }
}
---------------结果---------------
路径分隔符:	;
名称分隔符:	\

2. 文件操作

public class Demo01 {
    public static void main(String[] args) throws Exception{
        //(2)文件操作
        fileOpe();
	}
	
	//文件操作
    public static void fileOpe() throws Exception{
        //创建文件
        File file = new File("D://c.txt");//创建文件对象,电脑上还没有
        if(!file.exists()){//如果文件已存在则不执行
            boolean a =file.createNewFile();//创建文件,返回值为逻辑值,true为创建成功
            System.out.println("创建结果:"+a);
        }

        //删除文件 第一种方法:
//        boolean b= file.delete();
//        System.out.println("删除结果:"+b);
        //第二种方法  使用jvm退出时删除
//        file.deleteOnExit();//文件会在虚拟机关闭后删除
//        Thread.sleep(5000);

        //获取文件信息
        System.out.println("文件绝对路径:"+file.getAbsoluteFile());
        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());
    }
}
---------------结果---------------
文件绝对路径:D:\c.txt
获取路径:D:\c.txt
获取文件名称:c.txt
获取父路径:D:\
获取文件长度:26
文件创建时间:2021-4-9 21:59:24
是否可写:true
是否是文件:true
是否隐藏:false

3. 文件夹操作

public class Demo01 {
    public static void main(String[] args) throws Exception{
        //(3)文件夹操作
        directoryOpe();
	}
	
	//文件夹操作
    public static void directoryOpe() throws Exception{
        //创建文件夹
        File dir = new File("D://aaa//bbb");
        System.out.println(dir.toString());
        if(!dir.exists()){
            //dir.mkdir();//只能创建单级目录
            boolean b = dir.mkdirs();//创建多级目录
            System.out.println("创建结果:"+b);
        }
        //删除文件夹
            //直接删除
//        System.out.println("删除结果:"+dir.delete());//只删除最底层目录,且是空目录
            //虚拟机删除
//        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:pics");
        String[] lis = dir2.list();
        System.out.println("------------------遍历文件目录--------------------");
        for (String s : lis) {
            System.out.println(s);
        }
    }
}
---------------结果---------------
D:\aaa\bbb
获取绝对路径:D:\aaa\bbb
获取路径:D:\aaa\bbb
获取名称:bbb
获取父目录:D:\aaa
文件创建时间:2021-4-11 13:05:51
是否是文件夹:true
是否是隐藏:false
------------------遍历文件目录--------------------
aaa
bbb.jpg
ccc.jpg

4. FileFilter接口(文件过滤器)

public interface FileFilter

  • boolean accept(File pathname)

当调用File类中的 listFiles()方法时,支持传入 FileFilter接口接口实现类,对获取文件进行过滤,只有满足条件的文件的才可出现在 listFiles()的返回值中.

import java.io.File;
import java.io.FileFilter;

public class Demo02 {
    public static void main(String[] args) {
        //FileFilter接口的使用
        File dir = new File("D://pics");
        File[] file = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if (pathname.getName().endsWith(".jpg")) {
                    return true;
                }
                return false;
            }
        });
        for (File file1 : file) {
            System.out.println(file1.getName());
        }
    }
}
---------------结果---------------
bbb.jpg
ccc.jpg

5. 递归遍历和递归删除

import java.io.File;

public class Demo03 {
    public static void main(String[] args) {
        //递归遍历文件
        listDir(new File("D://myfiles"));
        System.out.println("------------分隔符--------------");
        //递归删除文件
        deleteDir(new File("D://myfiles"));
    }
    //递归遍历文件
    public static void listDir(File dir){
        File[] files = dir.listFiles();
        System.out.println(dir.getAbsolutePath());
        if(files!=null && files.length>0){
            for (File file : files) {
                if(file.isDirectory()){
                    listDir(file);//递归
                }else{
                    System.out.println(file.getAbsolutePath());
                }
            }
        }
    }
    //递归删除文件
    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.getAbsolutePath()+"删除"+file.delete());
                }
            }
        }
        System.out.println(dir.getAbsolutePath()+"删除"+dir.delete());
    }
}
---------------结果---------------
D:\myfiles
D:\myfiles\TXT4.txt
D:\myfiles\文件1.rtf
D:\myfiles\文件夹1
D:\myfiles\文件夹1\TXT1.txt
D:\myfiles\文件夹1\TXT2.txt
D:\myfiles\文件夹2
D:\myfiles\文件夹2\TXT3.txt
------------分隔符--------------
D:\myfiles\TXT4.txt删除true
D:\myfiles\文件1.rtf删除true
D:\myfiles\文件夹1\TXT1.txt删除true
D:\myfiles\文件夹1\TXT2.txt删除true
D:\myfiles\文件夹1删除true
D:\myfiles\文件夹2\TXT3.txt删除true
D:\myfiles\文件夹2删除true
D:\myfiles删除true

补充:Properties

Properties:属性集合
特点

  • 1存储属性名和属性值
  • 2属性名和属性值都是字符串类型
  • 3没有泛型
  • 4和流有关

实例:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Properties;
import java.util.Set;

public class Demo04 {
    //propertics集合的使用
    public static void main(String[] args) throws Exception{
        //创建
        Properties properties = new Properties();
        //添加
        properties.setProperty("uername","张三");
        properties.setProperty("age","20");
        System.out.println(properties.toString());
        //遍历   stringpropertyNames()
        Set<String> proname = properties.stringPropertyNames();
        for (String s : proname) {
            System.out.println(s+"==="+properties.getProperty(s));
        }
        //和流有关的地方
        //list方法
        PrintWriter pw = new PrintWriter("D://b.txt");
        properties.list(pw);
        pw.close();
        //store保存方法
        FileOutputStream fos = new FileOutputStream("D://c.properties");
        properties.store(fos,"注释 ");
        //load加载
        Properties properties1 = new Properties();
        FileInputStream fis = new FileInputStream("D://c.properties");
        properties1.load(fis);
        fis.close();
        System.out.println(properties1.toString());
    }
}
---------------结果---------------
{age=20, uername=张三}
age===20
uername===张三
{age=20, uername=张三}

七. 总结:

  1. 流的概念

    • 内存与存储设备之间传输数据的通道。
  2. 流的分类

    • 按流向分:输入流、输岀流;
    • 按处理单位分:字节流、字符流;
    • 按功能分:节点流、过滤流;
  3. 序列化、反序列化

    • 将对象通过流写入到文件,或将对象通过流读取到内存,必须实现 Serializable接口。
  4. File对象

    • 代表物理盘符中的一个文件或者文件夹

上一篇
JAVA I/O框架(一)
链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值