• 文件操作File类和IO流


    File 类

    java.io包

    File的对象创建:

    public class TestFile1 {
        public static void main(String[] args) {
            File file1=new File("D:\hello.txt");
            if(file1.exists()) {
                System.out.println("文件存在");
            }else {
                System.out.println("文件不存在");
            }
            File file2=new File("D:\","test.txt");
            if(file2.exists()) {
                System.out.println("文件存在");
            }else {
                System.out.println("文件不存");
            }
            File file=new File("D:\");
            File file3=new File(file,"test.txt");
            if(file3.exists()) {
                System.out.println("文件存在");
            }else {
                System.out.println("文件不存在");
            }
        }
    }
    

    File的createNewFile()方法: 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件.

    返回: 
    如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回 false 
    
    public class TestFie2 {
        public static void main(String[] args) throws IOException {
            File file=new File("D:\test.txt");
            if(file.exists()) {
                System.out.println("文件存在");
            }else {
                //创建这个文件
                if(file.createNewFile()) {
                    System.out.println("文件创建成功!");
                }
            }
        }
    }
    

    mkdir

    public boolean mkdir() 创建此抽象路径名指定的目录。

    public class TestFile3 {
        public static void main(String[] args) throws IOException {
            File path = new File("D:\mydir");
            File myfile = new File(path, "test.txt");
            if (!path.exists()) {
                if (path.mkdir()) {
                    if (!myfile.exists()) {
                        if (myfile.createNewFile()) {
                            System.out.println("文件创建成功!");
                        }
                    }
                }
            }
        }
    }
    

    mkdirs

    public boolean mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必需的父目录。

    public class TestFile4 {
        public static void main(String[] args) throws IOException {
            File path=new File("D:\newdir\myfile");
            File file=new File(path,"test.txt");
            if(!path.exists()) {
                if(path.mkdirs()) {
                    if(!file.exists()) {
                        if(file.createNewFile()) {
                            System.out.println("文件创建成功!");
                        }
                    }
                }
            }
        }
    }
    

    delete

    public boolean delete( 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。

    public class TestFile5 {
        public static void main(String[] args) {
            File file=new File("D:\newdir\myfile\test.txt");
            if(file.delete()) {
                System.out.println("删除成功!");
            }else {
                System.out.println("删除失败!");
            }
        }
    }
    

    getName

    public String getName() 返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空,则返回空字符串。

    getPath

    public String getPath() 将此抽象路径名转换为一个路径名字符串。所得字符串使用默认名称分隔符分隔名称序列中的名称。

    length

    public long length() 返回由此抽象路径名表示的文件的长度。如果此路径名表示一个目录,则返回值是不确定的。

    public class TestFile6 {
        public static void main(String[] args) {
            File file=new File("D:\newdir\myfile\test.txt");
            String absolutePath=file.getAbsolutePath();
            System.out.println(absolutePath);
    
            String path=file.getPath();
            System.out.println(path);
    
            String name=file.getName();
            System.out.println(name);
    
            long length=file.length();
            System.out.println("文件的长度:"+length);
        }
    }
    

    lastModified

    public long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。

    返回: 
    表示文件最后一次被修改的时间的 long 值
    
    public class TestFile7 {
        public static void main(String[] args) {
            File file=new File("D:\newdir\myfile\test.txt");
            long lastModified=file.lastModified();
            Date date=new Date(lastModified);
            System.out.println(date.toLocaleString());
        }
    }
    

    isDirectory

    public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。

    isFile

    public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。

    list

    public String[] list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

    public class TestFile8 {
        public static void main(String[] args) {
            File file = new File("D:\demo");
            //判断此file对象是否是一个目录
            if (file.isDirectory()) {
                String[] list = file.list();
                if (list != null) {
                    for (int i = 0; i < list.length; i++) {
                        System.out.println(list[i]);
                    }
                }
            }
        }
    }
    

    动态获取系统相关的分隔符

    public class TestFile10 {
        public static void main(String[] args) {
            File file=new File("D:"+File.separator+"newdir"+
                    File.separator+"myfile"+File.separator+"test.txt");
            if(file.exists()) {
                System.out.println("文件存在");
            }
        }
    }
    

    IO流

    I指的是Input的首字母

    O指的是Output的首字母

    文件流中流动的是数据,从外部设备(磁盘文件,键盘,网络)流入程序的称为输入流,从程序流到外部设备的流称为输出流。

    文件流按方向分可分为输入流和流出流。

    文件流按流中流动的内容分为字节流和字符流。

    InputStream此抽象类是表示字节输入流的所有类的超类。

    OutputStream此抽象类是表示输出字节流的所有类的超类。

    如果想要通过字节输出流,创建文件,并把程序数据输出到文件,需要使用OutputStream的子类。

    FileOutputStream

    public FileOutputStream(String name)
                     throws FileNotFoundException
    

    创建一个向具有指定名称的文件中写入数据的输出文件流

    public class OutputStreamTest1 {
        public static void main(String[] args) 
                throws IOException {
            OutputStream os=
                    new FileOutputStream("D:"+File.separator+"abc.txt");
            String data="hello";
            os.write(data.getBytes());
            os.close();
            System.out.println("写文件已完成");
        }
    }
    

    FileOutputStream

    public FileOutputStream(String name,
                            boolean append)
                     throws FileNotFoundException
    参数: 
    name - 与系统有关的文件名 
    append - 如果为 true,则将字节写入文件末尾处,而不是写入文件开始处 
    

    这种构造方法,可以通过设置第二个参数,实现追加文件内容,而不是覆盖文件的内容的功能。

    public class OutPutStreamTest2 {
        public static void main(String[] args) {
            FileOutputStream fos = null;
            try {
                fos = new FileOutputStream("D:\a2.txt",true);
                fos.write("bbbbb".getBytes());
            } catch (FileNotFoundException ex) {
                ex.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(fos!=null) {
                    try {
                        fos.close();
                    }catch(Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }
    }
    以上示例实现向已存在文件a2.txt追加内容的功能。
    

    从磁盘文件中读取数据到程序,需要用到文件输入流,如果要以字节流的方式读取数据,要用到InputStream,InputStream是一个抽象类,所以要想实现字节方式从文件中读数据,要用到InputStream的子类,FileInputStream。

    InputStream:此抽象类是表示字节输入流的所有类的超类。
    public class FileInputStream
        extends InputStream
    

    FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。

    public class InputStreamTest1 {
        public static void main(String[] args) throws IOException {
            InputStream is=new FileInputStream("D:\abc.txt");
            //把流中的数据
            byte[] buffer=new byte[100];
            int length=is.read(buffer);
            if(length>0) {
                String s=new String(buffer);
                System.out.println(s);
            }
            is.close();
        }
    }
    

    使用FileInputStream实现文件的读取操作的标准写法

    public class InputStreamTest2 {
        public static void main(String[] args) throws IOException {
            InputStream is=new FileInputStream("D:\abc.txt");
            //把流中的数据
            byte[] buffer=new byte[1024];
            int len=-1;
            while((len=is.read(buffer))!=-1) {
                String s=new String(buffer,0,len);
                System.out.println(s);
            }
            is.close();
        }
    }
    

    练习:利用FileOutputStream和FileInputStream实现D:abc.txt文件复制到C:abc.txt

    public class FileCopy1 {
        public static void main(String[] args) {
            // 从读取文件,到程序中,再把程序中读到的数据写到C磁盘根目录
            FileInputStream fis = null;
            FileOutputStream fos = null;
            try {
                fis = new FileInputStream("D:\a.png");
                byte[] buffer = new byte[1024];
                int len = -1;// 读取到的数据的实际长度
                fos = new FileOutputStream("D:\b.png");
                while ((len = fis.read(buffer)) != -1) {
                    // 把读到的数据再写到C:\abc.txt
                    fos.write(buffer, 0, len);
                }
    
            } catch (FileNotFoundException ex) {
                System.out.println("访问的文件不存在!");
            } catch (IOException ex) {
                System.out.println("文件的读取错误");
            } catch (Exception ex) {
                System.out.println("未知类型的错误");
            } finally {
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException ex) {
                        System.out.println(ex.getMessage());
                    }
                }
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException ex) {
                        System.out.println(ex.getMessage());
                    }
                }
            }
    
            System.out.println("复制完成!");
        }
    }
    

    java.io

    类 Reader用于读取字符流的抽象类。

    FileReader类的继承关系 FileReader-->InputStreamReader-->Reader

    FileReader(String fileName) 
          在给定从中读取数据的文件名的情况下创建一个新 FileReader。
    read()方法:
         public int read()
             throws IOException
    读取单个字符
         public int read(char[] cbuf)
             throws IOException
    

    将字符读入缓冲区数组中

    public class FileRaderTest1 {
        public static void main(String[] args) throws IOException {
            FileReader fr=new FileReader("D:\a2.txt");
            char[] cbuffer=new char[100];
            fr.read(cbuffer);
            String s=new String(cbuffer);
            System.out.println(s);
        }
    }
    

    如果文件的长度大于缓冲区的长度,那么需要进行循环读取,参考代码:

    public class FileRaderTest1 {
        public static void main(String[] args) throws IOException {
            FileReader fr = new FileReader("D:\a2.txt");
            char[] cbuffer = new char[100];
            int len = -1;
            while ((len = fr.read(cbuffer)) != -1) {
                fr.read(cbuffer);
                String s = new String(cbuffer);
                System.out.println(s);
            }
            fr.close();
        }
    }
    

    java.io

    类 Writer写入字符流的抽象类。

    FileWriter这个类是Writer类的一个间接子类。

    它和Writer之间的继承关系是: FileWriter->OuputStreamWriter->Writer

    FileWriter构造方法:
    FileWriter(String fileName) 
        根据给定的文件名构造一个 FileWriter 对象。
    FileWriter(String fileName, boolean append) 
    据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
    
    public class FileWriterTest1 {
        public static void main(String[] args) throws IOException {
            FileWriter writer=new FileWriter("D:\a3.txt",true);
            String s="hello world!";
            char[] cbuf=s.toCharArray();
            writer.write(cbuf);
            //刷新缓冲区
            writer.flush();
            //关闭字符输出流
            writer.close();
        }
    }
    

    如果在使用构造方法时设置了append这个参数,则可以通过true实现向已有文件进行内容的追加,如果没有使用append则文件不存在就创建,存在就覆盖。

    使用:FileReader和FileWriter实现文件的复制。

    键盘输入6个学生的信息包括学生的姓名、语文、数学、英语 的考试成绩:
    public class LianXi {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            FileWriter writer = null;
            try {
                writer = new FileWriter("D:\student.txt");
                for (int i = 0; i < 3; i++) {
                    System.out.println("请输入第"+(i+1)+"信息:");
                    System.out.println("请输入姓名:");
                    String name=input.next();
                    System.out.println("请输入语文:");
                    String chinese=input.next();
                    System.out.println("请输入数学:");
                    String math=input.next();
                    System.out.println("请输入英语:");
                    String english=input.next();
    
                    writer.write(name+"	"+chinese+"	"+math+"	"+english+"
    ");
                    writer.flush();
                }
            } catch (Exception ex) {
                throw new RuntimeException();
            }finally {
                if(writer!=null) {
                    try {
                        writer.close();
                    }catch(Exception ex) {
                        ex.printStackTrace();
                    }finally {
                        writer=null;
                    }
                }
            }
            System.out.println("保存完成!");
        }
    }
    
  • 相关阅读:
    地区列表
    storyboard
    快捷键2
    关于本地缓存
    深入浅出Cocoa之消息
    ARC和Non-ARC下的单例模式
    runloop原理介绍
    ARC内存管理机制详解
    解决UITableViewCell separator左侧不贴边
    UICollectionView的使用
  • 原文地址:https://www.cnblogs.com/mxybk/p/11342799.html
Copyright © 2020-2023  润新知