I/O

流是传递数据的通道。有8位流和16位流

8位流:任何文件都可以传输

16位流:只处理文字

1.1 流的操作类(java.io)

      1)File类,它指的不是文件,而是用来描述文件的路径和文件的周边信息(比如文件的大小,时间,权限)。既可以描述文件也可以描述夹子

      2)File file=new File("");

          (1)File(String pathname)-File //输入一个文件路径返回一个File对象

     (2)File(URI uri)-File  //输入网络地址返回一个File对象

        (3)File(File parent,String child)-File//给一个父路径和子路径进行路径组合,返回一个File对象

          (4)File(String parent,String child)-File//同上

          注意:\ 本地文件访问斜杠    \\ \n \t

                     / 网络访问斜杠

                     路径分为相对路径和绝对路径,使用相对路径移动比较方便。 

          File类的相关方法。

File file=new File("aaa.txt");
        System.out.println(file.getName());//获得文件名字
        file.isFile();//是不是文件路径
        file.isDirectory();//是不是夹子路径
        file.delete();//删除路径下的文件,如果是有内容的夹子就不会删除
        file.deleteOnExit();//程序关闭之前就会删除,如果是非法关闭就不执行
        file.lastModified();//最后修改时间
        file.isHidden();//是不是隐藏文件路径
        file.isAbsolute();//是不是绝对路径
        file.getAbsolutePath();//获得决对路径
        file.getAbsoluteFile();
        file.canExecute();//对象能不能执行
        file.canWrite();//能不能写
        file.canRead();//能不能读

           File类文件和夹子的创建。

 

 /**
         * 文件创建
         */
        File file=new File("aaaaaaa.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {//路径不存在或者没有权限在夹子里创建文件
            e.printStackTrace();
        }
        /**
         * 创建临时文件
         */
        try {
            File file1=File.createTempFile("kaige","xuetang");
        } catch (IOException e) {//名字过短
            e.printStackTrace();
        }
        /**
         * 创建夹子
         */
        File file1=new File("aa");
        //boolean b=file.mkdir();//创建一个夹子
        boolean b=file1.mkdirs();//批量创建夹子
        /**
         * 路径更改,相当于剪切把文件存到另一个路径中
         */
        File f=new File("一个文件de路径");

        f.renameTo(new File("新的路径"));
/**
* 得到系统的根目录
*/
File[] files=File.listRoots();
for (File file : files) {
System.out.println(file.getPath());
}


 

           注意:夹子是没有大小的,夹子算大小,就必须把它里面的文件全部计算一遍。

         list();方法介绍。(列出当前目录下的所有文件和夹子)

    返回字符串

    list():String[]-File //

    list(FileNameFilter filter):String [] -File //过滤器

    返回File对象

    listFiles();File[]-File

    listFiles(FileFiter filter):File[]-File

    listFiles(FilenameFilter filter):File[]-File

    演示代码如下

File file=new File("F://");
        /**
         *
         */
        String[] filenames=file.list();
        for (String filename : filenames) {
            File file1=new File(file,filename);//路径+名字判断文件是不是夹子
            System.out.println(file1.isDirectory());
        }
        File[] files=file.listFiles();//由于直接返回File对象,可以直接判断该文件是不是夹子
        for (File file1 : files) {
            System.out.println(file1.isFile());
        }
        /**
         * 每个文件都会询问,需要返回true,不要返回false;
         */
        String[] files=file.list(new FilenameFilter() {//过滤器
            @Override
            public boolean accept(File dir, String name) {
                File f=new File(dir,name);
                return f.isDirectory();
            }
        });
        for (String s : files) {
            System.out.println(s);
        }

        File[] files1=file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return false;
            }
        });
        File[] files2=file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return false;
            }
        });

 1.2 8位流

  8位流也叫字节流,它可以运输任何数据。在java.io包下有输入输入流InputStream和输出流OutputStream操作类。(祖先类是抽象类不能new)。

  以下是相关的方法

 

File file=new File("F://");
        FileInputStream inputStream=new FileInputStream(file);//可以直接写地址
        inputStream.read();//每调一次读一个字节 返回-1就是没有数据了。byte+128=int
        inputStream.read(byte[]);//交给你一个字节数组,字节数组有多长就读多长,如果没有数组那么长,那就全部读取出来,int返回的是读取长度,批量读取
        inputStream.read(byte[],int,int);//批量按范围存放,int返回的是数组长度。
        inputStream.available();//返回剩余字节数,如果返回0,则表示没有数据了
        inputStream.skip();//跳过读取数据 返回值告诉你跳过的数据量(字节)
        inputStream.close();//关闭流
        /**
         * 字节转字符串
         */
        int length=inputStream.read(byte[] bytes);
        byte[] files=new byte[1024];
        //String s=new String(files);
        String s=new String(files,0,length);
        FileOutputStream outputStream=new FileOutputStream("",);//写路径与file对象都行,后面可以写true就是追加,反之就是不追加
        outputStream.close();//关闭输出流
        outputStream.flush();//清理缓存 让残留数据一次性写出去
        outputStream.write(int b);//输出一个字节出去
        outputStream.write(byte[] bytes1);//批量范围写出字节
        outputStream.write(byte[] bytes2,int,int);//批量写出字节

 

      File-->FileInputStream-->BufferedInputStream(装饰加快文件传输速度)-->ObjectInputStream(将字节转换为对象)-->对象-->ObjectInputStream(将对象转换成字节)-->BufferedInputStream-->FileInputStream-->File

   注意:顺序不固定,更具具体情况调整顺序,在使用对象流的时候,要实现序列化(实现一个接口,赋予他一个存在磁盘之中的一个身份);而且要注意版本号,改变属性个数,内容会引起版本号的更改,修改代码记得修改版本号才会正常运行,对象流里对属性添加transient关键字可以让此属性不存储到磁盘上(不持久化)

        对象流规则:1.对象写入不能追加写,没有任何用处,如果想输出多个对象可一次性输出。

                              2.不能输出同一个对象两次

 

import java.io.Serializable;

public class TaiJian implements Serializable {

    private static final  long serialVersionUID=1;

    private transient String name;
    private String address;
    private String nicheng;
    private String sex;
    private int age;

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }




    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getNicheng() {
        return nicheng;
    }

    public void setNicheng(String nicheng) {
        this.nicheng = nicheng;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


}

import java.io.*;

public class Test6 {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        TaiJian taijian=new TaiJian();
        taijian.setName("星河");
        taijian.setAddress("西安");
        taijian.setNicheng("小星子");
        taijian.setAge(20);

        FileOutputStream outputStream=new FileOutputStream("obj.ser");//这里不能追加,如果想输出多个对象可以一次性输出多个
        ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
        objectOutputStream.writeObject(taijian);//这里不能同时输出同一个对象两次 没有任何效果
        objectOutputStream.close();


        FileInputStream inputStream = new FileInputStream("obj.ser");
        ObjectInputStream inputStream1=new ObjectInputStream(inputStream);
        TaiJian taiJian1=(TaiJian) inputStream1.readObject();
        System.out.println(taiJian1.getName());
        System.out.println(taiJian1.getAddress());
        System.out.println(taiJian1.getNicheng());
        System.out.println(taiJian1.getAge());
        System.out.println(taiJian1.getSex());
        inputStream.close();

    }
}

 

 

 

1.3 16位流

      16位流与8位流方法基本相同,在这里说一下装饰类BufferedReader。他输出是一行一行的数据输出。

        

 

 

 

     

         

 

 


 

 

           

 

posted @ 2019-09-19 00:04  满眼星河  阅读(384)  评论(0)    收藏  举报