目录
今天,某位同事让我帮他找BUG,就是某个应届生,他的BUG很简单,没有关流,导致文件删不掉
以下是吐槽他的话,请忽略,实在是提起这个人生气,不吐槽一下感觉心里堵得慌
说实话挺烦他的,不是因为他技术问题,毕竟谁都有刚开始的时候,你不会,出于人道主义,我不介意教你,但是,我跟你说的,你不知道记,不知道学,一点都不上心,每次让我帮你找BUG,帮你找到了,一句谢谢也没有,而且每次说是让我帮你找BUG,跟我一说你就不管了,去玩了,搞得就跟是我的BUG一样,搞笑!我没有义务帮你找你的问题,帮你找你能不能上点心,我是帮你找,不是替你找,懂?是你不会,我帮你一块,你直接不管了是什么意思?而且生产问题,那么着急的问题,你从2020年12月拖到了2021年四月,还没开始解决,每次人家需求问你解决了么,你就一句没有,然后继续玩手机,你这个是什么破态度,生产问题优先级最高不懂?人家是提需求的,但是为了你开发方便,人家都愿意费劲去找甲方爸爸谈n次,让甲方爸爸改需求,你好大的脸!是你的问题,你不处理,你还泄露代码,没有一点点责任心和担当,没有一点职业素养,真的是个XX,能不能摆正自己的位置,没有人有义务帮你,你是以正式工作的身份进来的,没有人像你上学期间一样,带着你做项目什么的
OK,吐槽完了,开始分享
字节流和字符流最大的区别,如字面意思,一个读出来是字节,一个读出来是字符~
在GBK编码中,一个中文占2个字节
UTF-8编码中,一个中文占3个字节
所以如果用字节流去读中文,读出来可能是我们看不懂的玩意~
字节流:
字节输出流:
public abstract class OutputStream implements Closeable, Flushable
OutputStream是所有字节输出流类的最顶层父类(或者说超类)
方法:
.close() // 关闭此流并释放与此流相关的所有系统资源
.flush() // 刷新此流并强制所有缓冲的输出字节被写出
.write(byte[] b) // 将b.length长度的字节数组写入到输出流
.write(byte b[], int off, int len) // 从指定的字节数组b,从off偏移量开始,写入len长度的字节
.write(int b) // 将指定的字节输出
文件字节输出流:
构造方法:
FileOutputStream(File file) // 输出的目的地是一个文件
FileOutputStream(String name) // 输出的目的地是一个路径
FileOutputStream(File file, boolean append) // boolean值代表是否需要续写,true为可续写,不会覆盖之前的文件,会往文件的结尾继续写数据,false为不可续写,文件名相同,会创建一个新的空白文件覆盖之前的文件
FileOutputStream(String name, boolean append) // boolean值代表是否需要续写,true为可续写,不会覆盖之前的文件,会往文件的结尾继续写数据,false为不可续写,文件名相同,会创建一个新的空白文件覆盖之前的文件
PS:换行符
windows:\r\n
linux:/n
mac:/r 从 Mac OS X开始与Linux统一
字节输入流:
public abstract class InputStream implements Closeable
InputStream是所有字节输入流的最顶层父类(或者说超类)
方法:
.close() // 关闭此流并释放与此流相关的所有系统资源
.read() // 从输入流中读取数据的下一个字节
.read(byte[] b) // 从输入流中读取一批字节,并存储到一个字节数组b中
文件字节输入流:
构造方法:
FileInputStream(File file) // 读取源是一个文件
FileInputStream(String name) // 读取源是一个路径
字符流:
字符输入流:
public abstract class Reader implements Readable, Closeable
所有字符输入流的最顶层父类(或者说超类)
方法:
.close() // 关闭此流并释放与此流相关的所有系统资源
.read() // 从输入流中读取一个字符
.read(char[] cbuf) // 从输入流中读取一批字符,并放入字符数组cbuf中
文件字符输入流:
构造方法:
FileReader(File file) // 读取源是一个文件
FileReader(String fileName) // 读取源是一个路径
字符输出流:
public abstract class Writer implements Appendable, Closeable, Flushable
所有字符输出流的最顶层父类(或者说超类)
方法:
.close() // 刷新并关闭此流
.flush() // 刷新此流并强制所有缓冲的字符被写出
.write(int c) // 写出一个字符
.write(char[] cbuf) // 将指定的 cbuf.length长度的字符数组写到此输出流
.write(char[] b, int off, int len) // 从指定的字符数组b,从off偏移量开始,写入len长度的字节
.write(String str) // 写出一个字符串
.write(String str, int off, int len) // 写入字符串的某一部分
文件字符输出流:
构造方法:
FileWriter(File file) // 输出源是一个文件
FileWriter(String fileName) // 输出源是一个路径
FileWriter(File file, boolean append) // boolean值代表是否需要续写,true为可续写,不会覆盖之前的文件,会往文件的结尾继续写数据,false为不可续写,文件名相同,会创建一个新的空白文件覆盖之前的文件
FileWriter(String fileName, boolean append) // boolean值代表是否需要续写,true为可续写,不会覆盖之前的文件,会往文件的结尾继续写数据,false为不可续写,文件名相同,会创建一个新的空白文件覆盖之前的文件
关闭和刷新的区别:
flush :刷新缓冲区,把缓冲区中的数据刷新到文件,流对象可以继续使用。
close :关闭流,释放系统资源。关闭前会刷新缓冲区。把缓冲区中的数据刷新到文件,关闭之后流对象就不能使用了
重要提醒:
用完一定、一定、一定、一定记得关流,不然会一直占用,会给自己埋下一个坑!!!个人对文件的处理会try catch,并且一定会加一个finally,里边关流,希望大家记得关流!