目录
通过前面的简单学习,我们已经能够大致了解了关于文件的操作,但是能够明显感受到在执行其他的操作的时候,还是会有一些不方便的地方存在,因此今天我们会学习另外四个IO流来帮助我们对文件进行操作,这四个流分别是缓冲流、转换流、序列化、打印流。好了,废话不多说,我直接开始今天的学习吧!
构造器 说明 public BufferedInputStream(InputStream is) 可以把低级的字节输入流包装成一个高级的字节缓冲输入流管道,从而提高字节输入流读数据的性能 public BufferedOutputStream(OutputStream os) 可以把低级的字节输出流包装成一个高级的字节缓冲输出流管道,从而提高写数据的性能 InputStream is = new FileInputStream("File//data.txt"); InputStream bis = new BufferedInputStream(is); OutputStream os = new FileOutputStream("File//data01.txt"); OutputStream bos = new BufferedOutputStream(os); int len; byte []buffer = new byte[1024]; while ((len = bis.read(buffer))!=-1){ bos.write(buffer,0,len); bos.flush(); 通过字节缓冲流实现将一个文件中的内容复制在另一个文件之中。
字符缓冲输入流:BufferedReader,提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能 构造器 说明 public BufferedReader(Reader r) 可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能 方法 说明 public String readLine() 读取一行数据返回,如果读取没有完毕,无行可读取返回null Reader r = new FileReader("File//data.txt"); BufferedReader br = new BufferedReader(r);//由于是子类独有的功能,所有不能使用多态创建 String s; byte []buffer = new byte[1024]; while ((s = br.readLine())!=null){ System.out.println(s); } //正常情况下会将文件中的数据依次输出; Reader r = new FileReader("File//data.txt"); BufferedReader br = new BufferedReader(r); br.readLine(); br.readLine(); //若文件中的数据不足两行: //kdirvingJamesJame //null
字符缓冲输出流:BufferedWriter,提高字符输出流写取数据的性能,除此之外多了换行功能 构造器 说明 public BufferedWriter(Writer w) 可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能 方法 说明 public void newLine() 执行操作 Writer w = new FileWriter("File//data.txt",true); BufferedWriter bw = new BufferedWriter(w);//由于是子类独有的功能,所有不能使用多态创建 bw.write("石原里美"); bw.newLine(); bw.write("工藤静香"); bw.newLine(); bw.flush(); 需要留意的地方是,在写文件的时候如果想要对文件进行追加操作,需要对Writer的对象设置true,而不是BufferedWriter的对象。
在学习转换流之前,我们应该要了解的是如果代码编码和文件编码如果不一致。使用字符流直接读取会造成乱码,因此我们需要代码编码和文件编码一致,才能保证不会乱码,而转换流的出现就是为了能够避免这种事情的发生的。
首先是对于乱码的问题提供一个简单的思路: 1、使用字符输入转换流; 2、可以提取文件(不同的编码)的原始字节流,原始字节不会存在问题; 3、将字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不会乱码了。 字符输入转换流:InputStreamReader,可以把原始字节流按照指定编码转换成字符输入流 构造器 说明 public InputStreamReader(InputStream is) 可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用 public InputStreamReader(InputStream is,String charset) 可以把原始的字节流按照指定指定编码转换成字符输入流,这样字符流中的字符就不乱码了 InputStream is = new FileInputStream("File//data.txt"); InputStreamReader isr = new InputStreamReader(is); InputStreamReader isr = new InputStreamReader(is,"GBK"); 在以上代码中,已知将data.txt文件的编码格式设置为GBK,而代码编码是utf-8,所以需要通过转换流将编码变为一致。而一种构造器默认utf-8,显然是不行的,第二种则是可以指定编码,将原始的字节输入流转换为字符输入流,并以GBK的形似进行读取。
字符输出转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流 构造器 说明 public OutputStreamWriter(OutputStream os) 可以把原始的字节输出流按照代码默认编码转换成字符输出流,几乎不用 public OutputStreamWriter(OutputStream os,String charset) 可以把原始的字节输出流按照指定的编码转换成字符输出流 首先我们应该知道字符输出转换流是为了应对哪些现实中的事情:假如你的客户智能编码为GBK的文件,那么你给他传过去一个utf-8的文件的话,文件是会乱码的,那么这个时候就需要我们传过去一个编码为GBK的文件。 OutputStream os = new FileOutputStream("File//data.txt"); Writer osw = new OutputStreamWriter(os); Writer osw = new OutputStreamWriter(os,"GBK"); 在以上代码中,第一种是默认utf-8的,所以是几乎不用的,而第二种则是可以指定客户需要的编码文件格式。
构造器 说明 public ObjectOutputStream(OutputStream os) 把低级字节输出流包装成高级的对象字节输出流 首先是简单的创建了一个学生类Student,需要注意的是Java规定对象序列化的时候,类需要实现Serializable接口。 public class Student implements Serializable { private String name; private int age; private String number; private String classroom; } 接下来则是实现对象的序列化的操作: Student s = new Student("石原里美",18,"001","智能一班"); OutputStream os = new FileOutputStream("File//data.txt"); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeObject(s); oos.close(); 另外如果不希望对象中的某个数据不参与序列化,则可以通过transient对其进行修饰,如“private transient String name”,执行该操作之后,对其进行反序列化的时候该数据会显示null。
构造器 说明 public ObjectInputStream(InputStream is) 把低级字节输入流包装成高级的对象字节输入流 方法名称 说明 public Object readObject() 把存储到磁盘文件中去的对象数据恢复成内存中的对象返回 InputStream is = new FileInputStream("File//data.txt"); ObjectInputStream ois = new ObjectInputStream(is); Object s = ois.readObject(); System.out.println(s); //输出结果: //Student{name='石原里美', age=18, number='001', classroom='智能一班'} 另外还有一个知识点,在定义类的时候,可以定义一个版本序列号,而在反序列号的时候,其序列号必须一致才可以正常的读取,如“private static final long serialVersionUID = 1;” 若在第一次序列化之后,将类中的版本序列号更改,在没有作第二次重新序列化之前,反序列化会出现报错的情况。
构造器 说明 public PrintStream(OutputStream os) 打印流直接通向字节输出流管道 public PrintStream(File f) 打印流直接通向文件对象 public PrintStream(String filepath) 打印流直接通向文件路径 方法名称 说明 public void print(Xxx xx) 打印任意类型的数据出去 //三种构造器的使用 PrintStream ps = new PrintStream("File//data01.txt"); PrintStream ps1 = new PrintStream(new File("File//data.txt")); PrintStream ps2 = new PrintStream(new FileOutputStream(new File("File//data.txt"))); ps.print(11); ps.print("凯里·欧文"); PrintStream和WriterStream的区别:
构造器 说明 void load (InputStream is) 从输入字节流读取属性列表(键值对) void load (Reader r) 从输入字符流读取属性列表(键值对) void store (OutputStream os,String comments) 将此属性列表(键值对)写入此Properties中,以适合于使用load(InputStream)方法的格式输出字节流 void store(Writer w,String comments) 将此属性列表(键值对)写入此Properties中,以适合于使用load(reader)方法的格式输出字符流 public Object setProperty(String key,String value) 保存键值对(put) public String getProperty(String key) 使用此属性列表中指定的键搜索属性值(get) public Set<String> stringPropertyNames() 所有键的名称的集合(keySet()) Properties properties = new Properties(); properties.setProperty("石原里美","18"); properties.setProperty("工藤静香","19"); properties.setProperty("朱茵","20"); System.out.println(properties); //第一个参数是文件存储路径,第二个是对文件的注释 properties.store(new FileWriter("File//Baby.properties"),"这些都是绝世美女,不接受反驳哈哈哈");
Properties properties = new Properties(); properties.load(new FileReader("File//Baby.properties")); System.out.println(properties); //输出结果: //{"石原里美"=18,"工藤静香"=19,"朱茵"=20}
创作不易,给个三连吧
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179928.html原文链接:https://javaforall.cn