文件IO流

Posted ltjava

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件IO流相关的知识,希望对你有一定的参考价值。

2-2  文件IO

 

文件

  持久化的保存数据

 

File操作

java.io

File类(包含目录和文件)

 

创建方法:

  new File("文件绝对路径")

 

常用方法:

boolean exists() 文件是否存在

boolean isFile()       是否是文件

boolean createNewFile()   创建新文件

boolean mkdir()  创建目录

boolean mkdirs() 创建多级目录

String getAbsolutePath() 获得绝对路径

boolean delete()  :删除文件

int length(): 返回文件长度

String getName()  获得文件名

 

File筛选

筛选目录下的文件和文件夹

File [] listFiles()      返回所有文件和目录

File [] listFile(FilenameFilter filter)  通过文件名来筛选

FilenameFilter:boolean accept(File dir,String name)

可以通过文件名来筛选,true通过,false过滤掉

 

File [] listFile (FileFilter filter)   通过文件各种属性筛选

FileFilter 接口

boolean accept(Filter pathname)

 

IO流分类

数据可以以流的形式进行点对点的传输,类似于水流

按方向分类:

输入流:从磁盘文件或网络流向java程序

用于读取数据

 

输出流:从java程序流向磁盘文件或网络

用于保存(写入)数据

 

 

按数据类型分类:

字节流:以byte字节为最小单位进行处理。适合于处理二进制文件(exe图片视频音频等)

字符流:以hchar字符为最小单位进行处理,适合于处理文本文件(txthtmljavacss)

 

文件流

字节流:

InputStream是所有字节输入流的父类

OutputStream是所有字节输出流的父类

文件输入流

FileInputStream

创建方法:

new FileInputStream(File file); 以文件创建

new FileInputStream(String path);以文件路径字符串创建

操作方法:

int read(byte[] buffer)

buffer是作为缓冲的字节数组,每次读取时会将数据存到该数组

返回值int,是每次读取数据的长度,如果数据读完了,会返回-1

void close()关闭流

 

读取文件的过程:

1)创建文件输入流、

2)创建字节数组

3)循环调用输入流的read方法

4)将读取到字节数组的数据进行处理

5)关闭流

 

jdk1.7:用以下方式创建,系统会自动关闭流

try(创建输入输出流对象){

 

 

}catch{

}

文件输出流

FileOutputStream

创建方法:

new FileOutputStream(File file); 以文件创建

new FileOutputStream(String path);以文件路径字符串创建

new FileOutputStream(File file,boolean append);

new FileOutputStream(String pathboolean append)

append参数表示追加模式,默认情况下为false,如果为false会将原来的文件清空,如果为true,不会清空原来文件,在文件末尾追加数据

 

常用方法:

void write(byte[] )

void write(byte[] buffer,int offset, int length)

buffer:字节数组保存写入数据

offset:从数组哪个位置开始写

length:从数组写入数据的长度

void close();

字符流

Reader是所有字符输入流的父类

Writer是所有字符输出流的父类

 

 

字符流

 

适合操作文本数据

 

所有字符输入流的父类是:Reader

 

所有字符输出流的父类是:Writer

 

 

 

文件字符输入流:FileReader

 

创建方法:

 

new FileReaderFile file

 

new FileReaderString path

 

操作方法:

 

int read(char[] buffer)

 

void close()

 

过程与FileInputStream类似

 

 

 

文件字符流输出:FileWriter

 

创建方法:

 

new FileWriterFile file

 

new FileWriterrString path

 

new FileWriterrFile file ,booiean appendf

 

new FileWriterrString path,boolean append

 

操作方法:

 

void write(char [] buffer int offset int lenght)

 

void write(String s)

 

void close()

 

缓冲流

 

用于加快读写速度,前提是内存的读写效率远远高于磁盘的读写效率

 

原理:会在内存中开辟一个空间作为缓冲区,在读写之前,先将磁盘的数据导入到缓冲区,在读写时,直接从缓冲区进行读写,这样就减少了直接从磁盘读写的次数,从而提高了读写效率。

 

 

 

缓冲字节流

 

输入:

 

BufferedInputStream

 

创建方法:

 

new BufferedInputStream(inputStream in);

 

在构造方法中传入普通的流,就可以给该流添加缓冲,不需要修改原来的流

 

重载:size表示缓冲区的大小,默认大小是8K

 

new BufferedInputStream(InputStream in, int size );

 

主要方法和InputStream一样

 

 

 

输出:

 

BufferedOutputStream

 

创建方法:

 

   new BufferedOutputStreamOutputStream out;

 

主要方法和OutputStream方法一样

 

 

 

 

 

缓冲字符流

 

输入:

 

BufferedReader

 

创建方法:

 

new BufferedReader(Reader reader)

 

new BufferedReader(Reader reader,int size)

 

 

 

特有方法:

 

String readLine()   一次读取一行文字

 

 

 

输出:  

 

BufferedWriter

 

创建方法:

 

new BufferedWriter(Writer writer)

 

特有方法:

 

void write(String str)

 

void newLine()  添加新行

 

 

 

 

 

 

 

装饰者模式

 

GOF2323种设计模式)设计模式之一

 

符合开闭原则,开发过程中对程序的修改关闭,对程序的扩展开放

 

常用的场景:IO

 

在不修改原有流代码的基础上,给原有的流添加新的功能

 

如何实现:

 

1)类分为装饰者和被装饰者

 

2)装饰者和被装饰者都要实现相同的接口(或继承相同的父类)

 

3)给装饰者传入一个被装饰者的对象

 

4)在调用装饰者对象方法时,也会调用被装饰者的方法,在此基础上再添加新的功能

 

 

 

对象流:

 

特点:可以读写各种java数据类型以及自定义类型对象

 

 

 

ObjectOutputStream  对象输出流

 

创建方法

 

new  ObjectOutputStream(OutputStream out)

 

new  ObjectOutputStream(new FileOutputStream("xxxxxx"))

 

加上缓冲流

 

new  ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("xxxxxx")))

 

 

 

特有方法:

 

  void writeByte(byte data)

 

void writeShort(short data)

 

void writeInt(int data)

 

void writeLong(long data)

 

void writeChar(char data)

 

void writeFloat(float data)

 

void writeDouble(double data)

 

void writeBoolean(boolean data)

 

void writeUTF(String data)

 

void writeObject(Object data)

 

 

 

 

 

 

 

ObjectInputStream 对象输入流

 

创建方法

 

new  ObjectInputStream(InputStream in)

 

new  ObjectInputStream(new FileInputStream("xxxxxx"))

 

 

 

特有方法

 

byte readByte()

 

shoirt readShort()

 

int readInt()

 

long readLong()

 

char readChar()

 

float readFloat()

 

double readDouble()

 

boolean readBoolean()

 

String readUTF()

 

Object readObject()

 

 

 

读取顺序和写入顺序要一致

 

 

 

序列化和反序列化:

 

序列化:将java对象转换为字节序列保存到磁盘或网络

 

通过ObjectOutputStreamwriteObjectObject obj)实现

 

注意进行序列化的对象必须实现Serializable接口,否则会出现notSerilizableException异常

 

如果对象的某个属性不想序列化,在属性前面加上transient

 

@Test

 

public void writeElephont(){

 

  Elephont elephont = new Elephont("小黑",21);

 

  try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("G:\File\elephont.txt"))){

 

  outputStream.writeObject(elephont);

 

  } catch (Exception e) {

 

  // TODO: handle exception

 

  }

 

}

 

 

 

 

 

serialVersionUID是序列化的版本编号,如果没有版本号,系统会自动添加默认的版本号,如果类的对象序列化后,类的代码进行任何修改,默认的版本号就会改变,进行反序列化时就会出现InvaliClassException

 

解决方法:创建一个固定的版本号

 

反序列化:将磁盘或网络中的字节序列转换为java对象

 

通过ObjectInputStreamreadObjectObject obj)实现

 

@Test

 

public void readElephont(){

 

  try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("G:\File\elephont.txt"))){

 

    Elephont elephont = (Elephont) inputStream.readObject();

 

    System.out.println(elephont);

 

  } catch (Exception e) {

 

  // TODO: handle exception

 

  }

 

}

 

 

 

 

 

NIO

 

BIO: 传统的IOBlocking IO,阻塞式IO

 

阻塞式IO,当流进行读写操作时,会阻塞当前线程,当前线程必须等读写完成后才能进行后面的操作。

 

相当于银行排队,如果没有排到,就什么都不能做

 

 

 

NIONON-Blocking IO,非阻塞式IO

 

JDK 1.4出现的,借助于多路复用器(轮巡机制),可以实现多个用户同时访问同一个资源,效率更高,过程比较复杂。

 

相当于在银行办业务,可以坐着做自己的事情,需要每隔一段时间去询问大堂经理是否轮到自己,轮到自己即办理业务,如果没有再继续去做自己的事情

 

 

 

 

 

java.nio包:

 

Channel     通道

 

FileChannel           文件通道

 

SocketChannel 网络通道

 

 

 

Buffer         缓冲区

 

ByteBuffer 字节缓冲区

 

ChaeBuffer 字符缓冲区

 

Selector      选择器

 

 

 

使用NIO实现文件的复制

 

1)创建文件输入流和输出流

 

2)获得一个文件输入通道和文件输出通道

 

3)创建字节缓冲区/字符缓冲区

 

4)通过输入通道将数据输入到缓冲区

 

5)从缓冲区取出数据通过输出通道写入文件

 

从缓冲区取数据前,要将缓冲区由写模式转换为读模式,filp()

 

将缓冲区数据写入文件后,要重置缓冲区 rewind()

 

6)关闭流

 

 

以上是关于文件IO流的主要内容,如果未能解决你的问题,请参考以下文章

IO流 文件 File

java怎么使用io流读取一个文件夹里面

IO流 复制文件及文件夹

IO流26 - 字符流 - 使用字符缓冲区流对象复制文本文件

Java IO文件流

文件IO流