java——io文件流(详细、全面、快速掌握)

本篇主要对java中的io流进行总结,以复制文件操作为例对文件输入流(FileInputStream)、输出流(FileOutputStream)以及缓冲区的使用:BufferedInputStream、BufferedOutputStream以及字符输入流(BufferedReader)输出流(PrintWriter)进行讲解,最后讲解了序列化:将对象输出为文件和反序列化:将文件读取为对象进行了演示和讲解;以下代码可以直接复制到idea中运行,便于理解掌握;

第一篇:File的基本用法以及操作

package java_io;

import java.io.File;
import java.io.IOException;

//TODO io-文件流:
public class java_42 {
    public static void main(String[] args) throws IOException {
        //创建文件对象,使用文件路径关联系统文件;
        //TODO File:文件类型(可以是文件也可以是文件夹),属于java.io
        String filepath="D:\\java_study\\data";
        File file=new File(filepath);
        System.out.println(file);
//        //判断当前的file是否是文件:判断是文件还是文件夹,是文件返回true
//        System.out.println(file.isFile());
//        //判断当前file是文件夹还是文件:是文件夹返回true:
//        System.out.println(file.isDirectory());
        //判断文件是否关联上,也就是是否存在:
        if(file.exists()){
            //文件存在,已经关联上;
            if(file.isFile()){
                System.out.println("文件对象关联的是一个文件");
                System.out.println(file.getName());
                System.out.println(file.length());
            }else{
                System.out.println("文件对象关联的是一个文件目录(夹)");
                System.out.println(file.getName());
                //获取文件夹下的一级文件名称:
                String[]list=file.list();
                System.out.println("文件夹中所有的文件:");
                for(String one:list){
                    System.out.println(one);
                }

                //获取这个文件夹下的一级文件对象:
                File[]files=file.listFiles();
                for(File one:files){
                    System.out.println(one);
                }
                //然后查看子文件夹下的文件:
                for(String one:files[0].list()){
                    System.out.println(one);
                }


            }
        }else{
            //文件不存在;
            System.out.println("文件对象不存在,没有关联成功!");
            //如果文件不存在,想创建多级文件夹的话:
            //file.mkdirs();
            //如果文件不存在,想创建一个文件的话:
            //file.createNewFile();

        }

    }
}

第二篇:文件输入输出流

package java_io;

import java.io.*;

//TODO 文件复制:
public class java_43 {
    public static void main(String[] args) {
        File firstfile=new File("D:\\java_study\\data\\word.txt");//源文件;
        File desfile=new File("D:\\java_study\\data\\new");//想复制的地点,也就是输出的地点;
        //TODO 文件输入流:
        FileInputStream in=null;
        //TODO 文件输出流:
        FileOutputStream out=null;
        try{
            //由于这里可能会出现异常,所以加上try-catch
            in=new FileInputStream(firstfile);
            out=new FileOutputStream(desfile);
            //TODO 注意:如果文件数据已经被全部读取完毕,那么再去读取数据读取的结果就是-1,即无效数据;
            /*下面这样只能读一个,无法完整的将文件中的数据全部读取出来;所以需要加while循环,结合不是-1就继续读数据:
            //打开阀门,流转数据:(输入)
            int data=in.read();
            //打开阀门,流转数据:(输出)
            out.write(data);*/
            int data=0;
            while((data=in.read())!=-1){
                out.write(data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //防止空指针,先判断一下:
            if(in!=null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(out!=null){
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }

    }
}

第三篇:缓冲流

package java_io;

import java.io.*;
import java.nio.Buffer;

//TODO 缓冲流 对于java_43中那种方法效率很慢,因为每次打开阀门只能读取一个数据,然后需要打开多次,
// 因此想设置一个缓冲区,每次将所有数据先都读过来存放到缓冲区,然后关闭读取阀门,将数据都输入到目的地;这样只需要打开一次阀门即可;
public class java_44 {
    public static void main(String[] args) {
        File kaishifile=new File("D:\\java_study\\data\\word.txt");
        File desfile=new File("D:\\java_study\\data\\new");
        FileInputStream in=null;
        FileOutputStream out=null;
        BufferedInputStream inbuff=null;
        BufferedOutputStream outbuff=null;
        //TODO 缓冲区
        byte[]cache=new byte[1024];
        int data=0;
        try {
            in=new FileInputStream(kaishifile);
            inbuff=new BufferedInputStream(in);
            out=new FileOutputStream(desfile);
            outbuff=new BufferedOutputStream(out);
            while((data=inbuff.read(cache))!=-1){
                outbuff.write(cache,0,data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(inbuff!=null){
                try {
                    inbuff.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(outbuff!=null){
                try {
                    outbuff.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

第四篇:字符流

package java_io;

import java.io.*;

//TODO 字符流:前面都是一个字节一个字节的读取,现在采用字符流,先读取字节后转换为字符在做处理,多个字符就可以组成字符串;此时如果想对读取的内容做处理的时候会非常方便;可以进行更改等操作;
public class java_45 {
    public static void main(String[] args) {
        File kaifile=new File("D:\\java_study\\data\\word.txt");
        File desfile=new File("D:\\java_study\\data\\new1");
        //字符输入流:
        BufferedReader reader=null;
        //字符输出流:
        PrintWriter writer=null;
        try {
            reader=new BufferedReader(new FileReader(kaifile));
            writer=new PrintWriter(desfile);
            //TODO 打开阀门,数据读取:
            //读取文件中的一行数据(字符串):
            String line=null;
            while((line=reader.readLine())!=null){
                System.out.println(line);//查看读取的是什么
                writer.println(line);
            }
            //刷写数据:就是将内部缓冲区的数据强制输出到目的地,说如果读取了没有满,那么也要到出去,然后再重新读,不然会保存着原来的数据;
            writer.flush();

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(reader!=null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(writer!=null){
                writer.close();
            }
        }


    }
}

第五篇:序列化和反序列化

package java_io;

import java.io.*;

//TODO 序列化:将对象输出成文件,反序列化:将文件读取为对象;
public class java_46 {
    public static void main(String[] args) {
        File dataFile=new File("D:\\java_study\\data\\obj.dat");

//        //对象输出流:
//        ObjectOutputStream objectout=null;
//        FileOutputStream out=null;
        //对象输入流:
        ObjectInputStream objectin=null;
        FileInputStream in=null;
        try {
            //输出操作:
//            out=new FileOutputStream(dataFile);
//            objectout=new ObjectOutputStream(out);
//            User user=new User();
//            objectout.writeObject(user);//此处需要添加字节类型,也就是说将对象转化为字节,JVM自动转,需要将下面User类实现一个接口
//            objectout.flush();
            //输入操作:
            in=new FileInputStream(dataFile);
            objectin=new ObjectInputStream(in);
            Object object = objectin.readObject();
            System.out.println(object);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
//            if(objectout!=null){
//                try {
//                    objectout.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
               if(objectin!=null){
                   try {
                       objectin.close();
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               }
        }
    }
}
class User implements Serializable{

}

你可能感兴趣的:(java,开发语言,学习,idea,nio)