使用字节输入流读取:一个一个传
使用字节缓冲输入流:传数组
缓冲流
字节:BufferedInputStream BufferedOutputStream
字符:BufferedReader BufferedWriter
BufferedOutputStream字节缓冲输出流
close()
flush()
write(byte[] b) write(byte[] b,int off,int len) abstract void write(int b)
要flush或者close刷新缓冲区,才能显示在文件
BufferedInputStream字节缓冲输入流
1.创建FileInputSteam对象,构造方法中绑定要读取的数据源
2.创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputStream对象的读取效率。
3.使用它的read,读取文件。
4.释放资源
FileInputStream fis=new FileInputStream(“abc\123.txt”)
BufferedInputStream bis=new BufferedInputStream(fis)
int len=0
while((len=bis.read())!-1)
syso(len)
bis.close
int read()
int read(byte[] b)
void close()
BufferedWriter字符缓冲输出流
BufferedWriter bw=new BufferedWriter(new FileWrite(“abc/123.txt”))
void write(int c) write(char[] cbuf)写入单个字符
abstract void write(char[] cbuf,int off,int len)
write(String str) write(String str,int off,int len) flush() close()
特有:void newLine()写入一个行分隔符。会根据不同操作系统,获取不同的分隔符
bw.newLine();代替bw.write("\r\n")
换行:换行符号 windows:\r\n Linux:/n mac:/r
BufferedReader字符缓冲输入流
BufferedWriter bw=new BufferedWriter(new FileWrite(“abc/123.txt”))
int read(int c) read(char[] cbuf)一次读取多个字符,将字符读入数组
BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流
BufferedReader(Reader in,int sz)指定大小
参数 Reader in:字符输入流 我们传递FileReader,缓冲流会给它增加一个缓冲区,提高它的读取效率
特有:String readLine()读取一个文本行。读取一行数据
行的终止符号:通过下列字符之一即可认为某行已终止:换行(’\n’)、回车(’\r’)或回车后直接
跟着换行(\r\n).
返回值:包含该行内容的字符串,不包含任何中支付,如果已到达流末尾,则返回null
BufferedReader br=new BufferedReader(new FileReader(“abc\123.txt”))
String line;
While((line=br.readLine())!=null){
syso(line)}
br.close();
把能看懂的变成看不懂的——编码
把看不懂的变成能看懂的——解码
转换流:
InputStreamReader是字节流通向字符流的桥梁 把字节转换成字符——>解码
可以查IDE默认码表utf-8,可以查指定码表gbk
OuputStreamReader是字符流通向字节流的桥梁 把字符变成字节——>编码
可以查IDE默认码表utf-8,可以查指定码表gbk
ObjectOutputStream对象的序列化流
作用:把对象以流的方式写入到文件中保存
特有:void writeObject(Object obj)将指定的对象写入ObjectOutputStream
序列化和反序列化会抛出NotSerializableException没有序列化异常
要实现序列化Serializable接口。才能使其进行
这个接口也叫标志型接口,等于给类添加一个标志,,给猪肉盖个章
有:就可以进行序列化和反序列化
没有:就会NotSerializableException抛出异常
ObjectInputStream:对象的反序列化流
作用:把文件中保存的对象,以流的方式读取出来使用
特有:
Object readObject()从ObjectInputStream读取对象
这个方法声明抛出ClassNotFoundException(class文件找不到异常)
当不存在对象的class文件时抛出此异常
反序列化的前提
1.类必须实现Serializable
2.必须存在类对应的class文件
存在class,但是修改了会产生下面
InvalidClassException异常
序列化冲突异常
如果序列化后改变文件,它的UID改变了
序列化与反序列化的serialVersionUID不一样
但是可以自己进行定义 static final long serialVersionUID=1L
就不会发生冲突
被静态修饰的成员变量不能被序列化,序列化的都是对象
transient关键字:瞬态关键字
被它修饰成员变量,不能被序列化
与static差不多
PrintStream打印流
为其他输出流添加了功能,使他们能够方便地打印各种数据值表示形式。
特点:1.只负责数据的输出,不负责数据的读取
2.与其他输出流不同,它永远不会抛出IOException
特有:print() println()
输出任意类型的值
PrintStream ps=new PrintStream("\目的地.txt")
System.setOut(ps)//把输出语句的目的地改变为打印流的目的地
syso(“我打印在目的地”)
ps.close();