【Java】 认识I/O(代码示例,超详解释)

前言

在计算机中,通常使用各种各样的文件来保存数据,如何在Java程序中操作这些文件呢?java.io包提供了一些接口和类,对文件进行基本的操作,包括对文件和目录属性的操作、对文件读写的操作等。首先学习使用File类操作文件和目录。

File

  1. File对象可以表示文件或目录,程序中一个File对象可以代表一个文件或目录。可以利用他对文件或目录进行基本操作。如查看名称、最后修改日期、文件大小等。

  2. File类构造方法:

方法说明
File(String pathname)用指定文件路径构造文件
File(String dir,String subpath)指定文件路径下创建指定文件名的文件
File(File parent,String subpath)指定文件对象中创建指定文件名文件
  1. File类常见方法

    方法说明
    boolean exists()文件是否存在,存在返回true
    String getAbsolutePath()返回此对象表示的文件的绝对路径名
    String getName()返回吃对象表示的文件的名称
    String getParent()返回此File对象的路径名的上一级,没有则返回null
    boolean delete()删除此对象指定的文件
    boolean isDirectory()是否是目录
    boolean mkdir()创建目录,路径由当前File对象指定
    boolean mkdirs()创建包括父目录的目录

代码示例:

public static void main(String[] args) throws IOException {
        //构造文件对象
        File file=new File("C:/Users/29616/desktop/1.txt");
        //判断是否存在
        if(file.exists()){
            //存在,判断是否是文件
            if(file.isFile()){
                System.out.println("文件存在");

                //定义str字符串
                String str="好好学习,天天向上\t";
                //字符流 写入   true表示向文件追加内容 false表示覆盖
                FileWriter fw=new FileWriter("C:/Users/29616/desktop/1.txt",true);
                //写入
                fw.write(str);
                //关比字符流,不关闭会导致长期占用资源,并且安全性低
                fw.close();

                //字符流 读取
                FileReader fr=new FileReader("C:/Users/29616/desktop/1.txt");
                //定义一个字符数组,用于存储读到字符
                char[] datas=new char[1024];
                //把读取的内容存到数组里,读到的是字符个数
                fr.read(datas);
                System.out.println(datas);
                fr.close();
                //文件大小
                long length=file.length();
                System.out.println(length);
                //文件路径
                String path=file.getPath();
                System.out.println(path);
                //文件绝对路径
                String abspath=file.getAbsolutePath();
                System.out.println(abspath);
                //最后修改时间
                long time=file.lastModified();
                //System.out.println(time);
                //格式化时间
                Date date=new Date(time);
                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                System.out.println(simpleDateFormat.format(date));

                //删除文件
                if(file.delete()){
                    System.out.println("删除成功");
                }
                //不是文件
            }else{
                System.out.println("文件夹");

            }
        }else{
            //文件不存在
            System.out.println("不存在,创建");
            //创建新文件
            file.createNewFile();
            System.out.println("创建成功" );
        }
    }

Java流

​ 前面讲解的java.io包中的File类对文件或目录的属性进行操作,但File类不能访问文件的内容,即不能从文件中读取数据或往文件里写数据。下面介绍文件的读写操作。

​ 读文件是指把文件中的数据读取到内容中,反之,写文件是指把内存中的数据写入到文件中。通过“流”可以实现读写文件的操作。

流的分类

数据流是 Java 进行 I/O 操作的对象,它按照不同的标准可以分为不同的类别。

  • 按照流的方向主要分为输入流和输出流两大类。
  • 数据流按照数据单位的不同分为字节流和字符流。
  • 按照功能可以划分为节点流和处理流。
1.输入流和输出流

​ 输入/输出流是相对于计算机内存来说的,输入流表示数据输入到内存,输出流表示从内存中输出。Java的输出流主要由OutputStream和Write作为基类,输入流由InputStream和Reader作为基类。

按流向区分
输出流
输出流
OutputStream和Write作为基类
InputStream和Reader作为基类
输入输出流
2.字节流和字符流

​ 输入/输出流又按照处理数据单元的不同分为字节流和字符流。

​ 字节流是8位通用字节流,其基本单位是字节,字节流的基类是InputStream类(常用子类FileInputStream)和OutPutStream类(常用子类FileOutputStream),他们是抽象类。

​ 字符流是16位Unicode字符流,基本单位是Unicode字符。字符流最适合用来处理字符串和文本,支持国际上大多数的字符集和语言。字符流的基类是Reader类(常用子类BufferedReader)和Writee(常用子类BufferedWriter)类,也是抽象类。

​ 注:所有方法再出现错误时,都会抛出IOExcpetion。

按处理数据单元划分
字节流
字符流
字节输入流InputStream作为基类
字节输入流OutputStream作为基类
字符输入流Reader作为基类
字符输出流Writer作为基类
字节流与字符流

读写文本文件

1.使用字节流读写文本文件
  1. 使用字节流FileInputStream读文本文件
package exam;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class FileInputStreamTest {

    /**
     * 字节流读文件
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        File file=new File("C:/Users/29616/desktop/1.txt");
        //创建流对象
        FileInputStream fis=new FileInputStream(file);
        int data;
        System.out.println("可读取的字节数:"+fis.available());
        System.out.println("文件内容为:");
        //循环读数据
        while ((data=fis.read())!=-1){
            System.out.println(data+"");
        }
        fis.close();
    }
}

  1. 使用字字节流FileOutputStream写文本文件
package exam;

import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 字节流写文件
 */
public class FileOutputStreamTest {
    public static void main(String[] args) throws IOException {
        try{
            String str="java";
            byte[] b=str.getBytes();//字节数组
            FileOutputStream fos=new FileOutputStream("C:/Users/29616/desktop/1.txt",true);
            fos.write(b,0,b.length);
            System.out.println("文件已更新");
            fos.flush();
            fos.close();
        }catch (IOException obj){
            System.out.println("创建文件时出错");
        }
    }
}

2.使用字符流读写文本文件
  1. 使用字符流BufferedReander和FileReader读文本文件
package exam;

import java.io.*;

/**
 * 字符流读文件
 */
public class BufferedReaderTest {
    public static void main(String[] args) throws IOException {
        File file=new File("C:/Users/29616/desktop/1.txt");
        FileReader fr=new FileReader(file);
        BufferedReader br=new BufferedReader(fr);
        String line=br.readLine();
        while(line!=null){
            System.out.println(line);
            line=br.readLine();
        }
        br.close();
        fr.close();
    }
}

  1. 使用字符流BufferedWriter和FileWriter写文本文件
package exam;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 字符流写文件
 */
public class BufferedWriterTest {
    public static void main(String[] args) throws IOException {

        BufferedWriter bw=new BufferedWriter(new FileWriter("C:/Users/29616/desktop/1.txt",true));
        bw.write("java");
        bw.newLine();
        System.out.println("写入成功!");
        bw.flush();
        bw.close();
    }
}

读写二进制文件

读写二进制文件常用的类有DataInputStream和DataOutputStream。

代码示例:

package exam;

import java.io.*;

/**
 * 读取二进制文件1.class中数据,复制到另一个二进制文件2.class文件中
 */
public class ReadAndWriteClass {
    public static void main(String[] args) throws IOException {
        File file=new File("C:/Users/29616/desktop/1.class");
        File copyfile=new File("C:/Users/29616/desktop/2.class");
        file.createNewFile();
        copyfile.createNewFile();

        //字节流读文件
        FileInputStream fis=new FileInputStream(file);
       //字节流读二进制文件
        DataInputStream dis=new DataInputStream(fis);

        //字节流写文件
        FileOutputStream fos=new FileOutputStream(copyfile,true);
        //字节流写二进制文件
        DataOutputStream dos=new DataOutputStream(fos);
        int temp;
        while ((temp=dis.read())!=-1){ //读数据
            dos.write(temp);  //把读取数据写入到2.clss中
        }
        System.out.println("读写成功");
        fis.close();
        fos.close();
        dis.close();
        dos.close();
    }
}

重定向标准I/O

Java提供了两个标准输入/输出流:System.in和System.out,主要用于从键盘接受数据以及向屏幕输出数据。

使用重定向标准I/O可以使用System.in读取文件中的数据以及使用System.out向文件中写入数据。

System类提供3个重定向标准I/O的方法:

方法说明
static void setErr(PrintStream err)重定向标准错误输出流
static void setIn(InputStream in)重定向标准输入流
static void setOut(PrintStream out)重定向标准输出流

代码示例:

package demo1;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class Test3 {
    public static void main(String[] args) {
        //创建PrintStream输入流
        try {
            PrintStream ps=new PrintStream(new FileOutputStream("C:/Users/29616/desktop/1.txt"));
            //将标准输出流重定向到文件
            System.setOut(ps);
            //向文件中输出内容
            System.out.print("重定向测试");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
        }

    }


}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

远离bug,珍爱头发

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

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

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

打赏作者

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

抵扣说明:

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

余额充值