你的位置:首页 > Java教程

[Java教程]黑马程序员【java中的IO流】


                                               Java中的IO流

     在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流。

     首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操作文件或目录呢?这就用到了File类,一个强大的对象,它既可表示文件,又可以表示目录。在程序中,利用File可以对文件进行基本的操作,比如说查看文件名称,文件大小等等。

     创建一个File对象的句法如下:

      File file = new File(String path);

     在该类创建的时候,通过构造函数传递path,path表示所指向的文件路径名。例如,"File file = new File("C:\\Hello.txt");"就创建了一个指向C盘根目录下名为Hello的txt文件的对象。注意,在windows操作系统中,路径名中的分隔符可以用"/",或者用"\",但是必须要写成"\\"其中第一个代表转义字符。File对象是java.io包中引用磁盘文件的唯一对象,File类仅仅是描述File对象的属性,而并未说明数据是如何存储的。File类提供了一些重要的方法来管理文件或目录的属性,下面来个大家一一列举:

     我只是列举出一些File类的常用方法,他还有很多其他的方法,在需要用到的时候大家可以自行查看API,好了,废话不多少直接上代码,看看File类是如何获取文件属性的:

public static void main(String[] args) {     File file = new File("D:\\Hello.txt");     if(file.exists()){       System.out.println("文件的名称:"+file.getName());       System.out.println("文件的相对路径:"+file.getPath());       System.out.println("文件的绝对路径:"+file.getAbsolutePath());       System.out.println("文件的大小:"+file.length());            if(!file.delete()){        System.out.println("删除失败");        return;        }       System.out.println("删除成功");     }else{       System.out.println("文件不存在");     }  }

     这样我们就进行了一系列简单的File类的操作,在这里要提一下,可能有很多初学IO流的人还不是很明白相对路径与绝对路径的区别,可是我们要通过文件流老操作文件就要清楚的知道文件的位置,也就是要清楚的给出路径来让程序找到他,那么什么是相对路径与绝对路径呢?现在我们先来看一下绝对路径,绝对路径就是你当前计算机下文件所在的位置,也就是我们通常在浏览文件的时候上方地址栏上给出的路径就是绝对路径,也就是不伦你做什么程序,是找文件也好是导图片也要,只要你写的是绝对路径,并且是在你的本机上操作那就是绝对没有问题的,可是这样我们也看出了他的缺点,我们写出来的程序都是要给别人用的,要在很多电脑上显示,这样你再用绝对路径的话就会出现找不到该文件或者我们常说的图裂了,那么这时候就要用到相对路径了,相对路径就是相对于你自身这个程序或者执行程序的文件的路径,简单说也就是你的代码写在哪个文件里就相对于哪个文件,这样不管我们的放在什么地方,只要他的相对位置没有变就不会出错。另外,我们用"../"来表示上一层目录,"../../"来表示山商城目录,以此类推。

     我们简单的说了一下文件的查看,下面我们来看看文件或目录的创建等一系列操作:

  public static void main(String[] args) {    //通过刚刚的演示,我们已经删除了该文件    File file = new File("D:\\Hello.txt");    try {      if(file.createNewFile()){        System.out.println("文件创建成功");      }    } catch (IOException e) {      e.printStackTrace();    }    File directory = new File("D:\\通过file创建");    if(directory.mkdirs()){      System.out.println("目录创建成功");    }  }

     通过两段简单的代码我们学习了java中对文件的基本操作,下面我们来进行今天的重点,IO流那么流是什么呢?我们来看一下官方对于流的定义:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。而在java中,我们处理数据的类型不同又分为字符流和字节流,数据的流向不同我们又分为了输出流和输入流。

      了解了一下流的定义,我们直接来看代码,下面这段代码是一段输入流,也就是通过FileInputStream来读取文件中的数据:

public static void main(String[] args) {         //在使用inputStream的时候很多地方都要抛出异常,所以我们在外部定义         //一个为空的流,方便使用    InputStream input = null;    try {      input = new FileInputStream("D:\\Hello.txt");      int data = 0;      byte[] b = new byte[input.available()];      for (int i = 0; (data = input.read()) != -1; i++) {        b[i] = (byte) data;      }      String name = new String(b);      System.out.println(name);    } catch (FileNotFoundException e) {      // TODO Auto-generated catch block      e.printStackTrace();    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    } finally {      try {        input.close();      } catch (IOException e) {        // TODO Auto-generated catch block        e.printStackTrace();      }    }

     因为inputStream的read方法返回值是int类型,所以我们循环每次读到的数据都是int类型,因为编码方式原因,如果我们文件里的数据汉字汉字的话,我们通过(char)int强制转换就会出现乱码,所以要先将数据保存在byte数组里,再通过new String(byte[])来进行转换。

     通过代码我们可以看出inputStream读取文件的核心方法就是read()方法,那么同样的OutputStream的写入文件方法就是write():

  public static void main(String[] args) {    // 代码中没有太大的改动,在存入文件时同样是存入byte数组    OutputStream output = null;    try {      output = new FileOutputStream("D:\\Hello.txt");      String str = "好好学习天天向上";      byte[] b = str.getBytes();      output.write(b);      System.out.println("数据写入成功");    } catch (FileNotFoundException e) {      // TODO Auto-generated catch block      e.printStackTrace();    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    } finally {      try {        output.close();      } catch (IOException e) {        // TODO Auto-generated catch block        e.printStackTrace();      }    }

     这样就完成了文件读写,还有一种便是带缓冲区的方法,通过BufferedReader和BufferedWriter来读写文件,这种方法可以先把一批数据放到缓冲区,接下来的操作都是通过缓冲区获得,可以提高操作效率,与上面方法没有太大的改动,就不一一列举。还要提一下的就是二进制文件的读写,我们知道在计算机中所有的东西都是二进制的存在形式,也就是说这种二进制的读写基本可以读写全部文件,图片或电影,下面我们就来写一个复制图片的例子来给大家一个直观的感受:

  public static void main(String[] args) {    DataOutputStream dos = null;    DataInputStream dis = null;    try {      //创建输入流      InputStream input = new FileInputStream("D:\\cat.jpg");      dis = new DataInputStream(input);      //创建输出流      OutputStream output = new FileOutputStream("D:\\mao.jpg");      dos = new DataOutputStream(output);      int num = 0;      while ((num=dis.read())!=-1) {        dos.write(num);      }      System.out.println("复制成功");    } catch (FileNotFoundException e) {      // TODO Auto-generated catch block      e.printStackTrace();    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }finally{      try {        dos.close();        dis.close();      } catch (IOException e) {        // TODO Auto-generated catch block        e.printStackTrace();      }          }

      这样就完成了图片的复制,java的IO流还有许多nice的方法,望大家多提建议!