Java IO(1)

IO这一部分内容还是比较多的,对于基础的枯燥但是又重要的内容还是将它记下来比较好。

关于File类

Ø File类直接继承与Object类,File类描述了文件本身的一些属性,File类用来获取或者处理与磁盘上的文件相关的信息,例如文件权限、文件创建时间、文件路径等等,File类还可以用来浏览目录的层次结构。

Ø 一个File类对象表示磁盘上的文件或目录(目录也是一种特殊的文件)

Ø File类提供了一个与平台无关的方法,只可直接对磁盘上的文件或者目录进行操作,屏蔽了底层的相关技术。

Ø File类可以直接处理文件或者文件系统。

Ø File类并没有指定是从文件中读出信息还是将信息写入到文件中。

常用的构造方法:

File(String str) str表示文件的路径,在Java中对于Windows系统而言,比如这个路径: “D:\Java\jdk6”在windows系统中,路径的分隔符都使用‘\’这个和java中的转义字符一样了,因此要写成“\\”才能恢复本身的字符‘\’的功能。对于Linux的系统而言,文件路径之间的分隔符采用的是“/”左斜杠,这就不存在使用转移字符的问题了。对于从windows系统变到Linux系统上的Java程序,文件路径一定要对应地进行调整。

File(File parent,String str)这个表示在父目录parent下(parent在这里是一个目录文件),创建一个名为str的文件。只要是前后两部分拼接起来构成一个完整的文件路径就OK了。

File类一些常用的函数的示例:

package com.file.fileMethod;
import java.io.File;
import java.io.FilenameFilter;

public class methodTest {

    public static void main(String[]args){
        File file=new File("F:\\filetest1\\filetest2\\filetest3");
        System.out.println(file.isDirectory());
        System.out.println(file.isFile());
        //要是父目录没有生成的话 就会报错
        System.out.println(file.mkdir());
        //即使父目录没有 也会与多级目录一起 一并生成
        System.out.println(file.mkdirs());
        //List方法 列出当前目录下所有的子文件 以及子目录
        String[]names=file.list();
        for(String name:names){
            System.out.println(name);
        }
        //listFile方法 返回一个File数组 数组中的每个元素都是一个File对象 这样操作起来更容易
        File[]files=file.listFiles();
        for(File everyfile:files){
            System.out.println(everyfile.getName());

        }
        //getparent返回父类的File对象(String)
        System.out.println(file.getParent());
        //获取固定类型的文件 比如固定的后缀的
        //法一:使用list方法获取文件名数组 利用endwith判断结尾
        String[]names2=file.list();
        for(String name:names2){
            if(name.endsWith(".java")){
                System.out.println(name);
            }
        }

        //法二:有点类似于策略模式  主要是实现accept方法 需要先定义一下 FilenameFilter类 这里通过内部类的方式来实现
        //在方法的参数声明的地方 直接传入一个类的实例
        String[]names3=file.list(new FilenameFilter(){
            public boolean accept(File dir,String name){
                if(name.endsWith(".java"))
                return true;
                else
                return false;
            }
            });

        //delete方法 用于删除目录 如果目录中包含文件则没法删除
        //要是目录中还设有目录 只能通过递归的方式删除(文件操作中常用的技巧)
        System.out.println(file.delete());
        //自定义deleteall方法 通过递归的方式删除 执行此方法之后filetest2之下 为空
        deleteAll(new File("F:\\filetest1\\filetest2"));

    }
    // 删除目录以及其中的文件 (这个是文件操作中比较固定的模式)
    public static void deleteAll(File file){
        //如果是文件 或者为一个空目录 则删除 这个是递归的出口
        if(file.isFile()||file.list().length==0){
            file.delete();
            return;
        }
        //往下递归
        else{
            File[]files=file.listFiles();
            for(File f:files){
                //递归删除
                deleteAll(f);
            }

        }

        return;
    }

}

一个比较典型的题目,有的时候面试也会考到的:创建一个当前目录下的目录树,要求每一层目录都有缩进,并且使得目录排在文件的前面

实现如下:

package com.file.filetree;

import java.io.File;
import java.util.ArrayList;

public class fileTree {
    public static void main(String[]args){

        File directory=new File("F:\\test");
        traverse(directory,0);
    }

    //n表示空格的个数
    public static void Print(String str,int n){
        //先打印换行符
        System.out.print(‘\n‘);
        int i;
        for(i=0;i<n;i++)
        {System.out.print(" ");}
        System.out.print(str);
        return;

    }

    //最简单的排序思路 遍历两次 第一次把目录文件放入 第二次把文件放入
    public static File[] sort(File[] files){
        ArrayList<File>sorted=new ArrayList<File>();
        for(File f:files){
            if(f.isDirectory()){
                sorted.add(f);
            }
        }
        //再遍历一次 把文件放入
        for(File f:files){
            if(f.isFile()){
                sorted.add(f);
            }
        }
        //将一个Arraylist转化为一个File数组
        //方法是先声明一个对应长度的File类型的数组空间 再将这个Arraylist中的内容由toArray方法赋给数组
        File[]newfiles=new File[sorted.size()];
        sorted.toArray(newfiles);
        return newfiles;

    }

    //递归遍历目录
    public static void traverse(File file,int n){

        File[]files =file.listFiles();
        //当前为文件 或者为空目录 打印 这个判断条件基本上是类似的问题中常常遇到的
        if(file.isFile()||files.length==0)
        {
            Print(file.getName(),n);
            return;
        }
        else
        {
            //先对当前的File对象排一下序 目录放前面 文件放后面
            files=sort(files);
            //如果当前是一个非空的目录 先把当前目录打印了 再递归
            Print(file.getName(),n);
            for(File f:files){
                traverse(f,n+20);
            }

        }

    }

}

缩进的实现主要是通过对前面输出的空格数目进行控制,对于每一层来说,在输出文件名之前都要输出对应数目的空格。先文件夹,后文件的输出方式也是通过对每一层的非空目录进行简单的排序来实现的。

Java IO(1)

时间: 2024-11-10 08:07:23

Java IO(1)的相关文章

java IO之输入流——InputStream

java的基本输入流是java.io.InputStream,该抽象类定义了输入流的基本输入操作方法,实现自该抽象类的子类都有定义自己的数据源,例如ByteArrayInputStream的构造函数指定了ByteArrayInputStream输入流的数据源必须是一个字符数组.这就可以有多种不同的数据源,包括:字符数组.String对象.文件."管道".一个由其他种类的流组成的序列... 1 public ByteArrayInputStream(byte buf[]) {} 2 3

Hive报错 Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:user.name%7D

报错信息如下 Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:user.name%7D 解决方法: 编辑 hive-site.xml 文件,添加下边的属性 <property> <name>system:java.io.tmpdir<

java.io.IOException: No space left on device 错误

今天碰到比较奇怪的问题: 7/05/14 19:20:24 INFO util.Utils: Fetching http://192.168.31.160:33039/jars/spark_study_java-0.0.1-SNAPSHOT-jar-with-dependencies.jar to /tmp/spark-446068a4-aaa4-4277-b009-908bf0d4ecac/executor-dcc3175b-7d19-4485-81e1-bf31a83a66b4/spark-

【java】io流之字节输入流:java.io.InputStream类及子类java.io.FileInputStream

1 package 文件操作; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 8 public class TestInputStream { 9 public static void main(String[] args) throws IOException { 10 File file=new F

java io 学习

1,io 体系 在整个Java.io包中最重要的就是5个类和一个接口.5个类指的是File.OutputStream.InputStream.Writer.Reader:一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了. Java.io包中定义了多个流类型类实现输入输出的功能,从不同的角度可以分为: ~按照数据流方向的不同可以分为输入流和输出流. ~按照按照数据处理单位的不同可以分为字节流和字符流. 如下几张图可以直观的描述io

Java IO流 探险

Java的IO流使用了一种装饰器设计模式,它将IO流分为底层节点流和上层处理流.本篇重点在如何访问文件与目录.如何以二进制格式和文本格式来读写数据.对象序列化机制.还有Java7的"NIO.2". 装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么自定义的该类称为装饰类. 装饰类通常会通过构造方法接收被装饰的对象.并基于被装饰的对象的功能,提供更强的功能. IO的方式通常分为:BIO(同步阻塞).NIO(同步非阻塞).AIO

Play生产模式下java.io.FileNotFoundException那点事

之前”用Scala+Play构建地理数据查询接口”那篇文章里,用到的数据是json格式的文本文件area.json,存放在conf/jsons文件夹下.最开始是放在public/文件夹下,在线上准生产模式下运行: activator dist 得到mosquito-1.0.zip压缩包,解压后: 去/bin目录下运行mosquito脚本报错: java.io.FileNotFoundException 然后就去解压的mosquito-1.0/看发现并没有public文件夹,由此可见public文

keytool 错误: java.io.FileNotFoundException: 拒绝访问

keytool 错误: java.io.FileNotFoundException: 拒绝访问 打开命令行,切换到D:\AndroidStudioProjects\MyApplication\app目录 keytool 在JDK的/bin目录下,比如:/opt/jdk/bin 用以下的命令生成一个证书: keytool -genkey -alias android.key -keyalg RSA -validity 20000 -keystore android.key 老是报如题的错误: 后来

Java IO详解(转)

IO是Java及众多编程语言很重要的一块,同时很多程序的瓶颈和耗时操作也都在IO这块. 一.简介 IO操作面临很多问题,信息量的巨大,网络的环境等等,因为IO不仅仅是对本地文件.目录的操作,有时对二进制流.还有一部分是网络方面的资源,所以多种原因直接造成IO操作无疑是耗时且复杂多变的.Java对IO的支持是个不断的演变过程,经过了很多的优化,直到JDK1.4以后,才趋于稳定,在JDK1.4中,加入了nio类,解决了很多性能问题,虽然我们有足够的理由不去了解关于Java IO以前的情况,但是为了学

Java IO操作:合并流

合并流:把两个文件合并在一起. 主要操作的是内容. 定义: public class SequenceInputStreamextends InputStream 方法摘要: 操作步骤: 1,分别建立两个FileInputStream实例对象,用于输出指定两个文件. 2,建立一个FileOutputStream实例,用于合并写入两个文件. 2,通过SequenceInputStream类,把两个文件的内容合并起来,放到这个类实例流中. 3,把SequenceInputStream实例的内容读取出