zoukankan      html  css  js  c++  java
  • Java IO流(一)

    一.IO流概述

    1 什么是IO流 (流就是通道对象)
    IO - Input(输入) Output(输出)
    在Java的IO中,流是一个很形象的概念,就像水流一样。
    当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。
    当程序需要写出数据的时候,就会开启一个通向目的地的流
    水流里面流的是水,输入输出流流的是二进制数据!

     

     

    二.File

    (1)何为File

    File是java提供的一个用来代表磁盘上的一个实际文件(其实也可以上网络上的一个文件),它是一个存在在内存中的一个对象而已

    File 不完全等同 磁盘上的文件
    File 只是代表 磁盘上的文件

    我们可以用File对象来操作它代表的磁盘文件,如删除,创建,改名。。。。

     

     

    (2)File的API介绍

    1.常量和构造方法
    System.out.println(File.separator);//文件路径的分隔符
    System.out.println(File.pathSeparator);//Path环境变量的分隔windows ; linux :
    
    File file1 = new File("D:\corejava\TestFile.java"); 
    File file2 = new File("D:\corejava", "TestFile.java"); 
    File file3 = new File(new File("D:\corejava"),"TestFile.java"); 

     

    2.创建,重命名,移动,删除

    createNewFile()-创建一个新的文件
    mkdir-创建一个文件夹,但是不能创建层级
    mkdirs - 创建层级文件夹
    renameTo() - 文件重命名或移动
    delete - 删除文件和文件夹

    3.判断是文件还是目录

    isFile() - 判断是否是文件 a.txt ,b.doc
    isDirectory() - 判断是否是目录 (音乐) ,文件夹

    4.获取文件名和路径

    getName() - 获得文件名
    getAbsolutePath() - 获得文件的绝对路径

    5.读取权限和时间属性
    6.绝对路径和相对路径

    绝对路径

    就是以确切的目录开始
    windows确切的目录从盘符开始,例如C: D:
    linux的确切的目录就是根目录,就是 /

    相对路径
    . 当前目录,可以省略,例如a.txt 和 ./a.txt 是一样的
    .. 上一级目录

    java下的当前目录在哪里??
    得看你在哪个目录下运行java命令

     

    (3)文件过滤

    list() - ()
    listFiles()
    
    list(FilenameFilter) 
    
    
    listFiles(FilenameFilter)
    listFiles(FileFiter)



    public class TestFiles8 {
      public static void main(String[] args) {
       File f = new File("c:\d");
        if (f.isDirectory()) {// 只有是文lenameFilter filter = new TxtFileNameFilter();
        String[] names = f.list(filter);
         for(String name : names){
          System.out.println(name);
        }
        File[] files = f.listFiles(filter);
         for(File file : files){
          System.out.println(file.isFile()+"------->"+file.getAbsolutePath());
        }
         //保留所有le[] dirs = f.listFiles(new DirFileFilter());
         for(File d : dirs){
          System.out.println(d.isDirectory()+" =====> "+d.getAbsolutePath());
        }
       }
     }
    }
    
    class TxtFileNameFilter implements FilenameFilter {
      @Override
      public boolean accept(File dir, String name) {
        
        return name.endsWith(".txt");
     }
    }
    class DirFileFilter implements FileFilter {
      @Override
      public boolean accept(File file) {
        
        return file.isDirectory();
     }
    
    }

     

     

    (4)递归算法

    应用:解决数学中的一些问题,阶乘,求斐波那切数列。
    java 应用:遍历树都用到递归

    注意:递归一定要有一个最终结束的条件。
    核心:自己调用自己
    没有结束条件的递归错误:
    Exception in thread "main" java.lang.StackOverflowError
    求阶乘 5!= 5*4*3*2*1
    5!=5*4!=5*4*3!=5*4*3*2!=5*4*3*2*1!=5*4*3*2*1

    4!=4*3!=
    n!=n*(n-1)!

    fn(n)
    if(n==1){
    return 1;
    }
    return n*fn(n-1)

    求斐波那切数列
    1 1 2 3 5 8 13 .....
    fn(1) = 1
    fn(2) = 1
    fn(3) = 2 = fn(3-1)+fn(3-2)
    fn(4) = 3 = fn(4-1)+fn(4-2)
    fn(5) = 5 = fn(5-1)+fn(5-2)
    fn(6) = 8 = fn(6-1)+fn(6-2)

    fn(n) => n=1 return 1
    => n=2 return 1
    = n>2 return fn(n-1)+f(n-2);

     

    public class TestDiGui {
    static int i = 0;
    public static void go() {
    System.out.println("sfdfs");
    
    i++;
    System.out.println(i);
    if(i>=100){
    return; 
    }
    go();
    }
    public static int fn(int n) { //fn(n) ===>n!
    if (n==1) {
    return 1;
    }
    return n*fn(n-1);//n*n!
    }
    
    public static void listFileName(File file) {
    if (file.isFile()) {
    //文件
    System.out.println(file.getName());
    }else {
    //文件夹
    System.out.println(file.getName());
    File[] files = file.listFiles();
    for (File f : files) {
    listFileName(f);
    }
    }
    }
    
    public static void listFileName2(String s ,File file) {
    s+="-->";
    if (file.isFile()) {
    //文件
    System.out.println(s+file.getName());
    }else {
    //文件夹
    System.out.println(s+file.getName());
    File[] files = file.listFiles();
    for (File f : files) {
    listFileName2(s,f);
    }
    }
    }
    
    public static int boFei(int n) {
    
    if(n==1||n==2){
    return 1;
    }
    return boFei(n-1)+boFei(n-2);
    }
    
    public static void main(String[] args) {
    // int r = boFei(5);
    // System.out.println(r);
    //go();
    // int r = fn(3);
    // System.out.println(r);
    // File file = new File("c:\test");
    // listFileName(file);
    File file = new File("c:\test");
    listFileName2("" , file) ;
    }
    }

     

     

     

    三.IO流分类

    1 三种分类法
    按流的方向:输入流和输出流
    按数据的大小:字节(byte)流和字符(char)流
    按功能分:节点流 和 过滤流(包装流,装饰流,处理流)

    2 输入输出流

     

    3 字节流和字符流

     


    4 节点流和过滤流
    节点流就是直接接数据源的流(硬盘,网络)

     

     

     

    四.IO流类(API)体系

    输入:Input Read
    输出:Output Write

    字节流:以Stream结尾
    字符流:以Reader和Writer结尾

    节点流:构造方法的参数是一个文件或者其它的数据源
    过滤流:构造方法的参数是另外一个流

     

     

     

     


    五.字节流

    (1)OutputStream和FileOutputStream

    字节流+ 输出


    FileOutputStream(FileDescriptor fdObj)
    构造方法的讲解网址:
    http://www.fengfly.com/plus/view-214059-1.html

    (2)InputStream和FileInputStream

    字节流+ 输入流

    六.字符流

     (1)Writer和FileWriter

    字符流+输出流
    构造方法使用例子的网址:
    FileWriter(FileDescriptor fd)
    http://www.jb51.net/article/87476.htm

    (2)Reader和FileReader

    字符流+ 输入流

  • 相关阅读:
    Java 中最常见的 5 个错误
    在 Java EE 组件中使用 Camel Routes
    virtualenv 环境下 Nginx + Flask + Gunicorn+ Supervisor 搭建 Python Web
    [译]如何使用 Docker 组件开发 Django 项目?
    7 天玩转 ASP.NET MVC
    如何开发一个自己的 RubyGem?
    [译] 提高日志质量的 5 大技巧
    Ruby Profiler 详解之 stackprof
    总结 | 如何测试你自己的 RubyGem
    第十一节:讲述类的继承,数据库,文件的读写,图形绘制
  • 原文地址:https://www.cnblogs.com/Transkai/p/10357387.html
Copyright © 2011-2022 走看看