第十四话-JavaIO框架
2022/4/23 11:42:34
本文主要是介绍第十四话-JavaIO框架,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
流
分类:
-
按单位:
- 字节流:以字节为单位,可以读写所有数据
- 字符流:以字符为单位,只能读写文本数据
-
按功能:
- 节点流:具有实际传输数据的读写功能。
- 过滤流:在节点流的基础之上增强功能
字节流:
字节流的父类(抽象类):
- InputStream:字节输入流
- FileInputStream:public int read(byte[] b)//从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数;如果达到文件的尾部,则返回-1。
- OutputStream:字节输出流
- FileOutputStream:public void write(byte[] b)//一次写多个字节,将b数组中的所有字节,写入输出流。
字节流
FileInputStream类
package com.xie.io; import java.io.FileInputStream; public class Demo01 { public static void main(String[] args) throws Exception { //1.创建FileInputStream,并指定文件路径 FileInputStream fis = new FileInputStream("D:\\java基础\\测试文件\\FileInputStream.txt"); //2.读取文件,单个字节读取 // int data = 0; // while((data=fis.read())!=-1){ // System.out.println((char)data); // } //定义一次读取长度 byte[] buf = new byte[1024]; int count = 0; while ((count=fis.read(buf))!=-1){ System.out.println(count); System.out.println(new String(buf,0,count)); } fis.close(); System.out.println("执行结束"); } }
FileOutputStream类
package com.xie.io; import java.io.FileOutputStream; import java.nio.charset.StandardCharsets; public class Demo02 { public static void main(String[] args) throws Exception { //FileOutputStream构造方法第二个参数为true,则增量输出,不会覆盖原来的内容 FileOutputStream fos = new FileOutputStream("D:\\java基础\\测试文件\\FileOuputStream.txt",true); //单个字符输出 // fos.write(97); // fos.write('b'); // fos.write('c'); String str = "Hello World!"; fos.write(str.getBytes()); fos.close(); System.out.println("执行完毕1"); } }
字节流复制文件
package com.xie.io; import java.io.FileInputStream; import java.io.FileOutputStream; public class Demo03 { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream("D:\\test.png"); FileOutputStream fos = new FileOutputStream("D:\\test2.png"); byte[] buf = new byte[1024]; int count = 0; while ((count=fis.read(buf))!=-1){ fos.write(buf,0,count); } fis.close(); fos.close(); System.out.println("执行完毕"); } }
缓冲流
BufferedInputStream/BufferedOutputStream
- 提高IO效率,减少访问磁盘的次数
- 数据存储在缓冲区中,flush是将缓存区的内容写入文件中,也可以直接close
BufferedInputStream代码:
package com.xie.io; import java.io.BufferedInputStream; import java.io.FileInputStream; public class Demo04 { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream("D:\\FileInputStream.txt"); BufferedInputStream bis = new BufferedInputStream(fis); // int data = 0; // while ((data=bis.read())!=-1){ // System.out.println((char)data); // } byte[] buf = new byte[1024]; int count = 0; while ((count=bis.read(buf))!=-1){ System.out.println(new String(buf,0,count)); } bis.close(); } }
BufferedOutputStream代码:
package com.xie.io; import java.io.BufferedOutputStream; import java.io.FileOutputStream; public class Demo05 { public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("D:\\buffer.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos); for (int i = 0; i < 10; i++) { bos.write("helloWorld!\r\n".getBytes()); bos.flush();//刷新到硬盘 } //关闭(会内部调用flush方法) bos.close(); } }
对象流
ObjectInputStream/ObjectOutputStream
- 增强了缓冲区功能
- 增强了读写8种基本数据类型和字符串功能
- 增强了读写对象的功能:readObject()从流中读取一个对象
writeObject(Objcet obj)向流中写入一个对象
- 使用流传输对象的过程称为序列化(将对象写到硬盘)、反序列化(从硬盘读到内存)。
序列化-ObjectOutputStream
package com.xie.io; import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class Demo06 { public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("D:\\stu.bin"); ObjectOutputStream oos = new ObjectOutputStream(fos); //Student必须实现Serializable接口,作为标记可以序列化 Student stu1 = new Student("ZHANGSAN",33); oos.writeObject(stu1); oos.close(); System.out.println("执行完毕"); } } package com.xie.io; import java.io.Serializable; public class Student implements Serializable { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
反序列化-ObjectInputStream
package com.xie.io; import java.io.FileInputStream; import java.io.ObjectInputStream; public class Demo07 { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream("D:\\stu.bin"); ObjectInputStream ois = new ObjectInputStream(fis); Student s = (Student)ois.readObject(); ois.close(); System.out.println("执行完毕"); System.out.println(s.toString()); } }
注意事项:
- 序列化类必须实现Serializable接口
- 序列化类中对象属性要求实现Serializable接口
- 序列化版本号ID,保证序列化的类和反序列化的类是同一个类
private static final long serialVersionUID = 100L;
- 使用transient(瞬间的)修饰属性,这个属性不能序列化
- 静态属性不能序列化
- 可以序列化多个对象,通过集合实现
字符流
字符编码
- ISO-8859-1 收录除ASCII 外,还包括西欧等对应的文字符号
- UTF-8 针对Unicode码表的可变长度字符编码,一个汉字3个字节
- GB2312 简体中文
- GBK 简体中文,扩充
- BIG5 台湾,繁体中文
编码与解码方式不一致,会出现乱码
字符流抽象类
字节流读取汉字,按照字节读取并解析,但是一个汉字三个字节,解析乱码
Reader:字符输入流
- public int read(){}
- public int read(char[] c){}
- public int read(char[] b,int off,int len){}
Writer:字符输出流
- public void write(int n){}
- public void write(String str){}
- public void write(char[] c){}
FileReader
package com.xie.io; import java.io.FileReader; public class Demo08 { public static void main(String[] args) throws Exception{ FileReader fr = new FileReader("D:\\buffer.txt"); int data = 0; while ((data = fr.read()) != -1){//读取一个字符 System.out.print((char)data); } fr.close(); System.out.println("----------------"); FileReader fr2 = new FileReader("D:\\buffer.txt"); int count = 0; char[] buf =new char[3]; while ((count = fr2.read(buf)) != -1){//读取buf的长度,赋值给buf,位置赋值给count System.out.println(new String(buf,0,count)); } fr2.close(); } }
FileReader
package com.xie.io; import java.io.FileWriter; public class Demo09 { public static void main(String[] args) throws Exception { FileWriter fr = new FileWriter("D:\\buffer.txt"); for (int i = 0; i < 10; i++) { fr.write("java是好语言\r\n"); fr.flush(); } fr.close(); System.out.println("执行完毕"); } }
字符流复制
package com.xie.io; import java.io.FileReader; import java.io.FileWriter; public class Demo10 { public static void main(String[] args) throws Exception{ //字符流实现文件复制,只能复制文本文件 FileReader fr = new FileReader("D:\\buffer.txt"); FileWriter fw = new FileWriter("D:\\buffer2.txt"); int data = 0; while ((data = fr.read()) != -1){ fw.write(data); fw.flush(); } fr.close(); fw.close(); System.out.println("执行完毕"); } }
字符缓冲流
BufferedReader/BufferedWriter
- 高校读写
- 支持输入换行符
- 可一次读写一行
BufferedReader
package com.xie.io; import com.xie.oop.demo03.B; import java.io.BufferedReader; import java.io.FileReader; public class Demo11 { public static void main(String[] args) throws Exception{ FileReader fr = new FileReader("D:\\buffer.txt"); BufferedReader br = new BufferedReader(fr); char[] buf = new char[1024]; int count = 0; while ((count = br.read(buf)) != -1){ System.out.println(new String(buf,0,count)); } br.close(); System.out.println("--------"); FileReader fr2 = new FileReader("D:\\buffer.txt"); BufferedReader br2 = new BufferedReader(fr2); String line = null; while ((line=br2.readLine()) != null){ System.out.println(line); } br2.close(); } }
BufferedWriter
package com.xie.io; import java.io.BufferedWriter; import java.io.FileWriter; public class Demo12 { public static void main(String[] args) throws Exception{ FileWriter fw = new FileWriter("D:\\buffer.txt"); BufferedWriter bw = new BufferedWriter(fw); for (int i = 0; i < 10; i++) { bw.write("好好学习"); bw.newLine(); bw.flush(); } bw.close(); System.out.println("执行完毕"); } }
PrintWriter
-
封装了print()、println()方法,支持写入后换行。
-
支持数据原样打印
package com.xie.io; import java.io.PrintWriter; public class Demo13 { public static void main(String[] args) throws Exception{ PrintWriter pw = new PrintWriter("D:\\buffer.txt"); pw.println(97); pw.println(true); pw.println(3.14); pw.println('a'); pw.close(); System.out.println("执行完毕"); } }
转换流
- 桥转换流:InputStreamReader/OutputStreamWriter
- 可将字节流转换为字符流
- 可设置字符的编码方式
package com.xie.io; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class Demo14 { public static void main(String[] args) throws Exception{ FileInputStream fi = new FileInputStream("D:\\buffer2.txt"); InputStreamReader isr = new InputStreamReader(fi,"utf-8"); int data = 0; while ((data = isr.read()) != -1) { System.out.print((char)data); } isr.close(); System.out.println("------------------"); FileOutputStream fo = new FileOutputStream("D:\\buffer.txt"); OutputStreamWriter osw = new OutputStreamWriter(fo,"gbk"); for (int i = 0; i < 5; i++) { osw.write("niho你好\r\n"); osw.flush(); } osw.close(); System.out.println("执行完毕"); } }
File类
文件、文件夹操作
package com.xie.io; import java.io.File; import java.util.Date; public class Demo15 { public static void main(String[] args) throws Exception{ //separator(); //fileOpe(); dirOpe(); } //分隔符 public static void separator(){ System.out.println("路径分隔符" + File.pathSeparator); System.out.println("名称分隔符" + File.separator); } //文件操作 public static void fileOpe() throws Exception{ //1.创建文件 File file = new File("D:\\buffer.txt"); //System.out.println(file.toString()); if(!file.exists()){ boolean b = file.createNewFile(); System.out.println("创建结果:" + b); } //2.1删除文件 //System.out.println("删除结果:" + file.delete()); //2.2使用jvm退出时删除 // file.deleteOnExit(); // Thread.sleep(5000); //3获取文件信息 System.out.println("获取文件的绝对路径" + file.getAbsolutePath()); System.out.println("获取路径" + file.getPath()); System.out.println("获取文件名称" + file.getName()); System.out.println("获取文件长度" + file.length()); System.out.println("获取文件父目录" + file.getParent()); System.out.println("文件创建时间" + new Date(file.lastModified()).toLocaleString()); //4判断 System.out.println("是否可写:" + file.canWrite()); System.out.println("是否是文件" + file.isFile()); System.out.println("是否隐藏" + file.isHidden()); } //文件夹操作 public static void dirOpe() throws Exception{ //1.创建文件夹 File dir = new File("D:\\aaa\\bbb\\ccc"); System.out.println(dir.toString()); if(!dir.exists()){ //dir.mkdir();//只能创建单级目录 System.out.println("创建结果:" + dir.mkdirs());//创建多级目录 } //2.删除文件夹,注:只能删除单个文件夹。只能删除空文件夹 //System.out.println("删除结果:" + dir.delete());//直接删除 //dir.deleteOnExit();//使用jvm删除 //Thread.sleep(5000); //3.获取文件夹信息 System.out.println("获取绝对路径:" + dir.getAbsolutePath()); System.out.println("获取路径:" + dir.getPath()); System.out.println("获取文件夹名称:" + dir.getName()); System.out.println("获取父目录:" + dir.getParent()); System.out.println("获取创建时间:" + new Date(dir.lastModified()).toLocaleString()); //4.判断 System.out.println("是否是文件夹:" + dir.isDirectory()); System.out.println("是否隐藏" + dir.isHidden()); //5.遍历文件夹 File dir2 = new File("D:\\apache-tomcat-9.0"); String[] files = dir2.list(); for (String file : files) { System.out.println(file); } } }
FileFilter接口
-
public interface FileFilter
- boolean accept (File pathname)
-
当调用File类中的listFiles()方法时,支持传入FileFilter接口实现类,对获取文件进行过滤,只有满足条件的文件才可出现在listFiles()的返回值中。
package com.xie.io; import java.io.File; import java.io.FileFilter; public class Demo16 { public static void main(String[] args) { File dir2 = new File("D:\\apache-tomcat-9.0"); File[] files = dir2.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if(pathname.getName().endsWith(".txt")){ return true; } return false; } }); for (File file : files) { System.out.println(file.getName()); } } }
递归遍历、删除
package com.xie.io; import java.io.File; public class Demo17 { public static void main(String[] args) { listDir(new File("D:\\BaiduNetdiskDownload")); deleteDir(new File("D:\\aaa")); } //遍历文件夹 public static void listDir(File dir){ File[] files = dir.listFiles(); System.out.println(dir.getAbsolutePath()); if(files != null && files.length> 0 ){ for (File file : files) { if(file.isDirectory()){ listDir(file); }else { System.out.println(file.getAbsolutePath()); } } } } //遍历删除文件夹 public static void deleteDir(File dir){ File[] files = dir.listFiles(); if(files != null && files.length> 0 ){ for (File file : files) { if(file.isDirectory()){ deleteDir(file); }else { System.out.println(file.getAbsolutePath()+"--删除:"+file.delete()); } } } System.out.println(dir.getAbsolutePath()+"删除:"+dir.delete()); } }
Properties
-
Properties:属性集合
-
特点:
- 存储属性名和属性值
- 属性名和属性值都是字符串类型
- 没有泛型
- 和流有关
package com.xie.io; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.PrintWriter; import java.util.Properties; import java.util.Set; public class Demo18 { public static void main(String[] args) throws Exception{ Properties properties = new Properties(); properties.setProperty("username","zhangsan"); properties.setProperty("age","33"); System.out.println(properties); //遍历 //1.keySet遍历 //2.entrySet遍历 //3.stringPropertyNames()遍历 Set<String> pronames = properties.stringPropertyNames(); for (String proname : pronames) { System.out.println(proname+"----"+properties.getProperty(proname)); } //和流有关的方法 //1. list()打印 PrintWriter pw = new PrintWriter("d:\\print.txt"); properties.list(pw); pw.close(); //2. store()保存 FileOutputStream fos = new FileOutputStream("d:\\store.properties"); properties.store(fos,"zhushi"); fos.close(); //3. load()加载 Properties properties1 = new Properties(); FileInputStream fis = new FileInputStream("d:\\store.properties"); properties1.load(fis); fis.close(); System.out.println(properties1); } }
这篇关于第十四话-JavaIO框架的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程
- 2024-11-26Springboot单体架构搭建资料详解与实战教程
- 2024-11-26Springboot框架资料:新手入门教程
- 2024-11-26Springboot企业级开发资料入门教程
- 2024-11-26SpringBoot企业级开发资料详解与实战教程
- 2024-11-26Springboot微服务资料:新手入门全攻略