JAVA IO流学习

File类:

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

File类的对象可以代表一个文件或者目录,可以修改文件大小、文件最后修改日期、文件名等

File对象不能操作文件的具体数据,即不能对文件进行读和写的操作

File的构造方法:

File(String pathname)  -------指定文件(目录)名和路径创建文件对象

File类的常用方法:

package file;
import java.io.File;
import java.io.IOException;
import java.util.Date;
public class FileDemo1 {
    public static void main(String[] args) throws IOException {
        /*
        一个File对象可以代表具体的文件或者目录 , 是对文件或者目录的抽象表示
         */
        File f1=new File("D:\\java测试专用\\file测试用例");//指明详细的路径和文件名,注意用用双斜线或者反斜杠
        //指明详细的路径和目录名,注意用双斜线
       f1.createNewFile();//该名称文件不存在时,在该路径下创造出文件  原子地创建一个由该抽象路径名命名的新的空文件。
        System.out.println(f1.exists());//判断文件是否存在
        System.out.println(f1.canRead());//判断文件是否可以读取
        System.out.println(f1.canWrite());//判断文件是否可以写入
        System.out.println(f1.getParent());//返回此抽象路径的父级路径,如果不存在则返回NULL
        System.out.println(f1.getName());//获取路径名称
        System.out.println(f1.isDirectory());//测试此路径名是否为目录
        System.out.println(f1.isFile());//判断是否为普通文件
        System.out.println(f1.isHidden());//是否为隐藏文件
        System.out.println(f1.lastModified());//返回最后修改时间
        System.out.println(f1.getPath());//将此抽象路径名转换为路径名字符串。
        System.out.println(new Date(1679652353967L));
        System.out.println(f1.length());//返回此抽象路径名代表的文件的长度
    }
}

输入及输出的概念:

输入:把电脑硬盘中的东西读到程序中叫做输入(input)

输出:进行数据的read操作,将程序中的内容写出到外部设备中叫做输出(output),进行数据的write操作。

字节流与字符流:

从数据流编码格式上划分为字节流和字符流

字节流常用类:

字节输入流:FileInputStream;

字节输出流:FileOutputStream

字符流常用类:

字符输入流:FileReader;

字符输出流:FileWriter

输入流与输出流:

流按照数据的传输方向分为输入流和输出流

输入流:往程序中传输数据叫做输入流

输出流:从程序中往外写数据叫做输出流

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

● Reader和Writer的子类都是字符流 主要处理字符或字符串,字符流处理单元为1个字符。

字节流将读取到的字节数据,去指定的编码表中获取对应文字字符

输入输出节点字节流:

InputStream的基本方法:

close();       关闭流释放内存资源

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

read(byte[ ] b);读取一系列字节并存储到数组b中,返回读取到的字节数,如果读取前已到输入流的末尾。则返回-1

read(byte[ ] b,int off,int len);从索引off处开始读取len个字节并存储到数组b中,返回读取到的字节数,如果读取前已到输入流的末尾。则返回-1

OutputStream的基本方法:

close();关闭流释放内存资源

flush();刷新输出缓存区,直接将缓存区的数据输出而不必等到缓存区满,通常用在多线程的环境中,它可以确保当前缓存内容被输出,并立即释放内存

writre(int b);向输出流中写入一个字节数据,该字节数据为参数b的低八位

write(byte[ ] b);将一个数组写入到输出流中

write(byte[ ] b,off,len);将一个数组从索引off处开始len个字节写入到输出流中

节点流与处理流:

根据封装类型不同,流又被分为:

节点流、处理流

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

处理流:如果流封装的是其它对象,则称之为处理流。处理流提供了缓冲功能,提高了读写效率,同时增加了一些新的方法

节点流中常用类:

字节输入流:FileInputStream

字节输出流:FileOutputStream

字符输入流:FileReader

字符输出流:FileWrite

处理流中常用类:

缓冲字节输入流:BufferedInputStream

缓冲字节输出流:BufferedOutputStream

缓冲字符输入流:BufferedReader

缓冲字符输出流:BufferedWriter

输入输出节点字符流:

Reader的基本方法:

close();       关闭

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

read(char[ ] b);读取一系列字节并存储到数组b中,返回读取到的字节数,如果读取前已到输入流的末尾。则返回-1

read(char[ ] b,int off,int len);从索引off处开始读取len个字节数据并存储到数组b中,返回读取到的字节数,如果读取前已到输入流的末尾。则返回-1

Writer的基本方法:

close();关闭流释放内存资源

flush();刷新输出缓存区,直接将缓存区的数据输出而不必等到缓存区满,通常用在多线程的环境中,它可以确保当前缓存内容被输出,并立即释放内存

writre(int b);向输出流中写入一个字节数据,该字节数据为参数b的低八位

write(char[ ] b);将一个字符类型数组的数据写入到输出流中

write(char[ ] b,off,len);将一个字符类型数组从索引off处开始len个字节的字符写入到输出流中

对象输入输出流:

package chardemo;
import java.io.*;
import java.util.Date;
public class ObjectDemo {
    /*
      对象输入输出流: 把Java中的对象输出到文件中, 从文件把对象输入到程序中
      为什么要把对象输出到文件中?
             new Student(“张er”,20);数据存储在对象中,对象是在内存中存储,一旦程序运行结束,对象就会销毁
             有时需要将对象的信息长久保存,就需要将对象输出到文件中,长久保存。  举例系统升级   关闭服务器时将对象保存起来,升级完毕,重新再把数据还原回来
             把对象输出到文件的过程也称为对象的序列化,
             再把对象从文件输入到程序的过程称为对象的反序列化,反序列时会生成一个新的对象,所以反序列化也是创建对象的一种方式
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException {
       // String s=new String("fsde");
        //Date date=new Date();
        Student student=new Student(66,"zz");
        //对象输出   对象的序列化
       // FileOutputStream out=new FileOutputStream("D:\\demo.txt");
     //   ObjectOutput output=new ObjectOutputStream(out);
               //output.writeObject(s);
               //output.writeObject(date);
      /*  output.writeObject(student);
               output.flush();
               output.close();
*/
        //对象输入   对象反序列化
        FileInputStream inputStream=new FileInputStream("D:\\demo.txt");
        ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
         //        String s=(String)objectInputStream.readObject();
                 Date date=(Date) objectInputStream.readObject();
        //System.out.println(s);
        System.out.println(date);
        Student student1=(Student)objectInputStream.readObject();
        System.out.println(student1);
        objectInputStream.close();
    }
}