章七、I/O —— File类、输入与输出、字节流与字符流、节点流与处理流

一、 File类


File类是java.io包中很重要的一个类

File类的对象可以表示文件,还可以表示目录,在程序中一个File类对象可以代

表一个文件或目录;

File对象可以对文件或目录的属性进行操作,如:文件名、最后修改日期、文件

大小等;

File对象无法操作文件的具体数据,即不能直接对文件进行读/写操作

●  构造方法

File(String pathName); //指定文件(或目录)名和路径创建文件对象

●  常用方法

boolean exists()        //判断文件是否存在

boolean isFile()        //判断是否为文件
boolean isDirectory()        //判断是否为目录

String getName()        //获得文件的名称

long length()        //获得文件的长度
boolean createNewFile()throws IOException       

//创建新文件,有可能要抛出IOException异常,必须捕捉

boolean delete()        //删除文件

public String[]list()        //将目录下子文件及文件名返回到String数组中

public File[] listFiles()        //将目录下子目录及文件的实例返回到File数组中

import javax.xml.transform.Source;
import java.io.File;
import java.util.Date;

/*
File类 的对象既可以表示文件,也可以表示文件夹
 */
public class Demo1 {
    public static void main(String[] args) {

        File f1 = new File("D:/JAVA/file/demo.txt");
        System.out.println(f1.canRead());//是否可读
        System.out.println(f1.canWrite());//是否可写入
        //判断文件是否存在
        System.out.println(f1.exists());
        //获取文件绝对地址
        System.out.println(f1.getAbsolutePath());
        System.out.println(f1.getName());//获取文件名
        System.out.println(f1.getParent());//文件的上一级地址
        System.out.println(f1.isDirectory());//是否是文件夹
        System.out.println(f1.isFile());//是否是普通文件
        //最后一次改写时间
        System.out.println(f1.lastModified());//返回的是长整型
        System.out.println(new Date(1710639257338L));//转为时间值

        System.out.println(f1.length());//文件的长度
        System.out.println(f1.isHidden());//是否为隐藏文件

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

public class Demo2 {
    public static void main(String[] args) throws IOException {
        File f1 = new File("D:/JAVA/file/a.txt");
//        if(!f1.exists()){
//            try {
//                f1.createNewFile();
//            } catch (IOException e) {//当上面代码有问题时,会运行下面这段
//                e.printStackTrace();
//            }
        //创建文件(当所访问的路径上无文件)
        if(!f1.exists()) {
            System.out.println(f1.createNewFile());
        }
        //删除文件
        System.out.println(f1.delete());

        File file = new File("D:/JAVA/file/download");
        //创建单级文件文件夹
        System.out.println(file.mkdir());
        //创建多级文件文件夹
        File file1 = new File("D:/JAVA/file/a/b");
        System.out.println(file.mkdirs());
        //删除一个文件夹时。文件夹必须为空
        file1.delete();
        //展示文件
        file=new File("D:/JAVA/file");
        File[] files = file.listFiles();
        for(File f:files){
            System.out.println(f);
        }

    }
}

二、 输入及输出的概念


        输入输出(I/O): 把电脑硬盘上的数据读到程序中,称为输入,input,进行数据的read 操作从程序往外部设备写数据,称为输出,即output,进行数据的write操作

三、 字节流与字符流


         Java中把用于对文件输入和输出的类 称为流 ,有一些类是以字节为读取单位的,有一些是以字符为单位读取数据的

  字节流

字节流读取时以字节为单位,可以读取任意文件(.mp3、.jpg等)

跳转:五、 字节流

  字符流

字符流读取时只能读取文本文件

跳转:六、 字符流

四、 输入流与输出流


流按着数据的传输方向分为:

        ● 输入流:往程序中读叫输入流。

        ● 输出流:从程序中往外写叫输出流。

● InputStream和OutputStream的子类都是字节流,可以读写二进制文件,主要处理音频、图片、歌曲、字节流,处理单元 为1个字节。

● Reader和Writer的子类都是字符流,主要处理字符或字符串,字符流处理单元为1个字符。 字节流将读取到的字节数据,去指定的编码表中获取对应文字字符。

五、 字节流


字节流中常用类:

        字节输入流 FileInputStream 类

        字节输出流 FileOutputStream 类

  字节输入流

基本方法 —— InputStream

        一、读取一个字节并以整数的形式返回(0~255),如果返回-1,表示已到输入流的末尾。

int read() throws IOException

        二、读取一系列字节并存储到一个数组buffer, 返回实际读取的字节数,如果读取前已到输入流的末尾返回-1

int read(byte[] buffer) throws IOException

        关闭流释放内存资源

void close() throws IOException

  字节输出流

● 基本方法 —— OutputStream

        一、向输出流中写入一个字节数据,该字节数据为参数b的低8

void write(int b) throws IOException

        二、将一个字节类型的数组中的从指定位置(off)开始的 len 个字节写入到输出流

void write(byte[] b, int off, int len) throws IOException

        关闭流释放内存资源

void close() throws IOException

 ●  具体实现

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

public class InputStream {
    public static void main(String[] args) throws IOException {
        //输入-从硬盘上把文件读入到程序
        /*
        输入代码
         */
        FileInputStream inputStream = new FileInputStream("D:/JAVA/file/streamDemo.txt");
//        System.out.println(inputStream.read());//97
//        System.out.println(inputStream.read());//98
//        System.out.println(inputStream.read());//99
//        System.out.println(inputStream.read());//100
//        System.out.println(inputStream.read());//-1
        //每次读取,当读取的不为-1时返回
        /*
        输出代码
         */
        FileOutputStream outputStream = new FileOutputStream("D:/JAVA/file/outDemo.txt");

        int b = 0;
        while((b = inputStream.read())!=-1){
            System.out.println(b);
            outputStream.write(b);
        }
        //注意读取后要销毁管道
        inputStream.close();
        outputStream.close();
    }
}

但,一次只读入一个字节过于慢,在 read()方法中,有一个

public int read(byte b[])        //返回值是一个int类型的

        传入一个byte数组,读取byte数组长度的字符存在byte数组里,返回值表示在byte数组中存入了 int 个字符,

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class InputStream2 {
    public static void main(String[] args) throws IOException {
        //输入流
        FileInputStream inputStream = new FileInputStream("D:/JAVA/file/streamDemo.txt");
        FileOutputStream outputStream = new FileOutputStream("D:/JAVA/file/outDemo.txt");

        byte[] bytes = new byte[10];
        //read(bytes); 一次读byte数组长度个字符
        //size 表示每次实际往数组中装入的元素个数
        int size = 0;
        //一次向外写出byte长度个字节内容,并从指定位置开始,写 size(有效范围)个字节
        while((size = inputStream.read(bytes))!=-1){
            outputStream.write(bytes,0,size);
        }
        inputStream.close();
        outputStream.close();
    }
}

六、 字符流


字符流中常用类

字符输入流        FileReader类

字符输出流        FileWriter类

        Reader和Writer的子类都是字符流,主要处理字符或字符串,字符流处理单元为1个字符。 字节流将读取到的字节数据,去指定的编码表中获取对应文字字符。

  Reader 的基本方法

  

        读取一个字符并以整数的形式返回, 如果返回-1已到输入流的末尾。

int read() throws IOException

        读取一系列字符并存储到一个数组buffer, 返回实际读取的字符数,如果读取前已到输入流的末尾返回-1

int read( char[] cbuf) throws IOException

        关闭

void close() throws IOException

  Writer 的基本方法

        向输出流中写入一个字符数据,该字节数据为参数b16

void write(int c) throws IOException

        一个字符类型的数组中的数据写入输出流

void write( char[] cbuf) throws IOException

        将一个字符类型的数组中的从指定位置(off set)开始的 length个字符写入到输出流

void write( char[] cbuf, int off set, int length) throws IOException

        关闭

void close() throws IOException


import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CharDemo {
    /*
    字符流只能读取字符(文本文件)
    会将独到的字符结合编码表转换为一个字符编码
     */
    public static void main(String[] args) throws IOException {
        FileReader reader = new FileReader("D:/JAVA/file/charDemo.txt");
        FileWriter writer = new FileWriter("D:/JAVA/file/charOutDemo.txt");

        int c = 0;
        while((c=reader.read())!=-1){
            System.out.println(c);
            writer.write(c);
        }
        
        char[] chars = new char[2];
        int size = 0;
        while((size = reader.read(chars))!=-1){
            writer.write(chars,0,size);
        }
        reader.close();
        writer.close();
    }
}

七、 节点流与处理流


根据封装类型不同流又分为:节点流 和 处理流

● 节点流:

        如果流封装的是某种特定的数据源,如文件、字符串、字符串数组等,则称为节点流。

● 处理流:

        如果流封装的是其它流对象,称为处理流。 处理流提供了缓冲功能,提高读写效率,同时增加了一些新的方法(BufferedInputStream(缓存字节输入流)、DataInputStream(数据输入字节流)等)

  节点流中常用类

字节输入流 FileInputStream

字节输出流 FileOutputStream

字符输入流 FileReader

字符输出流 FileWriter

  处理流中常用类

缓冲字节输出流 BufferedOutputStream

缓冲字节输入流 BufferedInputStream

缓冲字符输入流 BufferedReader

缓冲字符输出流 BufferedWriter

字节处理流: 

import java.io.*;

public class BufferInputStreamDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream inputStream = new FileInputStream("D:/JAVA/file/streamDemo.txt");
        BufferedInputStream bufferInputStream = new BufferedInputStream(inputStream);
        FileOutputStream outputStream = new FileOutputStream("D:/JAVA/file/outDemo.txt");
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);

        byte[] bytes = new byte[10];
        int size = 0;
        while ((size = bufferInputStream.read(bytes))!=-1){
            bufferedOutputStream.write(bytes,0,size);
        }
        bufferInputStream.close();
        bufferedOutputStream.close();
    }
}

字符处理流:

import sun.font.TrueTypeFont;

import java.io.*;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        FileReader reader = new FileReader("D:/JAVA/file/charDemo.txt");
        FileWriter writer = new FileWriter("D:/JAVA/file/charOutDemo.txt",true);
        //当append为true时,会在源文件之后续写,而不是直接覆盖

        BufferedReader bufferedReader = new BufferedReader(reader);
        BufferedWriter bufferedWriter = new BufferedWriter(writer);
        //一次读一行
        String line = null;
        while((line=bufferedReader.readLine())!=null){
            //System.out.println(line);
            bufferedWriter.write(line);
            bufferedWriter.newLine();//插入一个换行符
        }
        bufferedReader.close();
        bufferedWriter.flush();
        bufferedReader.close();
    }
}

八、 对象输入输出流--对象序列化


把Java中的对象输出到文件中,从文件中把对象输入到程序中

为什么要把对象输出到文件中?

        数据存储在对象中,对象实在内存中存储,一旦程序运行结束,对象就会销毁

        有时需要将对象的信息长久保存,就需要将对象输出到文件中,长久保存

        把对象输出到文件的过程称为对象的序列化,再把对象从文件输出到程序的过程称为对象的反序列化(反序列化时会创建一个新的对象,所以反序列化也是创建对象的一种方式)

对象的输入输出流 :

主要的作用是用于写入对象信息与读取对象信息。 对象信息一旦写到文件上那么对象的信息就可以做到持久化了.

对象的输出流:ObjectOutputStream

对象的输入流:ObjectInputStream

● 在ObjectInputStream 中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。

  • 29
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三木几

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

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

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

打赏作者

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

抵扣说明:

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

余额充值