• 【java筑基】IO流基础之文件的常见操作


    前 言
    🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端
    ☕专栏简介:深入、全面、系统的介绍java的基础知识
    🌰 文章简介:本文将深入全面介绍IO流知识,建议收藏备用,创作不易,敬请三连哦
    🍎大厂真题:大厂面试真题大全

    1.File类

    1.1 访问文件和目录

    File类用于新建、删除、重命名文件或者目录,但不能够访问其内容,访问内容需要使用输入/输出流。File类用路径字符串来创建File实例,路径可以是绝对或相对路径,系统通过用户的工作路径来解释相对路径(通常为运行Java虚拟机是所在的路径)。

        public class FileTest {
        	public static void main(String[] args) throws IOException {
        		// 以当前路径来创建一个File对象
        		File file = new File(".");
        		// .
        		System.out.println(file.getName());
        		// 获取相对路径的父路径,null
        		System.out.println(file.getParent());
        		// E:\javaworkplace\20210509\.
        		System.out.println(file.getAbsolutePath());
        		// E:\javaworkplace\20210509
        		System.out.println(file.getAbsoluteFile().getParent());
        		// 当前路径下创建一个临时文件
        		File tmpFile = File.createTempFile("aaa", ".txt", file);
        		// delete when JVM exit
        		tmpFile.deleteOnExit();
        		File newFile = new File(System.currentTimeMillis() + "");
        		// Does new File exists:false
        		System.out.println("Does new File exists:" + newFile.exists());
        		newFile.createNewFile();
        		// Does new File exists:true
        		System.out.println("Does new File exists:" + newFile.exists());
        		// newFile exists,can't use newFile to generate dictory, return false.
        		System.out.println(newFile.mkdir());
        		String[] fileList = file.list();
        		System.out
        				.println("==all files and dictories under contemporary path==");
        		for (String fileName : fileList) {
        			System.out.println(fileName);
        		}
        		File[] roots = File.listRoots();
        		System.out.println("==all system root path==");
        		// C:\
        		// D:\
        		// E:\
        		for (File root : roots) {
        			System.out.println(root);
        		}
        	}
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    1.2 文件过滤器

    File类的List()方法可以接受一个FilenameFilter参数,通过该参数可以对文件过滤。

        public class FilenamFilterTest {
        	public static void main(String[] args) {
        		File file = new File(".");
        		String[] nameList = file.list((dir, name) -> name.endsWith(".java")
        				|| new File(name).isDirectory());
        		//list all java file and directories under contemporary path 
        		for (String name : nameList) {
        			System.out.println(name);
        		}
        	}
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.输入流InputStream和Reader

    java把输入/输出源称为流。流可分为输入流(只能从中读取数据)和输出流(只能向其写入数据)。输入、输出都是站在内存的角度来划分的,比如从程序运行所在内存写数据到磁盘,通常称为输出流。流又可分为字节流(所操作的数据单元是8位字节)、字符流(所操作的数据单元位16位字符)。流还可分为节点流和处理流,节点流和数据源直接相连,处理流将已存在的流根据数据源类型进行封装,可以采用相同的输入/输出代码访问不同的数据源。处理流还可提供缓存提高输入、输出效率,允许批量输入、输出数据。

    InputStream和Reader是所有输入流的基类,它们分别有两个对应的实现类:FileInputStream,FileReader。

        public class FileInputStreamTest {
        	public static void main(String[] args) throws IOException {
        		FileInputStream fis = new FileInputStream("E:/wz.txt");
        		byte[] buff = new byte[1024];
        		int hasRead = 0;
        		// while read end,read() return -1
        		while ((hasRead = fis.read(buff)) > 0) {
        			System.out.print(new String(buff, 0, hasRead));
        		}
                //I/O resource is not internal memory,as a result,it can not collection by GC
        		fis.close();
        	}
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    IO资源需要手动进行关闭,java7对其进行了改进,可以通过try语句对其进行自动关闭。

        public class FileReaderTest {
        	public static void main(String[] args) throws IOException {
        		try (FileReader fr = new FileReader("E:/wz.txt")) {
        			char[] buff = new char[1024];
        			int hasRead = 0;
        			while ((hasRead = fr.read(buff)) > 0) {
        				System.out.println(new String(buff, 0, hasRead));
        			}
        
        		} catch (IOException ex) {
        			ex.printStackTrace();
        		}
        	}
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.输出流OutputStream和Writer

    OutputStream和Writer也很类似,其中Writer是以字节作为数据传输单位,允许使用String作为参数。
    ​```java
    public class FileOutputTest {
    public static void main(String[] args) {
    try (FileInputStream in = new FileInputStream(
    “src/inputandoutput/FileOutputTest.java”);
    FileOutputStream out = new FileOutputStream(“newFile.txt”)) {
    byte[] buff = new byte[1024];
    int hasRead = 0;
    while ((hasRead = in.read(buff)) > 0) {
    out.write(buff, 0, hasRead);
    }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果想要直接输出字符串的内容,使用Writer会有更好的效果。 ​java
    public class FileWriterTest {
    public static void main(String[] args) {
    try (FileWriter fw = new FileWriter(“fw.txt”)) {
    fw.write(“我是鸭鸭\r\n”);
    fw.write(“I can fly!”);

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ​```

    4.处理流

    只使用节点流操作数据比较繁琐,可以借助处理流解决这一问题。处理流只关心输入,输出功能,节点流与底层的IO设备,文件进行交互。识别节点流、处理流很简单,只要构造器参数是一个直接的物理IO节点,它就是节点流,如果构造器参数是一个已经存在的流,那么它就是处理流。

        public class PrintStreamTest {
        	public static void main(String[] args) {
        		try (FileOutputStream out = new FileOutputStream("test.txt");
        				PrintStream ps = new PrintStream(out)) {
        			ps.println("normal string");
        			ps.println(new PrintStreamTest());
        		} catch (IOException e) {
        			e.printStackTrace();
        		}
        	}
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    上面用处理流PrintStream打印了一个PrintStreamTest()对象,PrintStream的功能很强大,我们常用的System.out的类型就是PrintStream.在使用了处理流后,关闭输入,输出资源只需关闭最上层的处理流,被该处理流包装的节点流会被系统自动关闭。

    5.IO流体系举例:StringReader、StringWriter

    由于计算机中的数据都是二进制的,通常来说字节流比字符流功能更加强大,但对于文本文件使用字节流还需考虑怎么用合适的方式把字节转换为字符。因此对于文本文件一般采用字符流,对于二进制内容输入输出通常采用字节流。Java中有各种输入/输出流,下面程序演示了一种把字符串作为物理节点的输入/输出流的用法。

        public class StringNodeTest {
        	public static void main(String[] args) {
        		String src = "从明天起,做一个幸福的人\n" + "喂马、劈柴、周游世界\n" + "我有一所房子,面朝大海,春暖花开\n"
        				+ "告诉它们我的幸福";
        		char[] buffer = new char[32];
        		int hasRead = 0;
        		try (StringReader sr = new StringReader(src)) {
        			while ((hasRead = sr.read(buffer)) > 0) {
        				System.out.println(new String(buffer, 0, hasRead));
        			}
        		} catch (IOException e) {
        			e.printStackTrace();
        		}
        		try (StringWriter sw = new StringWriter()) {
        			sw.write("有一个姑娘");
        			sw.write("它有一些任性");
        			System.out.println(sw.toString());
        		} catch (IOException e) {
        			e.printStackTrace();
        		}
        	}
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22


    这篇文章就介绍到这里了。

    “工欲善其事,必先利其器”。要想成为工作上的高手,面试时的题霸,独步江湖,就必须拿到一份"武林秘籍"。
    在这里插入图片描述
    我个人强推牛客网:找工作神器|大厂java面经汇总|超全笔试题库

    推荐理由:
    1.刷题题库,题目特别全面,刷爆笔试再也不担心
    在这里插入图片描述
    链接: 找工作神器|大厂java面经汇总|超全笔试题库
    2.超全面试题、成体系、高质量,还有AI模拟面试黑科技
    在这里插入图片描述
    链接: 工作神器|大厂java面经汇总|超全笔试题库
    3.超多面经,大厂面经很多
    在这里插入图片描述
    4.内推机会,大厂招聘特别多
    在这里插入图片描述
    链接: 找工作神器|大厂java面经汇总|超全笔试题库
    5.大厂真题,直接拿到大厂真实题库,而且和许多大厂都有直接合作,题目通过率高有机会获得大厂内推资格。
    在这里插入图片描述
    链接: 找工作神器|大厂java面经汇总|超全笔试题库

  • 相关阅读:
    SpringCloud怎么迈向云原生?
    Java源码项目基于springboot的江理工文档管理系统的设计与实现
    【跟小嘉学 Rust 编程】二十九、Rust 中的零拷贝序列化解决方案(rkyv)
    坚持每天写代码,真的能提高编程水平吗?
    台湾省应广科技PMS150G(PADAUK )纯I/O口单片机系列
    算法:轮转数组---循环取模运算
    【信息系统项目管理师】--【信息技术发展】--【现代化创新发展】--【大数据】
    视频号视频怎么保存?教你三种方法
    IO模型概述
    Linux 系统IO函数
  • 原文地址:https://blog.csdn.net/qq_41708993/article/details/126003173