首页 > 代码库 > IO流基础加强

IO流基础加强

字节流对象:InputStream,OutputStream

缓冲字节流对象:BufferedInputStream , BufferedOutputStream

用法和字符流对象一样,但也有区别,

输出流用法:   

  1.创建字节输出流对象,用于操作文件

         FileOutputStream fps = new FileOutputStream("1.txt");

    fin.available();//读取出要读的文件的大小

      2.写数据,直接写入到目的地中

         fps.write("ashdgas".getBytes());

      3.关闭资源

          fps.close();

输入流用法:

       //创建字节流输入对象,用于操作文件

       FileInputStream fin = new FileInputStream("ArrayListTest.java");

       int ch = 0;

       byte[] ch1 = new byte[1024];

       while((ch = fin.read(ch1)) != -1){

           System.out.print(new String(ch1,0,ch));

       }

       fin.close();

缓冲对象的用法:

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

       //创建字符流输入输出对象,关联文件

       FileInputStream fin = new FileInputStream("1.mp3");

       FileOutputStream fop = new FileOutputStream("2.mp3");

       //创建缓冲对象

       BufferedInputStream bui = new BufferedInputStream(fin);

       BufferedOutputStream bos = new BufferedOutputStream(fop);

       byte [] bt = new byte[1024];

       int len = 0;

       while((len = bui.read(bt)) != -1){

           bos.write(bt, 0, len);

           bos.flush();

       }

       bui.close();  //关闭资源

       bos.close();

    }

接收键盘录入的数据的几种方法:

  //第一种

     private static void SystemOutDemo() throws IOException {

        //获取系统的输入流对象

          InputStream in = System.in;

          //获取系统的输出流对象

          OutputStream os = System.out;

          int ch = 0;

          while((ch = in.read()) != -1){

            os.write((char)ch);

          }

    }

  //第二种

    private static void SysteminDemo() throws IOException {

       //获取系统的输入流对象

       InputStream in = System.in;

       int ch = 0;

       while((ch = in.read()) != -1){  //输出输入流读取到从键盘上接受的数据

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

       }

    }

  //第三种

    private static void ScannerDemo() {

        //Scanner里面封装的就是InputStream对象

        Scanner sc = new Scanner(System.in);

        String str = sc.nextLine();

        System.out.println(str);

    }

字节流和字符流的相互转换:使用字符流Reader类的子类InputStreamReader可以将字节流转换为字符流,使用Writer类的子类OutputStreamWriter可以将字符流转换成为字节流。

转换流最大的好处就是可以融入编码操作

当:

  1. 源或者目的的对应设备是字节流,但操作的是文本数据,可以使用转换作为桥梁,提高对文本操作的便捷
  2. 一旦操作文本涉及到具体的指定的编码表时必须使用转换流

 

例如:

       //BufferedReader字符流缓冲区,InputStreamReader将字节流转换为字符流//System.in获取系统的字节输入流对象

          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

          //BufferedWriter字符流缓冲区,OutputStreamWriter将字符流转换为字节流//System.in获取系统的字节输出流对象

          BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

          String lin=null;

          while((lin = br.readLine()) != null){

            if(lin.equals("over"))

               break;

            bw.write(lin.toUpperCase());

            //换行

            bw.newLine();

            //刷新

            bw.flush();

        }

         //使用系统的输入输出流对像,不用执行关流动作

    }

流的操作规律:什么时候需要用到哪些对象,需要明确一下几点

  1. 明确源和目的

          源:InputStream  Reader

       目的: OutputStream  Writer

  2.明确数据是否是纯文本数据

      源:如果是纯文本数据:Reader,不是纯文本数据用InputSteram

     目的:如果是纯文本数据:Writer,不是纯文本数据用OutputStream

  3.明确具体的设备。

      源设备:

           硬盘:File

           键盘:System.in

       内存:数组

       网络:Socket流

    目的设备:硬盘: file

              控制台: System.out

                 内存:数组

               网络:Socket流

  1. 是否需要其他额外功能。
    1. 是否需要缓冲区,是的话就用Buffer
    2. 是否需要使用到转换流

File文件类:

File类可以将文件和文件夹封装成对象

    //可以将一个已存在或者不存在的文件封装成一个File对象

       File fl = new File("1.txt");

   //File.separatorChar用来获取系统平台的路径分隔符

       File fl1 = new File("f:"+File.separatorChar+"1.txt");

File类对象的常用方法:

  File fl = new File("1.txt");

    1.获取

        //获取文件名称

           String name = fl.getName();

           //获取文件绝对路径

           String path = fl.getAbsolutePath();

           //获取文件相对路径(就是构造器中写的文件的路径)

           String path1=fl.getPath();

           //获取文件的大小

           long len = fl.length();

           //获取文件的最后修改时间

      long time = fl.lastModified();

      . . . . . . ..

    2.创建和删除:

           File fl = new File("f:/a.txt");

           //创建一个文件,当这个文件存在的时候创建失败,返回false

           boolean flag = fl.createNewFile();

           //删除这个文件

           boolean flag1 = fl.delete();

           //当虚拟机退出时删掉这个文件

       fl.deleteOnExit();

  创建删除文件夹:

      File fl = new File("abc");

         //创建一个文件夹,fl.mkdirs();是创建多级目录

         boolean b = fl.mkdir();

         System.out.println(b);

         //删除一个文件夹,如果里面有内容,就会删除失败

    boolean a = fl.delete();

          File fl = new File("f:/1.txt");

          //判断文件是否存在

          boolean b = fl.exists();

            //判断是否是文件,应该先判断这个文件是否存在

          boolean c = fl.isFile();

          //判断是否是目录

          boolean d = fl.isDirectory();

  4.重命名:

    //如果两个文件的目录一样就是将重命名,否则就是将f1剪切到f2并重命名

           fl.renameTo(f2);

-------------------------- ----------------------------------------

        //获取系统驱动器的根目录,返回File数组

        File [] fl = File.listRoots();

        Map map = new HashMap<File,String>();

        /*for (File file : fl) {

           System.out.println(file);

           map.put(file,file.get)

       }*/

       //得到驱动器的总的空间

       System.out.println(fl[1].getTotalSpace());

       //得到可用空间

       System.out.println(fl[1].getFreeSpace());

       System.out.println(fl[1].getUsableSpace());

访问目录下的文件和文件夹:

      File fl = new File("c:\\");

       //获取当前目录下的问价和文件夹的名称,

       //调用list方法的File对象中封装的必须是目录,

       //否则会发生空指针异常

       //如果访问的是系统级保护目录也会发生空指针异常

       //如果目录存在,但是没有内容,会返回一个数组,但是长度为零。

       String [] name = fl.list();

       for (String string : name) {

           System.out.println(string);

       }

查看目录下是否有指定后缀名的文件:使用文件过滤器

     过滤器:public class FilenameFilterDemo1 implements FilenameFilter {

         private String filename;

         //构造函数,接收一个文件

        public FilenameFilterDemo1(String filename) {

             super();

             this.filename = filename;

        }

        public boolean accept(File dir, String name) {

                 //比较文件是否是以指定后缀名结尾

           return name.endsWith(filename);

      }

  }. . . .

      File fl = new File("f:\\test\\day13\\");

          //传入一个文件过滤器

        String [] name = fl.list(new FilenameFilterDemo1(".class"));

         for (String string : name) {

           System.out.println(string);//输出的是指定后缀名的文件名称

       }

IO流基础加强