IO流

Posted lyle-liu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流相关的知识,希望对你有一定的参考价值。

IO介绍

1.File类:
    File类: 文件或目录(文件夹)的**路径名。
    构造方法:
        public File(String pathname) : 创建了一个File对象, 表示的是参数中路径所代表的文件(文件夹)。
        public File(String parent, String child) : 创建了一个File对象, 表示的是父级路径和子级路径拼接起来之后所代表的文件(文件夹)。
        public File(File parent, String child) : 创建了一个File对象, 表示的是File中的父级路径和子级路径拼接起来之后所代表的文件(文件夹)。
    代码演示:
        public class FileDemo01 {
            public static void main(String[] args) {
                //createFileMethod1();
                //createFileMethod2();
                createFileMethod3();


            }

            private static void createFileMethod3() {
                //构造方法三:文件路径=File对象路径+子路径 拼接而成
                File parentFile = new File("d:\java");
                File file = new File(parentFile, "a.txt");
                System.out.println(file.exists());
            }

            private static void createFileMethod2() {
                //构造方法二:文件路径=父路径+子路径 拼接而成
                File file = new File("d:", "java\a.txt");
                System.out.println(file.exists());
            }

            private static void createFileMethod1() {
                //构造方法一:直接new,直接指定具体的文件路径,如果存在该文件,则file.exists()方法返回true
                File file = new File("d:\a.txt");
                System.out.println(file.exists());
            }
        }
    成员方法:
        路径:
        绝对路径:从盘符开始, 一直表示到最后的文件(文件夹)。
        相对路径:相对于某一个位置开始, 表示的路径。
        常用方法:
            获取方法:
            public String getAbsolutePath() : 获取绝对路径
            public String getPath() : 获取File构造方法中的路径 
            public String getName() : 获取File对象中最后所表示的文件(文件夹)的名字
            public long length() : 获取文件的字节个数, 不能获取文件夹的字节个数.
                UTF-8中: 一个中文字符占3个字节;
                GBK中: 一个中文字符占2个字节;
                代码演示:
                public class FileDemo02 {
                    public static void main(String[] args) {
                        File file = new File("D:\java\a.txt");
                        //获取绝对路径
                        System.out.println(file.getAbsolutePath());
                        //获取构造方法中指定的路径,也就是:D:javaa.txt
                        System.out.println(file.getPath());
                        //获取文件或文件夹的名字
                        System.out.println(file.getName());
                        //获取文件的字节个数,不能获取文件夹的字节个数
                        System.out.println(file.length());
                    }
                }
            判断方法:
                public boolean exists() : 判断File表示的文件(文件夹)是否存在
                public boolean isFile() : 判断File表示的内容是否是文件
                public boolean isDirectory() : 判断File表示的内容是否是文件夹
            创建方法:
                注意:创建了一个File对象, File对象表示的文件(文件夹)不一定存在.
                public boolean createNewFile() : 当File表示的文件不存在的时候, 创建这个新文件.
                public boolean mkdir() : 创建单级文件夹
                public boolean mkdirs() : 创建多级文件夹(也可以创建单级)
                代码演示:
                public class FileDemo03 {
                    public static void main(String[] args) throws IOException {
                        //createNewFile();
                        //singleDir();
                        manyDirs();


                    }

                    private static void manyDirs() {
                        //创建File对象,指定路径,路径对应的文件夹不一定存在
                        File path = new File("d:\lyle\ly\web");
                        //创建多级文件夹,也可以用于创建单级文件夹
                        //调用mkdirs()方法,如果文件夹不存在,则创建文件夹
                        path.mkdirs();
                    }

                    private static void singleDir() {
                        //创建File对象,指定路径,路径对应的文件夹不一定存在
                        File path = new File("d:\lyle");
                        //创建单级文件夹
                        //调用mkdir()方法,如果文件夹不存在,则创建单级文件夹
                        path.mkdir();
                    }

                    private static void createNewFile() throws IOException {
                        //创建File对象,指定路径,路径对应的文件不一定存在
                        File path = new File("d:\a.txt");
                        //调用createNewFile方法,如果文件不存在,则创建这个文件
                        path.createNewFile();
                    }
                }
            删除方法:
                public boolean delete() : 删除文件和文件夹
                注意事项:
                    1. 只能删除空文件夹;
                    2. 删除的内容不走回收站
                public class FileDemo04 {
                    public static void main(String[] args) {
                        //deleteFile();
                        deleteDir();


                    }

                    private static void deleteDir() {
                        //删除文件夹,注意该方法只能删除空文件夹,而且删除后不进回收站
                        File file = new File("d:\lyle");
                        boolean delete = file.delete();
                        System.out.println(delete);
                    }

                    private static void deleteFile() {
                        //删除文件
                        File file = new File("d:\a.txt");
                        file.delete();
                    }
                }
            遍历文件夹:
                方法:
                public String[] list() : 获取文件夹中的所有文件和文件夹的名称, 把它们存放到返回的String数组中.
                public File[] listFiles() : 获取文件夹中的所有文件和文件夹, 把它们以File对象的方式存放到返回的File数组中.
                代码演示:
                    public class FileDemo05 {
                        public static void main(String[] args) {
                            //list();
                            //常用方法:listFiles(),获取文件对象的数组
                            File file = new File("d:\java");
                            File[] files = file.listFiles();
                            for (File file1 : files) {
                                System.out.println(file1);
                            }

                        }

                        private static void list() {//获取指定文件夹中的所有文件和文件夹的名称,组成字符串数组返回,该方法并不常用
                            File file = new File("d:\java");
                            String[] list = file.list();
                            for (String s : list) {
                                System.out.println(s);
                            }
                        }
                    }
                
2.递归介绍:
    递归:方法调用方法本身。
    注意事项:
        递归必须有出口;
        递归的次数不能过多;
    
    实例:递归求阶乘
        public class Factorial {
            public static void main(String[] args) {
                //System.out.println(fun(5));
                System.out.println(fun2(5));
            }

            /**
             * 求n 的阶乘
             * for循环方式
             * @param n
             * @return
             */
            public static int fun(int n) {
                int result = 1;
                if (n == 0 || n == 1) {
                    return result;
                } else {
                    for (int i = n; i > 0; i--) {
                        result *= i;
                    }
                    return result;
                }
            }
            /**
             * 求n 的阶乘
             * 递归方式
             * @param n
             * @return
             */
            public static int fun2(int n) {
                int result = 1;
                if (n == 0 || n == 1) {
                    return result;
                } else {
                    return result=n*fun2(n-1);
                }
            }
        }
        
    递归获取所有文件夹和文件:
        public class FileDemo {
            public static void main(String[] args) {
                getAllFiles(new File("d:\java"));
            }

            public static void getAllFiles(File dir){
                File[] files = dir.listFiles();
                for (File file : files) {
                   // System.out.println(file);
                    if (file.isFile()){
                        //System.out.println("是文件,直接打印");
                        System.out.println(file);
                    }else {
                        System.out.println("是文件夹,递归遍历");
                        getAllFiles(file);
                    }
                }
            }
        }
    
IO:
    作用:数据的传输
    分类:
        根据数据的流向分为:**输入流**和**输出流**- **输入流** :把数据从`其他设备`上读取到`内存`中的流。 
            - **输出流** :把数据从`内存` 中写出到`其他设备`上的流。
        根据数据的类型分为:**字节流**和**字符流**- **字节流** :以字节为单位,读写数据的流。
            - **字符流** :以字符为单位,读写数据的流。
            
    字节输出流:OutputStream
        public class FileOutPut {
            public static void main(String[] args) throws Exception{
                //字符输出流关联的文件如果不存在,则会自动创建该文件
                //如果该文件存在,则会清空该文件里面的内容
                OutputStream os=new FileOutputStream(new File("d:\java\a.txt"));
                byte[] b=("十步杀一人,千里不留行。
" +
                        "事了拂衣去,深藏身与名。")
                        .getBytes();
                os.write(b);
                os.flush();
                os.close();
            }
        }
        
    字节输入流:InputStream
        public class FileInput {
            public static void main(String[] args) throws Exception{
                //输入流关联的文件如果找不到,则会报异常(文件找不到)
                InputStream is=new FileInputStream("d:\java\a.txt");
                int b;
                
                while ((b=is.read())!=-1){//如果读取到文件末尾,返回-1
                    System.out.println(b);
                }

                is.close();

            }
        }
        
    文件拷贝:一个字节一个字节的拷贝,速度很慢
        public class FileCopy {
            public static void main(String[] args) throws Exception{
                //创建输入流读取文件
                InputStream is=new FileInputStream("d:\java\a.txt");
                //创建输出流写出文件
                OutputStream os=new FileOutputStream("d:\java\b.txt");
                //读取文件
                int b;
                while ((b=is.read())!=-1){
                    //写出文件
                    os.write(b);
                }
                //关流
                os.close();
                is.close();
            }
        }
        
    字节数组拷贝文件:速度比较快
        public class FileArrayCopy {
            public static void main(String[] args) throws Exception{
                //创建输入流读取文件
                InputStream is=new FileInputStream("d:\java\Gmm.gif");
                //创建输出流写出文件
                OutputStream os=new FileOutputStream("d:\java\copyGmm.gif");
                //读取文件
                //定义字节数组,存储字节
                byte[] b=new byte[1024*8];
                int len;//读取长度
                long start = System.currentTimeMillis();
                while ((len=is.read(b))!=-1){
                    //写出文件
                    os.write(b,0,len);
                }
                long end = System.currentTimeMillis();
                System.out.println((end-start));
                //关流
                os.close();
                is.close();
            }
        }
        
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        

 

以上是关于IO流的主要内容,如果未能解决你的问题,请参考以下文章

在 .net 中处理 pcm wav 流

此应用小部件片段中所有意图 (PendingIntents) 的逻辑流

JavaSE 一些技巧 04——IO流各种流常用代码整理

猜数小游戏升级版(IO流实现,对IO流进行加强理解运用)

利用IO(文件字符流)打印代码本身

JAVA IO流相关代码(Serializable接口,管道流PipedInputStream类,RandomAccessFile类相关代码)