File和IO流

File
创建file对象的3种方法
new File("src/aa");直接文件地址
new File(file2,"a.aa");创建在file2目录下a.aa对象(file2不是目录会报错)
new File("src/ab,"b");src/ab不存在会报错
 
字节--》字节流  inputStream OutputStream
字符--》字符流  Reader  writer

读:
read();从流中读取一个字节,并转换为整数
read(byte[] but);
read(byte[] b,int off,int len);
available();返回从流中读取的字节个数
skip(long);从输入流中跳过参数n指定数目的字节/字符
close();关闭输入流
回读:mark(int);从当前位置设置回流标记  reset();重定位到标记的位置

字节流读到末尾,返回-1;字符流读到末尾,返回null;

写:
write(int b);向输出流写出一个字节
write(byte[] b):把字节数组中的字节数据写到输入流
write(byte[] b,int off,int len);
flush();把缓冲区的数据写到输出流
close();关闭输出流

各种流
inputStream/outputStream 一次读取一个字节
ByteArrayInputStream/ByteArrayOutputStream 专门读取字节数组/把数据写到数组中
FileInputStream/FileOutputStream 从文件中读取数据
new FileOutputStream(new File("文件路径"),是否追加);//读取文件的数据,true-->本次输出的数据在文件末尾追加 ;false-->不追加,覆盖。

java各种流的分类及区别
输入流:从文件流向代码
输出流:从代码流向文件

字节流和字符流区别:

字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。

字节流读取的时候,读到一个字节返回一个字节,字符流读取的时候,读到多个字节,先去查指定的编码表,将查到的字符返回。

字节流可以处理所有类型数据,如图片,MP3,avi视频文件,而字符流只能处理字符数据(只要是纯文本数据,就要优先考虑使用字符流,除此之外都用字节流)

字节流读到流的末尾返回-1,字符流读到流的末尾返回null

 


FileInputStream :从本地文件系统读取文件内容
FileInputStream(File file)
FileInputStream(String name)
int available():返回下一次对此输入流调用的方法不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。
void close();//关闭流

BufferedInputStream:带有缓冲区的流
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in,int size)
read(byte[] b, int off, int len)会阻塞代码.读取字节保存到参数b字节数组中。返回的整数表示读取的字节数。参数off:数组中开始保存数据的起始下标,参数len指定读取的字节数目。如果遇到输入流的结尾,则返回-1;

DataInputStream:该类提供一些基于多字节读取方法,从而可以读取基本数据类型的数据。

有缓冲区的流一定要flush();

输出流
FileOutputStream:此类用于把代码中的数据写入到文件中。
new FileOutputStream(new File("文件路径"),是否追加);//读取文件的数据,true-->本次输出的数据在文件末尾追加 ;false-->不追加,覆盖。
BufferedOutputStream:此类本身带有一个缓冲区,在写入数据时,先放到缓冲区中,实现缓冲的数据流。
DataOutputStream(OutputStream out):创建一个新的数据输出流,将数据写入指定输出流。
int size():返回到目前为止写入此数据输出流的字节数。

字符流
FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。

BufferedReader类是Reader类的子类,为Reader对象添加字符缓冲器,为数据输入分配内存存储空间,存取数据更为有效
int read():读取单个字符
·String readLine():读取一个文本行。
可以回读:
void mark(int readAheadLimit):标记流中的当前为止。
·boolean markSupported();判断此流是否支持mark()操作。
void reset():将流重置到最新的标记。
·long skip(long n):跳过字符。

FileWriter:用来写入字符文件的便捷类,可用于写入字符流。
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

BufferedReader/PrintWriter:可以读写一行

随机访问流 :  RandomAccessFile
特点:将文件中的数据全部读取到流中,对流可以一直反复操作。
    构造器:new RandomAccessFile(new File(),"r")--->只读方式("r")
    构造器:new RandomAccessFile(new File(),"rw")--->读写方式("rw")
注意:利用readLine()读取得到的字符串是乱码。这是因为从文件中读取是以ISO-8859-1编码读取,如果是从文件中读取字符串需要转码操作。
  eg:  String msg = in.readLine();//你好
        String dat = new String(msg.getBytes("ISO-8859-1"));//你好
     将msg以ISO-8859-1编码转为字节数组,然后通过该字节数组得到String(当前文件编码)。
seek():定位,设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
getFilePointer()    获得文件的当前偏移量


对象序列化和反序列化:
对象序列化:将内存中的对象转化成字节序列,用于持久化到磁盘或者网络传输。
主要目的:传递和保存对象
通过socket传输数据时需要将对象序列化
反序列化:从字节序列创建对象的过程称为反序列化。序列化对象和平台无关,序列化得到的字节流可以在任何平台反序列化。

序列化通过对象输出流实现   ObjectOutputStream
反序列化通过对象输入流实现  ObjectInputStream
注意:对象的序列化和反序列化操作的对象一定要实现Serializable接口。(这是空接口,只是一个标识);


posted @ 2019-12-06 11:13  下饭  阅读(119)  评论(0编辑  收藏  举报