zoukankan      html  css  js  c++  java
  • IO流知识总结

    IO流:(Input Output) 输入输出流  

           输入:将文件读到内存中。

           输出:将文件从内存输出到其他地方。

           

     IO计数的作用:主要就是解决设备和设备之间的数据传输问题。

                        比如:硬盘到--->内存,内存数据--->硬盘中 把键盘中的数据写入到内存。

     IO的应用场景:

            比如:打卡机打出信息表、注册的时候图片的上传、下载 功能、解析XML

            数据保存到本地,数据一个永久保存。数据保存到磁盘上是以文件的形式存在的。

          

      java中如何操作文件:

      java是通过File文件类来操作文件和文件夹。

         

          File(File parent, String child)

               根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

          File(String pathname)

               通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。

          File(String parent, String child)

               根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

         java是跨平台的不同的操作系统上都可以运行。

         

    目录分隔符:

             不同的系统目录 的分隔符是不一样的。

             Windows系统上目录分隔符: ,但是Linux系统上的目录分隔符是 / 。

             注意点:在Windows上 或者 / 都可以作为目录的分隔符,如果你用的反斜杠,

            U盘中的文件拷贝到电脑中:输入流--->读到内存--->通过输出流读到电脑磁盘中。      

            代码是在内存中运行的。  

      路径问题:

       绝对路径 : 文件在硬盘上的完整路径。绝对路径一般都是以盘符开头  D:\a.txt  绝对路径

       相对路径  : 相对路径就是资源文件相对当前程序所在的路径

    File中常用的方法:

        创建:

        CreateNewFile() 在指定位置创建一个空文件,成功就返回true,如果已存在就不创建然后返回false

    mkdir() 在指定位置创建目录,这只会创建最后一级目录,如果上级目录不存在就抛异常。

    mkdirs() 在指定位置创建目录,这会创建路径中所有不存在的目录。

    renameTo(File dest) 重命名文件或文件夹,也可以操作非空的文件夹,文件不同时相当于文件的剪切,剪切时候不能操作非空的文件夹。移动/重命名成功则返回true,失败则返回false

      删除:

            delete() 删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除,成功返回true,失败返回false

    deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除

    创建文件的方法:

    File file = new File("D:\aa");

    System.out.println("通过指定的路径创建一个空的文件"+file.createNewFile());

    创建文件夹的方法

    File dir = new File("D:\cc");

    //1.不能够有同名的文件或文件夹  2.只能创建单级文件夹

    System.out.println("创建文件夹成功吗"+dir.mkdir());

    File dirs = new File("D:\bb\aa");System.out.println("创建文件夹成功吗?"+dirs.mkdirs());

    文件夹的重命名:

    File file = new File("D:\aa.txt");

    System.out.println("是否找到该文件夹?"+file.exists());

    File destFile = new File("D:\aabb"); //指的是重命名的名字

    System.out.println("重命名成功吗?"+file.renameTo(destFile));

    文件的重命名:

    File file = new File("D:\aa");

    System.out.println("重命名成功吗?"+file.renameTo(new File("D:\aa.txt")));

    //如果更改盘符  : renameTo 是做剪切的操作。

    File file = new File("D:\aa.txt");

    System.out.println("重命名成功吗"+file.renameTo(new File("G:\aa.txt")));

    删除:

    //1.delete() : 删除文件或空的文件夹。  直接删除掉

    File file = new File("D://a.txt");

    System.out.println("删除成功吗?"+file.delete());

    file.deleteOnExit();//用来删除临时文件

    System.out.println("哈哈");

       file.deleteOnExit(); //jvm退出的时候删除。

    判断方法

          exists() 文件或文件夹是否存在。

          isFile() 是否是一个文件,如果不存在,则始终为false

          isDirectory() 是否是一个目录,如果不存在,则始终为false

          isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。

          isAbsolute() 测试此抽象路径名是否为绝对路径名。

    获取方法

        getName() 获取文件或文件夹的名称,不包含上级路径。

        getPath()       返回绝对路径,可以是相对路径,但是目录要指定

        getAbsolutePath() 获取文件的绝对路径,与文件是否存在没关系

        length() 获取文件的大小(字节数),如果文件不存在则返回0L,如果是文件夹也返回0L

        getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回null

        lastModified() 获取最后一次被修改的时间。

    文件夹相关:

    staic File[] listRoots() 列出所有的根目录(Window中就是所有系统的盘符)

    list() 返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回null

    list(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null

    listFiles() 返回目录下的文件或者目录对象(File类实例),包含隐藏文件。对于文件这样操作会返回null

    listFiles(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回null

    获取最后一次被修改的时间:

    System.out.println("最后一次修改的时间:"+file.lastModified());

    long time = file.lastModified();

    Date date = new Date(time);

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    System.out.println("最后一次修改的时间:"+dateFormat.format(date));

     

    文件夹的操作;

    File[] files = File.listRoots(); // 获取windows电脑中所有的盘符

       for (File file : files) {

       System.out.println("盘符:"+file);

        }

     

    //获取指定文件夹下文件和子目录的字符串名称  ,子目录中的东西是获取不到的。

    File file = new File("D:\java ");

    String[] nameStrings =  file.list();

    for (String string : nameStrings) {

    System.out.println(string);

    }

    /*File file = new File("D:\java ");

    File[] files = file.listFiles();

    for (File file2 : files) {

    System.out.println("name:"+file2.getName());

    //判断file2指的是文件还是文件夹

    if(file2.isDirectory()){

    //从子目录中在次获取值

    File[] nextFiles = file2.listFiles();

    for (File file3 : nextFiles) {

    System.out.println("subname:"+file3.getName());

    }

    }

    }*/

     

    查找指定的后缀名的文件:

    File file = new File("D:\java课件及资料");

    //定义一个过滤器

    //FilenameFilter  一个接口

    String[] strings = file.list(new MyFilter());

    for (String string : strings) {

    System.out.println(string);

    }

     

    IO流的分类:

    流按照操作数据的类型分为两种:字节流,字符流

       字节流:读取的是文件的二进制数据,不会对二进制做处理。不会解析成看得懂的数据。

       字符流:读取的也是二进制数据,他会将这个二进制的数据转化为我们能够识别的字符(解码)。字符流是以字符为单位的。

      字符流 = 字节流 + 解码。

    按照流的方向可以分为:输入流,输出流

    判断流是输入还是输出以当期的应用程序为参考,观察出具是流入还是流出,如果流入就是输入流,如果流出就是输出流。

    字节流:

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

    如何判断一个流是字节输入流:

      判断一下他的类名是否是以InputStream结尾。

     使用 FileInputStream: InputStream的子类

    读取文件的四种方式:

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.IOException;

    public class Demo1 {

    /**

     * @param args

     * @throws IOException

     */

    public static void main(String[] args) throws IOException {

    // TODO Auto-generated method stub

    //         getFile();

    // getFile2();

    // getFile3();

    getFile4();

    }

    //方式四:通过创建缓冲区和循环的方式来读取

    public static void getFile4() throws IOException{

      //1.找目标文件

      File file = new File("D:\java课件");

      //2.建立通道

      FileInputStream fileInputStream = new FileInputStream(file);

      //3.创建一个缓冲区

      byte[] b = new byte[1024]; // 一般写1024倍数

      //4.读取数据

      int count = 0;

      while((count = fileInputStream.read(b))!=-1){

      

      System.out.println(new String(b,0,count));

      }

      //5.关闭资源

      fileInputStream.close();

    }

    //方式三:创建缓冲区来读取数据     缺陷不能够读取一个完整的文件

    public static void getFile3() throws IOException{

    //1.找目标文件

    File file = new File("D:\a.txt");

    //2.建立通道

    FileInputStream fileInputStream = new FileInputStream(file);

    //3.创建一个缓冲区

    byte[] b = new byte[1024];

    //4.读数据

    //缓冲区来读数据 : 数据存在哪里  

    //数据是存在缓存区字节数组中的

    //返回值就是文件的大小。

    int count = fileInputStream.read(b);

    System.out.println(count);

    //String里面帮我们做了解码功能

    System.out.println(new String(b, 0, count));

    //5.关闭资源

    fileInputStream.close();

    }

    //方法二:用循环来读取字节数 缺点读取的效率不高

    public static void getFile2() throws IOException{

    //1.找目标文件

    File file = new File("D:\a.txt");

    //2.建立通道

    FileInputStream fileInputStream = new FileInputStream(file);

    //3.读数据

    /*for(int i = 0;i<file.length();i++ ){//有多少个字节就去多少次

    char c = (char)fileInputStream.read();

    System.out.print(c);

    }*/

    int content = 0;

    //通过while循环调用read()的方法 ,如果返回的值以-1表示文件没有内容了。

    while((content = fileInputStream.read())!= -1){

    System.out.print((char)content);

    }

    //4.关闭资源

    fileInputStream.close();

    }

    //方法一:每次只读取一个字节

    public static void getFile() throws IOException{

    //1.找到目标文件

    File file = new File("D:\a.txt");

    //2.建立通道

    FileInputStream fileInputStream = new FileInputStream(file);

    //3.读取文件中的数据

    //read() 只获取一个字节

    int data = fileInputStream.read(); //a 第一个字节  

    int data2 = fileInputStream.read();

    System.out.println("获取的数据:"+data2);

    //4.关闭资源(释放资源)

    fileInputStream.close();

    }

    }

     

     字节输出流

           OutPutStream : 他也是所有字节输出流的超类 ,也是一个抽象的类 ,使用子类

                -----FileOutputStream   文件输出流

                

          

          FileOutputStream 的使用步骤:

                1.找到目标文件

                2.建立通道

                3.写入数据

                4.关闭资源

     FileOutputStream的使用注意事项:

              1.使用FileOutputStream写数据的时候,如果目标文件不存在,那么就会自己创建一个目标文件对象。

              2.使用FileOutputStream写数据的时候,如果目标文件存在,先将里面的数据清空,在写入数据。

              3.使用FileOutputStream写数据的时候,如果目标文件存在,想将数据在原有的基础上追加,这个

                                 时候就应该使用FileOutputStream(File file, boolean append) 构造方法,  append如果为true表示

                                 可以追加数据,反之不信。

              4..使用FileOutputStream写数据的时候,用write(int a)方法写数据,虽然接收的是int ,但实际上只有一个字节的数据,

                                操作的是低八位的二进制 ,其他的24位全部丢掉。

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.util.Arrays;

    public class Demo2 {

     

    /**

     * @param args

     * @throws IOException

     */

    public static void main(String[] args) throws IOException {

    // TODO Auto-generated method stub

          writeData();

     

    //writeData2();

          

          FileInputStream inp = new FileInputStream(new File("D:\a.txt"));

          byte[] b = new byte[1024];

          inp.read(b);

          System.out.println(Arrays.toString(b));

          

    }

     

    //方式二:

    public static void writeData2() throws IOException{

    //1.找目标文件

    File file = new File("D:\a.txt");

        //2.创建一个通道

    FileOutputStream outputStream = new FileOutputStream(file,true);  // 在这一步创建的文件。

    //3.创键一个字节数组

    String str = "hello word";

    //将字符串变为字节数组

    byte[] b = str.getBytes();

    //4.写入数据

    outputStream.write(b);

    //5.关闭资源

    outputStream.close();

    }

    //方式一

    public static void writeData() throws IOException{

    //1.找目标文件

    File file = new File("D:\a.txt");

        //2.创建一个通道

    FileOutputStream outputStream = new FileOutputStream(file);

    //3.开始写入数据

    /*int a = 10; // 4个字节  

    outputStream.write(a); //每次输出一个字节

    outputStream.write('b');

    outputStream.write('c');*/

    // 0000-0000 0000-0000 0000-0001 1111-1111  ==  511

    int a = 127;

    outputStream.write(a); // 255

    //4.关闭资源

    outputStream.close();

    }

    }

  • 相关阅读:
    【C#】:浅谈反射机制 【转】
    ArcGIS Server 10中的切图/缓存机制深入【转】
    ArcGIS Server的切图原理深入【转】
    【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高)
    MFC 带Ribbonbar的窗口 实现全屏和取消全屏
    C#.net开发 List与DataTable相互转换 【转】
    Net编程 详解DataTable用法【转】
    三维空间两直线/线段最短距离、线段计算算法 【转】
    OSG立体模式下动态修改相机远近裁剪面的实现
    用curl去探测接口是否正常返回结果,若没有正常返回则触发报警
  • 原文地址:https://www.cnblogs.com/binzhihua-666/p/6135375.html
Copyright © 2011-2022 走看看