黑马程序员--I/O流知识点总结(二)



——- android培训java培训、期待与您交流! ———-

使用指定的码表读写字符

           /*
               *  FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)
               * FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)*/
    private static void demo1() throws UnsupportedEncodingException,
            FileNotFoundException, IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("UTF-8.txt"),"UTF-8");
                                                           //(字节流,编码表)通过指定编码表读写
        OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("GBK.txt"),"GBK");
                                                           //(字节流,编码表)通过指定编码表写 
        int b; 
        while((b = isr.read()) != -1){
            osr.write(b);
        }
        isr.close();
        osr.close();
    }                                                  
private static void demo2() throws UnsupportedEncodingException,
            FileNotFoundException, IOException {
        BufferedReader br = //高效转换流
                new BufferedReader(new InputStreamReader(new FileInputStream("UTF-8.txt"),"UTF-8"));
        BufferedWriter bw =               //InputStreamReader是字节通向字符的桥梁
                new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"),"GBK"));
                                          //OutputStreamWriter是字符通向字节的桥梁
        int b;
        while((b = br.read()) != -1){
            bw.write(b);
        }
        br.close();
        bw.close();

内存输出流

/* 1.什么是内存输出流
    * 该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据
   2.使用方式
    * 创建对象: new ByteArrayOutputStream()
    * 写出数据: write(int), write(byte[])
    * 获取数据: toByteArray()*/


/*定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)*/
public class Test1 {
    public static void main(String[] args) throws IOException {

        FileInputStream fis = new FileInputStream("ddd.txt");//创建字节输入流,并关联ddd.txt
        ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建内存输出流
        int len;
        byte[] b = new byte[5];//创建大小为5 的数组
        while((len = fis.read(b)) != -1){//将文件上内容读到字节数组中
            bos.write(b,0,len);    //将数组中的数据写出到内存缓冲区中
        }

打印流

/*打印流
     * 该流可以很方便的将对象的toString()结果输出, 并且自动加上换行, 而且可以使用自动刷出的模式
     * 只操作数据目的      对应是是FileOutputStream*/

    private static void demo2() throws FileNotFoundException {
        //字符打印流
        PrintWriter pw = new PrintWriter(new FileOutputStream("ddd.txt"),true);
                                                              //是autoFlush方法  是boolean类型的给true就自动刷新
        pw.print(97);
        pw.write(45);
        pw.println(97);//autoFlush自动刷新还针对println有效
        pw.close();//关流也能刷新所以意义不大
    }

    private static void demo1() {
        //打印字节流
        PrintStream ps = System.out;
        ps.println(97);//打印a//其实底层用的是Integer.toString(x),将x转换为数字字符串打印
        ps.println(new Peason("小李",23));
        Peason p = null;
        ps.println(p);//如果是null,就返回null,如果不是null,就调用对象的toString(),这里是默认toString方法
    }

}

随机访问流

 RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。
    * 支持对随机访问文件的读取和写入。
     */
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile("ddd.txt","rw");
        System.out.println( raf.read()); //可以读也可以写
        raf.seek(3);//设置指针在指定位置写入
        raf.write(98);
        raf.close();
    }

Properties

/*:Properties 是MAP集合Hashtable 的子类
         * 可以没有泛型,可以说是一个配置工具
        * Properties 类表示了一个持久的属性集。
        * Properties 可保存在流中或从流中加载。
        * 属性列表中每个键及其对应值都是一个字符串。 */
        //demo1();
        //demo2();
        //list 和load 方法
        Properties pr = new Properties();
        pr.load(new FileInputStream("ddd.properties"));//获取文件上的数据
        pr.setProperty("name", "zhangsan");           //进行修改和填充
        pr.list(new PrintStream("ddd.properties"));    //写回到文件中
        System.out.println(pr);
    }

    private static void demo2() {
        Properties pr = new Properties();
        pr.setProperty("姓名","四" );
        pr.setProperty("qq","12345676" );
        pr.setProperty("工号","234" );
        pr.setProperty("电话","18945679876" );

        @SuppressWarnings("unchecked")
        Enumeration<String> en = (Enumeration<String>)pr.propertyNames();//调用迭代器

        while(en.hasMoreElements()){       //判断集合中是否有元素
            String key =en.nextElement();  //获取键
            String value = pr.getProperty(key);//根据键获取值
            System.out.println(key+"-"+value);
        }
    }

    private static void demo1() {
        Properties pr = new Properties();//创建集合对象
        pr.setProperty("姓名","四" );           //添加内容因为是hashtable的子类所以是双列集合
        pr.setProperty("qq","12345676" );
        pr.setProperty("工号","234" );
        pr.setProperty("电话","18945679876" );

        System.out.println(pr);
        String value = pr.getProperty("姓名");//通过键获取值
        System.out.println(value);
    }

}

File类

File类简介

File类不属于java流系统,但它是文件流进行文件操作的辅助类,主要用于操纵文件及文件目录,包括删除、重命名文件或目录、查询文件的属性,创建子目录、列出目录下的文件等。

File类的构造

   给File类构造函数传一个String类型的路径就可以创建对象

   File(String pathname):根据一个路径得到File对象
   File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
   File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象

File类的几大动能

   创建功能:

        public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来

      注意: 如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。

  判断功能:

        public boolean isDirectory():判断是否是目录
        public boolean isFile():判断是否是文件
        public boolean exists():判断是否存在
        public boolean canRead():判断是否可读
        public boolean canWrite():判断是否可写
        public boolean isHidden():判断是否隐藏

   删除功能 :

        public boolean delete():删除文件或者文件夹

  注意事项:

Java中的删除不走回收站,所以使用时一定要谨慎使用。
要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹,要想删除必须把里面内容先删掉,这里用递归比较多。

     重命名功能:

      注意事项:

如果路径名相同,就是改名。
如果路径名不同,就是改名并剪切

public static void main(String[] args) {
        File file = new File("ddd");
        File file2 = new File("fff");//如果路径相同就直接改名,路径不同就剪切并改名
        boolean b = file.renameTo(file2);//此处只能放一个file对象
        System.out.println(b);

获取功能:

public class File类的获取功能 {
    public static void main(String[] args) {
        /*获取功能
    * public String getAbsolutePath():获取绝对路径
    * public String getPath():获取相对路径
    * public String getName():获取名称
    * public long length():获取长度。字节数
    * public long lastModified():获取最后一次的修改时间,毫秒值
    * public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
    * public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组 */

        //demo();
        //demo2();
        File file2 = new File("F:\\day14java基础\\19");
            String[] arr1 = file2.list();//获取指定目录下的所有文件或者文件夹的名称数组
            for (String string : arr1) {
                System.out.println(string);
            }

            System.out.println("-------------");
            File[] subFiles = file2.listFiles();//获取指定目录下的所有文件或者文件夹的File数组
            for (File file : subFiles) {
                System.out.println(file);
            }
    }

    private static void demo2() {
        File file2 = new File("F:\\day14java基础\\19\\he.txt");
        long l = file2.length();//获取的是文件的长度,返回的是文件的字节数
        System.out.println(l);
        File file3 = new File("C:\\drivers");
        long l1 = file3.length();//      获取的是文件夹的长度,返回的是零
        System.out.println(l1);
    }

    private static void demo() {
        File file1 = new File("he.txt");
        System.out.println(file1.getAbsolutePath());//获取绝对路径
        System.out.println(file1.getPath());//获取相对路径
        System.out.println(file1.getName());//获取名称
    }

}

文件名称过滤器的概述
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)

通过一个练习了解过滤器的使用

/*需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称*/
    public static void main(String[] args) {
        File file = new File("E:\\");       //创建File对象并关联E文件夹
        /*第一种方法
         * String[] arr = file.list();     //获取这个文件路径下所有的文件和文件夹路径
         * 
        for (String string : arr) {
            if (string.endsWith(".jpg")) {
                System.out.println(string);
            }
        }*/
        /*第二种方法  这种方法以后用的较多
         * File[] subFiles = file.listFiles();//获取文件夹路径

        for (File file2 : subFiles) {    //将文件夹内容进行遍历
            if (file2.isFile()&&file.getName().endsWith(".jpg")) {//判断是文件并且后缀是.jpg
                System.out.println(file.getName());
            }
        }*/
        //第三种方法     这里用的是文件名称的过滤器
        String[] arr = file.list(new FilenameFilter(){//传入过滤器对象

            @Override
            public boolean accept(File file, String name) {
                File file2 = new File(file,name);//创建File对象
                                     //父   子
                return file2.isFile()&&file2.getName().endsWith(".jpg");
            }});//判断
        for (String s : arr) {
            System.out.println(s);//遍历并打印
        }
    }

}

File类的递归

public static void main(String[] args) {

    //普通方法    如果太大了就不能运行
        /* int result = 1;
            for (int i = 0; i < 5; i++) {
                result = result * i;
            }
        System.out.println(result);*/
        System.out.println(fun(5));
    }

    //利用递归进行运算
    /** 递归
     * 方法自己调用自己
     * 弊端:容易栈内存溢出
     * 好处:不用知道调用次数
     * 
     * 构造函数不能使用递归
     * 递归调用是否必须有返回值?
     * 不一定(可以有也可以没有)*/
    public static int fun(int num){
        if(num == 1){
            return 1;
        }else{
            return num * fun(num-1);//自身方法的不断调用
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值