zoukankan      html  css  js  c++  java
  • 第八章I/O

    一、File的使用

    ①、new File(String fileName);的意义

    ②、获取当前文件夹下的所有文件

    ③、获取当前文件夹时候过滤掉不许要的文件夹

    ④、创建File文件,了解mkDir()和mkDirs()的区别

    ⑤、各种获取File路径的方法,和不同之处

    二、I/O

    ①、几个重要的流

    ByteArrayInputStream 、ByteArrayOutputStream、DataInputStream、DataOutputStrean、BufferedInputStream

    ②、stream转换成writter流(字节流转换成字符流)

    ③、RandomAccessFile的使用

    ④、PrintWrite

    回答:

    一、newFile()的作用

    获取这个File文件的句柄,①、文件可以指Directory(文件夹,目录)也可以是File(文件,具体文件)

    ②、当文件不存在的时候,也是会获得文件的句柄(不过该句柄没任何作用而已),并且不会创建该文件。

    二、获取当前文件夹的所有文件

    调用file.listFiles()方法,返回File[]数组,如果想转成List就添加上Arrays.asList();转型

    三、读取时候添加文件过滤器(FileNameFilter)

    /**
     * 原理:通过调用file的listFile()获取file文件夹下的文本
     * listFile(FileNameFilter filter)
     * FileNameFilter代表文件名过滤器,这是一个接口,需要自己创建。(策略模式)
     * 之后listFile()会重复调用accept()方法
     */
    public class Main {
        
        public static void main(String[]args){
            //获取文件的句柄
            File file = new File("D://VS");
            //返回的是数组
            File[] files = file.listFiles(new FileFilter(".*"));
            //通过Arrays转化成为Collection,当然这是只读的List
            List<File> lists = Arrays.asList(files);
            for(File myFile:lists){
                System.out.println(myFile.getName());
            }
        }
    }
    
    class FileFilter implements FilenameFilter{
        private Pattern pattern;
        //正则表达式,添加过滤条件
        public FileFilter(String reg){
            pattern = Pattern.compile(reg);
        }
        
        @Override
        public boolean accept(File dir, String name) {
            // TODO Auto-generated method stub
            //判断是否符合过滤条件
            return pattern.matcher(name).matches();
        }
        
    }
    Main

    四、创建File文件

    //获取句柄
    File file  = new File("test");
    //如果该文件不存在实体的时候,创建该文件
    if (!file.exists()){
       file.mkDir();//创建该文件或文件夹  
    }
    createFile

    1、File类的createNewFile根据抽象路径创建一个新的空文件,当抽象路径制定的文件存在时,创建失败  

    2、File类的mkdir方法根据抽象路径创建目录 

    3、File类的mkdirs方法根据抽象路径创建目录,包括创建必需但不存在的父目录  

    4、File类的createTempFile方法创建临时文件,可以制定临时文件的文件名前缀、后缀及文件所在的目录,如果不指定目录,则存放在系统的临时文件夹下。  

    5、除mkdirs方法外,以上方法在创建文件和目录时,必须保证目标文件不存在,而且父目录存在,否则会创建失败  

    五、获取File文件的路径

    http://www.cnblogs.com/xulianbo/archive/2011/08/26/2154027.html

    getPath()返回的是File构造方法里的路径,不做任何处理

    getAbsolutePath()返回的是 user.dir+getPath(),也就是执行路径(默认保存的路径:比如说在C;//中)加上File构造方法中的路径

    getCanonicalPath()返回的是将符号完全解析的路径,也就是全路径

    所以:推荐使用getCanonicalPath()

     

    六、重要的IO流

    ByteArrayInputStream:   从byte[] bytes中读取 bytes文件中的字节。

    例:

    byte [] bytes = new byte[1024];
            String str = "hello world";
            bytes = str.getBytes();
            //创建byte流输出
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
            int b = -1;
            while((b = bais.read()) != -1){
              System.out.print(b + "  ");
            }
            System.out.println("");
            //for循环输出
            for(int i=0; i<bytes.length; ++i){
                System.out.print(bytes[i]+"  ");
            }

    使用ByteArrayInputStream的优点:可以套接其他流的装饰类

    ByteArrayOutputStream:将文件以字节的方式写入内存的缓冲区。   然后再将byte提取出来。

    例:

    public class Main {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            File file = new File("test");
            try {
                FileInputStream fis = new FileInputStream(file);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int b = 0;
                while((b = fis.read()) != -1){
                    baos.write(b);
                }
                byte [] bytes = new byte[1024];
                bytes = baos.toByteArray();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    
    }

    DataInputStream: 从文件中读取基础类型。 我们一般都是从流中读取字节然后在转化成String类型,DataInputStream可以直接读取字节并转化成int 、char等基础类型。(感觉要与DataOutputStream配套使用才有效果) 提供 readInt()、readUTF8()等方法

    DataOutputStream:将基础类型输出到文件中。提供writeInt()、writeUTF8()等方法。

    例:

    public class Main {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //创建文件
            File file = new File("D://asd.txt");
            if (!file.exists()){
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            FileOutputStream fos = null;
            //将数据输出到文件中
            try {
                //获取文件流
                fos = new FileOutputStream(file);
                DataOutputStream dos = new DataOutputStream(fos);
                dos.writeInt(5);
                dos.writeUTF("你好");
                dos.writeBoolean(true);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally{
                try {
                    fos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
            
            //从文件中获取数据
            try {
                FileInputStream fis = new FileInputStream(file);
                DataInputStream dis = new DataInputStream(fis);
                StringBuilder stringBuilder = new StringBuilder();
                //读取的顺序要按照放入的顺序来。
                stringBuilder.append(dis.readInt() +" ");
                stringBuilder.append(dis.readUTF()+ " ");
                stringBuilder.append(dis.readBoolean()+ " ");
                System.out.println(stringBuilder.toString());
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }
    DataStream

    BufferedInputSream: 在内部设定一个缓冲流,现将数据写入缓冲流再读取,这样就不需要反复写入,提交程序运行效率。

    RandomAccessFile:能够自定义锚点,从文件中的某个位置开始写入(比如说,从文件的最后开始写入)。支持读写。支持写入或者读取基引用类型。

    PrintWriter:格式化写入文件。可以防止乱码

  • 相关阅读:
    IsBadReadPtr|IsBadWritePtr调试崩溃
    VSCode配置python调试环境
    Visual Studio Code 如何编写运行 C、C++ 程序?
    使用nginx做反向代理
    Win10环境下配置VScode的C++编译环境
    关于java 获取 html select标签 下拉框 option 文本内容 隐藏域
    【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】
    VS Code 配置 C/C++ 环境
    改变你一生的编辑器:VSCode使用总结
    CentOS7,安装Tomcat8.5、JDK1.8,并设置开机启动(Linux CentOS Tomcat、JDK+Tomcat、Tomcat开机自启动)
  • 原文地址:https://www.cnblogs.com/rookiechen/p/5719049.html
Copyright © 2011-2022 走看看