JAVA基础 IO流技术学习笔记 3

简介: JAVA基础 IO流技术学习笔记

8.3.3 字符输出流

package cn.it.bz.IO;
import java.io.IOException;
import java.io.PrintWriter;
public class TestPrintWriter {
    public static void main(String[] args) {
        //创建字符流输出对象
        try(PrintWriter printWriter = new PrintWriter("D:/a.txt")) {
            printWriter.print("Java");//不换行
            printWriter.print("百战");
            printWriter.println("sxt");//换行
            printWriter.println("哈哈哈");
            printWriter.flush();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

小练习:通过字符输出流添加行号

package cn.it.bz.IO;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
public class TestLineNumber3 {
    public static void main(String[] args) {
        try(
                //读入一行数据数据
                BufferedReader bufferedReader = new BufferedReader(new FileReader("D:/a.txt"));
                //输出数据
                PrintWriter printWriter = new PrintWriter("D:/a1.txt")) {
            int i = 1;
            String s = "";
            while ((s = bufferedReader.readLine()) != null){
                printWriter.println(i+"、"+s);
                i++;
            }
            //释放资源
            printWriter.flush();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

8.4  数据流

数据流将“基本数据类型与字符串类型”作为数据源,从而允许程序以与机器无关的方式从底层输入输出流中操作Java基本数据类型与字符串类型。数据流是处理流,不是节点流,而且只能处理文件字节流,不能处理文件字符流。

package cn.it.bz.IO;
import com.sun.org.apache.xerces.internal.impl.dv.dtd.IDREFDatatypeValidator;
import java.io.*;
public class TestDataOutputStream {
    public static void main(String[] args) {
        //先向文件写数据,在从文件获取数据。
        try(DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("D:/a.txt"));
            DataInputStream dataInputStream = new DataInputStream(new FileInputStream("d:/a.txt"))
        ) {
            //将如下数据写到文件
            dataOutputStream.writeChar('张');
            dataOutputStream.writeUTF("输出字符串");
            dataOutputStream.writeInt(123);
            dataOutputStream.writeDouble(Math.random());
            dataOutputStream.writeBoolean(true);
            dataOutputStream.flush();
            //读取顺序需要和写入顺序一样才行
            System.out.println(dataInputStream.readChar());
            System.out.println(dataInputStream.readUTF());
            System.out.println(dataInputStream.readInt());
            System.out.println(dataInputStream.readDouble());
            System.out.println(dataInputStream.readBoolean());
        }catch (IOException E){
            E.printStackTrace();
        }
    }
}

1、使用数据流时,读取的顺序一定要与写入的顺序一致,否则不能正确读取数据。

2、数据流只能处理文件字节流,不能处理文件字符流

8.5 对象流

我们前边学到的数据流只能实现对基本数据类型和字符串类型的读写,并不能读取对象(字符串除外),如果要对某个对象进行读写操作,我们需要学习一对新的处理流:

ObjectInputStream/ObjectOutputStream。对象流实际上是数据流的升级版,使用对象流也能实现对Java中基本数据类型的读写操作,还能对自定义对象进行读写操作。对象流和数据流一样都是处理流,只能处理字节流不能处理字符流。

8.5.1 对象流处理基本数据类型

package cn.it.bz.IO;
import java.io.*;
public class TestObjectStreamBasicType {
    public static void main(String[] args) {
        try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:/a.txt"));
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:/a.txt"))
        ) {
            //数据写出
            objectOutputStream.writeInt(123);
            objectOutputStream.writeChar('h');
            objectOutputStream.writeBoolean(true);
            //刷新
            objectOutputStream.flush();
            //按照写入的顺序读取数据
            System.out.println(objectInputStream.readInt());
            System.out.println(objectInputStream.readChar());
            System.out.println(objectInputStream.readBoolean());
        }catch (IOException E){
           E.printStackTrace();
        }
    }
}

8.5.2 对象流将对象序列化到文件

ObjectOutputStream可以将一个内存中的Java对象通过序列化的方式写入到磁盘的文件中。被序列化的对象必须要实现Serializable序列化接口,否则会抛出异常。

package cn.it.bz.IO;
import java.io.*;
public class TestObjectOutputStream {
    public static void main(String[] args) {
        try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:/a.txt"));
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:/a.txt"))) {
            //创建Users对象
            Users users = new Users(123,"zhangsan","12");
            //将对象序列化到文件
            objectOutputStream.writeObject(users);
            //刷新
            objectOutputStream.flush();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

如果想一次性将多个对象序列化到文件中,可以将对象放在集合中,集合实现了序列化接口。

8.5.3 将对象反序列化到内存中

package cn.it.bz.IO;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class TestObjectInputStream {
    public static void main(String[] args) {
        //创建对象输入字节流与文件字节输入流对象
        try(ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("d:/a.txt"))){
            //将对象反序列化到内存中
            Users users = (Users) objectInputStream.readObject();
            System.out.println(users);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

九、File类在IO中的作用

File是操作文件的,当以文件作为数据源或目标时,除了可以使用字符串作为文件以及位置的指定以外,我们也可以使用File类指定。

package cn.it.bz.IO;
import java.io.*;
public class TestFile {
    public static void main(String[] args) {
        try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("D:/a.txt")),"gbk"))) {
            String s ="";
            while ((s = bufferedReader.readLine()) != null){
                System.out.println(s);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

十、装饰器模式构建IO流体系

10.1 装饰器模式简介

装饰器模式是GOF23种设计模式中较为常用的一种模式。它可以实现对原有类的包装和装饰,使新的类具有更强的功能。

package cn.it.bz.IO;
class Iphone{
    private String name;
    public Iphone(String name) {
        this.name = name;
    }
    public void show() {
        System.out.println("我是" + name + ",可以在屏幕上显示");
    }
}
//装饰器
class TouyingPhone {
    public Iphone phone;
    public TouyingPhone(Iphone p) {
        this.phone = p;
    }
    // 对Iphone功能的扩展
    public void show() {
        phone.show();
        System.out.println("还可以投影,在墙壁上显示");
    }
}
public class TestDecoration {
    public static void main(String[] args) {
        Iphone iphone = new Iphone("苹果18");
        //将有投影能力的手机壳装到手机上
        TouyingPhone touyingPhone = new TouyingPhone(iphone);
        touyingPhone.show();
    }
}

10.2 IO流体系中的装饰器模式

IO流体系中大量使用了装饰器模式,让流具有更强的功能、更强的灵活性。比如:


FileInputStream fis = new FileInputStream(src);

BufferedInputStream bis = new BufferedInputStream(fis);显然BufferedInputStream装饰了原有的FileInputStream,让普通的FileInputStream也具备了缓存功能,提高了效率。

十一、Apache IO包

Apache基金会介绍

Apache软件基金会(也就是Apache Software Foundation,简称为ASF),是专门为支持开源软件项目而办的一个非盈利性组织。在它所支持的Apache项目与子项目中,所发行的软件产品都遵循Apache许可证(Apache License)。 官方网址为:www.apache.org


很多著名的Java开源项目都来源于这个组织。比如:commons、kafka、lucene、maven、shiro、struts等技术,以及大数据技术中的:hadoop(大数据第一技术)、hbase、spark、storm、mahout等。


commons-io工具包


Apache的commons-io工具包中提供了IOUtils/FileUtils,为我们提供了更加简单、功能更加强大的文件操作和IO流操作功能。


下载与添加commons-io包


下载地址


Commons IO – Download Apache Commons IO


在项目中创建lib文件境jar包拖入到该文件中,然后右键lib选择Add as Library

11.1  FileUtils类中常用方法的介绍

打开FileUtils的api文档,我们抽出一些工作中比较常用的静态方法,进行总结和讲解。总结如下:

方法名 使用说明
cleanDirectory 清空目录,但不删除目录
contentEquals 比较两个文件的内容是否相同
copyDirectory 将一个目录内容拷贝到另一个目录。可以通过FileFilter过滤需要拷贝的文件
copyFile 将一个文件拷贝到一个新的地址
copyFileToDirectory 将一个文件拷贝到某个目录下
copyInputStreamToFile 将一个输入流中的内容拷贝到某个文件
deleteDirectory 删除目录
deleteQuietly 删除文件
listFiles 列出指定目录下的所有文件
openInputSteam 打开指定文件的输入流
readFileToString 将文件内容作为字符串返回
readLines 将文件内容按行返回到一个字符串数组中
size 返回文件或目录的大小
write 将字符串内容直接写到文件中
writeByteArrayToFile 将字节数组内容写到文件中
writeLines 将容器中的元素的toString方法返回的内容依次写入文件中
writeStringToFile 将字符串内容写到文件中

11.1.1使用FileUtils工具类读取文件

package cn.it.bz.IO;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
public class TestUtils1 {
    public static void main(String[] args) throws IOException {
        //content表示读取的文件中的全部的内容
        String content = FileUtils.readFileToString(new File("D:/a.txt"), "gbk");
        System.out.println(content);
    }
}

11.1.2使用FileUtils工具类实现目录拷贝

我们可以使用FileUtils完成目录拷贝,在拷贝过程中可以通过文件过滤器(FileFilter)选择拷贝内容。

package cn.it.bz.IO;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
public class TestFileUtils2 {
    public static void main(String[] args) throws IOException {
        FileUtils.copyDirectory(new File("D:\\图片"), new File("d:/aaa"), new FileFilter() {
            //给定文件拷贝规则,只拷贝以png结尾的文件
                    @Override
                    public boolean accept(File pathname) {
                         if (pathname.getName().endsWith(".png")){
                             return true;  //拷贝
                         }
                        return false;  //不拷贝
                    }
                }
        );
    }
}

11.2 IOUtils的妙用

打开IOUtils的api文档,我们发现它的方法大部分都是重载的。所以,我们理解它的方法并不是难事。因此,对于方法的用法总结如下:

方法名 使用说明
buffer 将传入的流进行包装,变成缓冲流。并可以通过参数指定缓冲大小
closeQueitly 关闭流
contentEquals 比较两个流中的内容是否一致
copy 将输入流中的内容拷贝到输出流中,并可以指定字符编码
copyLarge 将输入流中的内容拷贝到输出流中,适合大于2G内容的拷贝
lineIterator 返回可以迭代每一行内容的迭代器
read 将输入流中的部分内容读入到字节数组中
readFully 将输入流中的所有内容读入到字节数组中
readLine 读入输入流内容中的一行
toBufferedInputStream,toBufferedReader 将输入转为带缓存的输入流
toByteArray,toCharArray 将输入流的内容转为字节数组、字符数组
toString 将输入流或数组中的内容转化为字符串
write 向流里面写入内容
writeLine 向流里面写入一行内容
package cn.it.bz.IO;
import org.apache.commons.io.IOUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TestIOUtilsDemo {
    public static void main(String[] args) throws IOException {
        String content = IOUtils.toString(new FileInputStream("D:/a.txt"), "gbk");
        System.out.println(content);
    }
}

实际上就是相当于文件字节输入流套上了文件字符转换流(并指定解码规则)再套上文件字符缓冲流。

相关文章
|
3月前
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
54 12
|
15天前
|
Java API 微服务
2025 年 Java 核心技术全面升级与实战应用详解
这份Java校招实操内容结合了最新技术趋势,涵盖核心技术、微服务架构、响应式编程、DevOps及前沿技术等六大模块。从函数式编程到Spring Cloud微服务,再到容器化与Kubernetes部署,帮助你掌握企业级开发技能。同时,提供AI集成、区块链实践和面试技巧,包括高频算法题与系统设计案例。通过学习这些内容,可应对90%以上的Java校招技术面试,并快速上手实际项目开发。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
107 41
|
2月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
274 70
|
20天前
|
存储 安全 Java
现代应用场景中 Java 集合框架的核心技术与实践要点
本内容聚焦Java 17及最新技术趋势,通过实例解析Java集合框架的高级用法与性能优化。涵盖Record类简化数据模型、集合工厂方法创建不可变集合、HashMap初始容量调优、ConcurrentHashMap高效并发处理、Stream API复杂数据操作与并行流、TreeMap自定义排序等核心知识点。同时引入JMH微基准测试与VisualVM工具分析性能,总结现代集合框架最佳实践,如泛型使用、合适集合类型选择及线程安全策略。结合实际案例,助你深入掌握Java集合框架的高效应用与优化技巧。
42 4
|
2月前
|
人工智能 Java 程序员
Java程序员在AI时代必会的技术:Spring AI
在AI时代,Java程序员需掌握Spring AI技术以提升竞争力。Spring AI是Spring框架在AI领域的延伸,支持自然语言处理、机器学习集成与自动化决策等场景。它简化开发流程,无缝集成Spring生态,并提供对多种AI服务(如OpenAI、阿里云通义千问)的支持。本文介绍Spring AI核心概念、应用场景及开发步骤,含代码示例,助你快速入门并构建智能化应用,把握AI时代的机遇。
|
3月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
146 23
|
3月前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
3月前
|
开发框架 Java 开发工具
【Java全栈学习笔记-U1-day01】Java介绍
本笔记整理了Java学习的基础内容,涵盖程序理解、Java语言特性、JDK安装与配置、Java程序开发工具及编写步骤。重点介绍了Java程序的基本结构、编译和运行过程,以及输出语句的使用。通过实例演示了IDEA创建Java程序的方法,并强调了编码规范和注意事项。适合初学者复习和交流学习。 主要内容: 1. 理解程序:计算机组成、程序定义。 2. 简介:Java语言特点、技术平台、JDK作用。 3. 编写Java程序:编写、编译、运行步骤,基本结构。 4. 输出语句 5. DEA使用:新建工程、保存位置、文件介绍、新建类。 6. 扩展:注释、代码规范、大小写敏感、缩进等。
|
4月前
|
缓存 Java 物联网
CRaC技术助力ACS上的Java应用启动加速
容器计算服务借助ACS的柔性算力特性并搭配CRaC技术极致地提升Java类应用的启动速度。
|
10月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。

热门文章

最新文章