您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

深入理解Java IO流

时间:2022-08-05 15:31:17  来源:  作者:Java开发技术分享

深入理解JAVA IO流

2022-08-05 09:04·Java开发技术分享

目录

1.字符输入流BufferedReader

2.字符输出流BufferedWriter

聾缓冲流

(1)带有缓冲区的字符输入流;使用这个流的时候 不需要自定义char数组 ,或者说不需要自定义byte数组;自带缓冲!

(2)读取数据时, 可以一次性读取一行

(3)这里只讲解字符缓冲流: java.io.BufferedReader 和 java.io.BufferedWriter ;字节缓冲流使用方法是一样的

(4)BufferedReader和BufferedWriter都是包装流!

1.字符输入流BufferedReader

package com.bjpowernode.java.io;import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;public class BufferedReaderTest01 {    public static void mAIn(String[] args) throws Exception {        FileReader reader = new FileReader("file");        // 当一个流的构造方法中需要一个流的时候,这个被传进来的流叫做:节点流。        // 外部负责包装的这个流,叫做:包装流或者叫做:处理流。        // FileReader就是一个节点流。BufferedReader就是包装流/处理流。        BufferedReader br = new BufferedReader(reader); // 只能传字符流        // 优点:一次能读一行;但不带换行符!        String s = null;        while((s = br.readLine()) != null){ // br.readLine()返回的是一个字符串            System.out.println(s);        }        // 关闭流,只需要关闭最外层流就行,里面的节点流会自动关闭。        br.close();    }}

2.字符输出流BufferedWriter

package com.bjpowernode.java.io;import java.io.*;public class BufferedWriterTest01 {    public static void main(String[] args) throws IOException {        // 创建带有缓冲区的字符输出流        BufferedWriter writer = new BufferedWriter(new FileWriter("file"));        // 开始写        writer.write("hello world!");        writer.write("n");        writer.write("hello kitty!");        // 刷新        writer.flush();        // 关闭最外层        writer.close();    }}

聾转换流

1.OutputStreamWriter

BufferedWriter:带有缓冲的字符输出流。OutputStreamWriter:转换流
package com.bjpowernode.java.io;import java.io.*;public class BufferedWriterTest01 {    public static void main(String[] args) throws IOException {        // 创建带有缓冲区的字符输出流        BufferedWriter writer = new BufferedWriter(new FileWriter("file"));        // 如果想要使用字节输出流,还是需要OutputStreamWriter进行流的转换        // 如果使用的是字节流        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("file"));        BufferedWriter writer1 = new BufferedWriter(osw);                // 合并在一起        BufferedWriter writer1 = new BufferedWriter(new OutputStreamWriter        (new FileOutputStream("file")));        // 开始写        writer.write("hello world!");        writer.write("n");        writer.write("hello kitty!");        // 刷新        writer.flush();        // 关闭最外层        writer.close();    }}

2.InputStreamReader

BufferedReader(reader),里面只能传字符流;那如果是字节流怎么办呢?

package com.bjpowernode.java.io;import java.io.*;public class BufferedReaderTest02 {    public static void main(String[] args) {        FileInputStream fis = null;        try {            // 字节流            fis = new FileInputStream("file");            // 通过转换流转换(InputStreamReader将字节流转换成字符流)            // fis是节点流。reader是包装流。            InputStreamReader reader = new InputStreamReader(fis);            // 把转换成字符流的字节流,传过来            // reader是节点流。br是包装流。            BufferedReader br = new BufferedReader(reader);            // 上面进行合并            BufferedReader br1 = new BufferedReader(new InputStreamReader(new FileInputStream("file")));            // 进行打印            String s = null;            while((s = br1.readLine()) != null){                System.out.println(s);            }            // 关闭            br.close(); // 关闭最外层        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        } finally {            if (fis != null) {                try {                    fis.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }}

聾数据流

1.DataOutputStream

(1)java.io.DataOutputStream:数据专属的流;也是一个包装流!

(2)这个流可以 将数据连同数据的类型一并写入文件 。

(3)注意:这个文件不是普通文本文档。(这个文件使用记事本打不开)

package com.bjpowernode.java.io;import java.io.DataOutputStream;import java.io.FileOutputStream;public class DataOutputStreamTest01 {    public static void main(String[] args) throws Exception{        // 创建数据专属的字节输出流(写)        DataOutputStream dos = new DataOutputStream(new FileOutputStream("file")); //生成的这个文件,记事本打不开        // 写数据        byte b = 100;        short s = 200;        int i = 300;        long l = 400L;        float f = 3.0F;        double d = 3.14;        boolean sex = false;        char c = 'a';        // 写;把数据以及数据的类型一并写入到文件当中       dos.writeByte(b);       dos.writeShort(s);       dos.writeInt(i);       dos.writeLong(l);       dos.writeFloat(f);       dos.writeDouble(d);       dos.writeBoolean(sex);       dos.writeChar(c);        // 刷新        dos.flush();                // 关闭最外层        dos.close();    }}

2.DataInputStream

(1)DataInputStream:数据字节输入流。

(2)DataOutputStream写的文件,只能使用DataInputStream去读。并且读的时候你需要提前知道写入的顺序;读的顺序需要和写得顺序一致。才可以正常取出数据 

package com.bjpowernode.java.io;import java.io.DataInputStream;import java.io.FileInputStream;public class DataInputStreamTest01 {    public static void main(String[] args) throws Exception {        // 创建数据专属的字节输入流(读)        DataInputStream dis = new DataInputStream(new FileInputStream("file"));        // 开始读        byte b = dis.readByte();        short s = dis.readShort();        int i = dis.readInt();        long l = dis.readLong();        float f = dis.readFloat();        double d = dis.readDouble();        boolean sex = dis.readBoolean();        char c = dis.readChar();        // 打印        System.out.println(b);        System.out.println(s);        System.out.println(i);        System.out.println(l);        System.out.println(f);        System.out.println(d);        System.out.println(sex);        System.out.println(c);        // 关闭流        dis.close();    }}

聾标准输出流

1.PrintStream

(1)jva.io.PrintStream:标准的字节输出流。默认输出到控制台。

(2)标准输出流 不需要手动close()关闭 。

(3)可以 通过System.setOut()方法改变输出流的方向

package com.bjpowernode.java.io;import java.io.FileOutputStream;import java.io.PrintStream;public class PrintStreamTest {    public static void main(String[] args) throws Exception {        System.out.println("hello world");        // 实际上上述代码可以拆分成        PrintStream ps = System.out;        ps.println("hello world");        // 可以改变标准输出流的输出方向;        // 例如:标准输出流不在指向控制台,指向log文件        PrintStream printStream = new PrintStream(new FileOutputStream("log"));        // 修改输出方向        System.setOut(printStream);        // 输出        System.out.println("Hello World"); //不会再输出到控制台,而是到log文件    }}

2.日志工具类

那么标准输出流PrintStream有什么用呢?我们不妨写一个简单的日志工具类!

日志框架

package com.bjpowernode.java.io;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.PrintStream;import java.text.SimpleDateFormat;import java.util.Date;// 日志工具public class Logger {    // 记录日志的方法   public static void log(String msg) {       try {           PrintStream out = new PrintStream(new FileOutputStream("log.txt",true));           // 改变流的方向           System.setOut(out);           // 获取系统当前时间           Date nowDate = new Date();           // 格式类型转换           SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");           String myNowdate = sdf.format(nowDate);           // 打印           System.out.println(myNowdate+":"+msg);       } catch (FileNotFoundException e) {           e.printStackTrace();       }   }}

日志测试

package com.bjpowernode.java.io;public class LoggerTest {    public static void main(String[] args) {        // 测试日志工具类        Logger.log("调用了System类的gc()方法,建议启动垃圾回收");        Logger.log("调用了UserService的doSome()方法");        Logger.log("用户尝试进行登录,验证失败");        // 在log.txt打印的结果       /* 2022-07-22 08:47:49 667:调用了System类的gc()方法,建议启动垃圾回收        2022-07-22 08:47:49 703:调用了UserService的doSome()方法        2022-07-22 08:47:49 714:用户尝试进行登录,验证失败*/    }}

聾File类的理解

java.io.File

1、File类和四大家族没有关系,所以File类不能完成文件的读和写。

2、File对象代表什么?

文件和目录路径名的抽象表示形式。

C:Drivers 这是一个File对象

C:DriversLanRealtekReadme.txt 也是File对象。

一个File对象有可能对应的是目录,也可能是文件 ;File只是一个路径名的抽象表示形式; 不能通过File完成文件的读和写

1.常用方法1

(1) exists() 方法:判断当前文件是否存在

(2) creatNewFile() 方法:以文件的形式创建出来

(3) mkdir() 方法:以目录的形式创建出来; 创建多重目录mkdirs() 方法

(4)获取当前文件的父路径:

方法1: 使用 getParent() ,返回的是一个 String

方法2:使用 getParentFile()

,返回的是一个

File

;和上面效果是一样的

(5) getAbsolutePath() 方法:获取当前文件的绝对路径

package com.bjpowernode.java.io;import java.io.File;public class FileTest01 {    public static void main(String[] args) throws Exception {        // 创建File对象        File f1 = new File("D:\file");        // 1、判断当前文件是否存在;exists()方法        System.out.println(f1.exists()); // false        // 2、如果D:file不存在,则以文件的形式创建出来;createNewFile()方法        if (!f1.exists()) {            f1.createNewFile();        }        // 3、如果D:file不存在,则以目录的形式创建出来;mkdir()方法        if (!f1.exists()) {            f1.mkdir();        }        // 4、创建多重目录;mkdirs()方法        File f2 = new File("D:/a/b/c/d");        if (!f2.exists()) {            f2.mkdirs();        }        // 5、获取当前文件的父路径        File f3 = new File("D:\Python/ target=_blank class=infotextkey>Python学习\PyCharm Community Edition 2021.2.2");        // 第一种:使用getParent(),返回的是一个String        String parentPath = f3.getParent();        System.out.println(parentPath); // D:python学习        // 第二种:使用getParentFile(),返回的是一个File;效果是一样的        File parentFile = f3.getParentFile();        System.out.println(parentFile); // D:python学习        // 6、获取当前文件的绝对路径        File f4 = new File("file");        System.out.println(f4.getAbsolutePath()); // C:Users86177IdeaProjectsJavaSe1file    }}

2.常用方法2

(1) getName() :获取当前文件的名字

(2) isDirectory() :判断是否是一个目录

(3) isFile() :判断是否是一个文件

(4) lastModified() :获取文件最后一次修改时间;得到的是毫秒数,返回long型

(5) length() :获取文件大小,结果是字节

package com.bjpowernode.java.io;import java.io.File;import java.text.SimpleDateFormat;import java.util.Date;public class FileTest02 {    public static void main(String[] args) {        File  f1 = new File("C:\Java学习\javaSE学习\2.1JavaSE进阶笔记\javase\Copy02.java");        // 1、获取文件名,getName()方法        System.out.println("文件名:"+f1.getName()); // 文件名:Copy02.java        // 2、判断是否是一个目录,isDirectory()方法        System.out.println(f1.isDirectory()); // false        // 3、判断是否是一个文件,isFile()方法        System.out.println(f1.isFile()); // true        // 4、获取文件最后一次修改时间,lastModified()方法        // 得到的是毫秒数        long modifytTime = f1.lastModified();        // 将总毫秒数转换成日期        Date date = new Date(modifytTime);        // 格式化        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");        System.out.println(sdf.format(date)); //2020-03-11 14:35:46 154        // 5、获取文件大小,length()方法        System.out.println(f1.length()); //1490 字节            }}

3.listFiles方法

File中的 listFiles方法 ; 获取当前目录下所有的子文件 ; 返回的是一个File[]数组

package com.bjpowernode.java.io;import java.io.File;public class FileTest03 {    public static void main(String[] args) {        File f = new File("C:\Java学习\javaSE学习\2.1JavaSE进阶笔记\javase\chapter15\src");        // 调用listFiles()方法,返回的是一个File[]数组        File[] files = f.listFiles();        // 用增强for循环打印        for(File file :files){            System.out.println(file.getAbsolutePath()); // 获取所有子目录的绝对路径            System.out.println(file.getName()); //获取所有子目录的文件名        }    }}

结束语

今天的分享就到这里啦!



Tags:IO流   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Java IO流操作大揭秘:文件读写与网络通信
Java的IO流是进行文件读写和网络通信的关键组件,它提供了丰富的类和方法来处理输入输出操作。下面将揭秘Java IO流的使用方法和原理,详细介绍文件读写和网络通信的实现。一、...【详细内容】
2023-08-25  Search: IO流  点击:(266)  评论:(0)  加入收藏
深入探究Java IO流:基础知识、流类型及使用方法
Java IO(输入/输出)流是Java中最重要的API之一。它允许我们在程序中读写数据,并提供了一种灵活的方式来管理不同类型的数据源和目的地。在本文中,我们将深入探讨Java IO流的基础...【详细内容】
2023-04-14  Search: IO流  点击:(300)  评论:(0)  加入收藏
一文带你了解javaIO流
一、IO流,什么是IO I:InputO:Ouput通过io可以完成硬盘文件的读写操作,就可以称作输入流和输出流 二、IO流的分类 JAVA中的IO操作主要依赖java.io包来实现,Java.io 包几乎包含了所...【详细内容】
2022-09-13  Search: IO流  点击:(384)  评论:(0)  加入收藏
深入理解Java IO流
深入理解Java IO流2022-08-05 09:04·Java开发技术分享目录1.字符输入流BufferedReader2.字符输出流BufferedWriter聾缓冲流(1)带有缓冲区的字符输入流;使用这个流的时候...【详细内容】
2022-08-05  Search: IO流  点击:(602)  评论:(0)  加入收藏
Java中的File类和IO流
Flie类1.什么是File类File类就是当前系统中,文件或文件夹的抽象表示。通过使用File类的实例对象,我们就可以通过代码实现计算机的文件控制,即文件的增删改查等操作。2.File类的...【详细内容】
2022-06-21  Search: IO流  点击:(455)  评论:(0)  加入收藏
java-IO流
从数据来源或者说是操作对象角度看,IO 类可以分为:1、文件:FileInputStream、FileOutputStream、FileReader、FileWriter2、数组: ByteArrayInputStream、ByteArrayOutputStrea...【详细内容】
2019-11-12  Search: IO流  点击:(500)  评论:(0)  加入收藏
史上最骚最全最详细的IO流教程,没有之一
前言 io流用到的地方很多,就比如上传下载,传输,设计模式等....基础打扎实了,才能玩更高端的。在博主认为真正懂IO流的优秀程序员每次在使用IO流之前都会明确分析如下四点:(1)明确要...【详细内容】
2019-11-04  Search: IO流  点击:(598)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(18)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(25)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(34)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(63)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(78)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(78)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(100)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(111)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(108)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(82)  评论:(0)  加入收藏
站内最新
站内热门
站内头条