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{

}

  • 29
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,我可以为你介绍一下如何使用 Java 编写程序实现文件拷贝。 Java 提供了非常方便的 I/O 类来处理文件读写操作。文件拷贝的基本思路是读取源文件中的数据,然后将数据写入到目标文件中。下面是一个简单的文件拷贝程序示例: ```java import java.io.*; public class FileCopy { public static void main(String[] args) throws IOException { // 源文件路径 String srcFilePath = "C:/temp/source.txt"; // 目标文件路径 String destFilePath = "C:/temp/dest.txt"; // 创建输入和输出 FileInputStream fis = new FileInputStream(srcFilePath); FileOutputStream fos = new FileOutputStream(destFilePath); // 定义缓冲区,每次读取 1024 个字节 byte[] buffer = new byte[1024]; int len; // 循环读取源文件中的数据,并将数据写入到目标文件中 while ((len = fis.read(buffer)) != -1) { fos.write(buffer, 0, len); } // 关闭输入和输出 fis.close(); fos.close(); System.out.println("文件拷贝完成!"); } } ``` 在上面的示例中,我们首先定义了源文件路径和目标文件路径。然后创建了输入和输出,用于读取源文件和向目标文件写入数据。我们定义了一个缓冲区,每次从输入中读取 1024 个字节,并将这些字节写入到输出中。最后,我们关闭输入和输出,并输出一条完成信息。 需要注意的是,上面的代码中使用了 try-catch 语句来捕获可能出现的 IOException 异常。这是因为在文件读写过程中可能会出现异常,比如文件不存在、文件无法读取等等。为了保证程序的健壮性,我们需要使用 try-catch 语句来处理这些异常。 希望这个简单的示例可以帮助你了解如何使用 Java 编写文件拷贝程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小菜日记^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值