【Java】韩顺平Java学习笔记 第19章 IO流

韩顺平 Java IO流 自学笔记 自己照着课程写得IO笔记 阅读详情

文件概述

  • 保存数据的地方
  • 文件流:文件在程序中是以流的形式操作的
  • 输入流:数据从数据源(文件)到程序(内存)的路径,输出流相反

常用的文件操作

创建文件

  • new File(String pathname) 文件的路径
  • new File(File Parent,String child ) 父目录文件+子路径(文件名)
  • new File(String parent, String child)父目录+子路径
  • 上面是创建文件对象,使用创建方法才能真正创建文件:createNewFile() [需要异常处理]

获取文件信息

  • getName 文件名
  • getAbsolutePath 绝对路径
  • getParent 文件父级目录
  • length 文件大小(字节)
  • exist
  • isFile
  • isDirectory 文件是不是一个目录(文件夹)

目录的操作和文件删除

  • delete (返回boolean 是否删除成功)
  • 在Java中,目录也被当成文件
  • mkdir 创建一级目录**(注意创建文件夹的方法和创建文件不同!)**
  • mkdirs 创建多级目录

流的分类

  • 操作数据单位不同:字节流(8 bit,操作二进制文件时无损操作),字符流(操作文本文件效率更高)

  • 数据流的流向不同:输入流,输出流

  • 流的角色不同:节点流,处理流/包装流

  • 字节输入流:InputStream

    字节输出流:OutputStream

    字符输入流:Reader

    字符输出流:Writer

    上面四个都是抽象类

  • 流和文件的关系:流是文件/程序之间传递信息的介质

各抽象类常用子类对象

FileInputStream

  • read 一个个字节读,返回-1到达文件末尾,注意一个汉字有三个字节
  • 优化减少读取的次数:read(byte[ ] b) 一次最多读取b.length字节的数据到字节数组,返回实际读取的字节数,返回-1说明读取完毕
  • close 关闭文件

FileOutputStream

  • write 写入一个字节

  • String 的 getBytes 可以将字符串转换为字符数组,可以配合write写入字符串

  • write(byte[ ] b)

  • write(byte[ ] b,index1,index2) index为读取字节的起点和终点

  • new 的创建方式,当写入内容时,会覆盖原来的内容

  • new FileOutputStream(filePath,true)的创建方式,写入内容时,在原来的文本后追加

    true 传给参数 append

FileReader

  • 按照字符来操作io,汉字不会乱码
  • new FileReader(File/String,(true)) 可选true,追加模式,需要处理异常
  • 读取方式基本和FileInputStream相同
  • read
  • read(char[ ])
  • new String (char[ ]) 将char转换成String
  • new String(char[ ],off,len)
  • close

FileWriter

  • new FileWriter(File/String,(true)) 可选true,追加模式
  • 注:写完之后必须关闭流(close)或者刷新(flush),才能真正写到文件中(看源码)
  • write(int)
  • write(char[ ])
  • write(char[ ],off,len)
  • write(string)
  • write(string,off,len)(注:off为写入的起始位置)

节点流和处理流

概念

  • 节点流:从某一特定数据源读写数据,如FileReader、FileWriter,但限制较多,功能不强大

  • 处理流(包装流):对节点流进行包装,“连接”已存在的流(节点流或处理流),如BufferedReader、BufferedWriter

    BufferedReader 里面有一个 Read 类型的对象,代表其以后可以实现 Read 的各子类如FileReader、CharReader、StringReader等,使其能够处理各种数据,功能更强大

    使用了修饰器模式

  • 区别和联系

    • 节点流是底层流,直接与数据源相连
    • 处理流包装节点流,通过一个节点流,传入不同的节点流,来统一处理文件的流(都使用处理流),即想处理字符串就把处理字符串的节点流(如StringReader)传入处理流(BufferedReader),想处理数组就把处理数组的节点流(ByteArrayInputStream)传入处理流(BufferedReader),否则每种节点流还需单独创建一个对象。并且还可以拓展输入输出的方式
    • 处理流不直接于数据源相连,而是调用了节点流的方法**(多态和动态绑定)**
  • 处理流优点

    • 提高性能:以增加缓冲的方式来提高输入输出的效率
    • 操作便捷:可能提供一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便
  • 要知道什么情况下用什么流!

BufferedReader

  • ​ 和 BufferedWriter 一样是字符流,尽量操作文本文件,不操作二进制文件(图片、音乐等),否则可能造成文件损坏
  • 关闭时关闭外层流即可,即关闭BufferedReader即可,不用关闭内层的节点流(如FileReader),因为关闭外层流的close方法里面调用了节点流的close方法
  • readline 按行读取,效率高,当返回 null 时,读取完毕(看手册),不带换行(用newline手动换行)

BufferedWriter

  • newLine 插入一个和系统相关的换行(不同系统换行不同,因此不建议用\n换行符)
  • 如果要追加,在传入节点流(FileWriter)时传入true,即new BufferedWriter(new FileWriter( path, true))

BufferedInputStream & BufferedOutputStream

  • 字节流,可以操作二进制文件也可以操作文本文件
  • 操作与之前的几个类类似

对象流:ObjectInputStream & ObjectOutputStream

  • 需求:保存数据时同时保存其数据类型(序列化,即把对象保存为文件。从文件恢复为对象称为反序列化)

  • 必须让某个类是 可序列化的,有两个方式:

    • 实现 Serializable 接口(推荐,标记接口,没有任何方法)
    • 实现 Externalizable 接口
  • ObjectOutputStream 提供 序列化功能

  • ObjectInputStream 提供 反序列化功能

  • 序列化后,保存的文件格式,是按照其实际格式保存

  • 包装类(如 Integer、Double)和 String 都实现了 Serializable 接口

  • 各种方法与之前的类相似

    需要注意读写文件时需要加上数据类型,如:writeInt、writeDouble、readBoolean、readChar

  • 读取(反序列化)的顺序需要和保存数据(序列化)的顺序一致

  • 需要将自定义数据类型(类)的定义拷贝(或导包)到可以引用的位置(注意该类不要用 private 修饰),这样调用过后才能直接用这个自定义数据类型

  • 如果要调用自定义数据类型的方法,需要向下转型,因为从文件调进来的是Object类型

  • 序列化的类中建议添加 SerialVersionUID (序列版本号),提高序列化兼容性

  • static 和 transient(标记这个变量不应序列化) 修饰的成员不会被序列化

    • transient 使用场景
      • 安全:密码、安全令牌等不应该持久化或通过网络传输
      • 性能:大对象或不重要的对象成员没必要序列化
      • 逻辑需求:某对象只可能对特定上下文有意义,无需序列化
    • 注意事项
      • transient 只能用于变量,不能用于方法和类
      • 局部变量(方法内变量)不能用 transien 修饰,因为局部变量本来就不会被序列化
  • 序列化对象时,要求里面属性的类型(如另一个类的对象)也需要实现序列化接口,即使其被 transient 修饰,不会被序列化,也要实现这个接口

  • 序列化具有可继承性,如某类实现了序列化,则其子类默认实现序列化

  • 注意每次 new 的时候都会调用writeStreamHeader()方法写入4个字节的StreamHeader(看源码),标记这个是对象处理流,可能导致的错误:如果在接收方每次都是new一个新的ObjectInputStream 来接收,而发送方只 new 过一个 ObjectOutputStream,之后每次都是用new过的 ObjectOutputStream对象来发送东西,这样就会导致之后并没有添加头部。而接受方每次都是新的 new,则每次接收都要检测头部,当发送方没有提供头部时,接收方就把内容当做了头部,导致出错。解决方法之一是每次使用 ObjectOutputStream 时都重新 new 一遍

标准输入输出流:System.in & System.out

  • 标准输入(键盘):System.in,InputStream的流对象(编译类型),运行类型是BufferedInputStream

  • 标准输出(显示器):System.out,编译类型和运行类型都是PrintStream,是PrintStream类的一个对象

  • 不需要显式关闭

    • 它们与程序生命周期有关,程序开始运行时由操作系统自动打开,程序终止时也由操作系统自动关闭,无需用户手动操作
    • 标准流通过JVM管理
    • 方便使用
    • 避免以后需要调用时抛出异常
  • System.setOut(new PrintStream(filePath)) 修改标准输出流的打印位置,打印到文件

    (filePath 用 System.out 代替,则打印到屏幕)

转换流:InputStreamReader & OutputStreamWriter

  • InputStreamReader:将字节流转换成字符流输入到程序,并且根据指定的编码方式转换为字符
  • OutputStreamWriter:将字符流转换成字节流输出到文件,并且根据指定的编码方式转换为字节(如果不用转换流,Java会用默认编码转换为字节)
  • 默认情况下,读取文件是按照 utf-8 编码,如果文件不是 utf-8 编码,则可能出现乱码。根本问题:没有指定编码方式
  • 转换流可以完成字节流和字符流的转换,并且转换流可以指定编码类型
  • InputStreamReader 是 Reader 的子类,可以将 InputStream(字节输入流顶级父类) 转换为 Reader(字符输入流顶级父类)
  • OutputStreamWriter 是 Writer 的子类,可以将 OutputStream 转换为 Writer
  • 转换流相当于中间商,使用时将 字节流/节点流 传给 转换流 ,再将 转换流 传给 处理流 进行最终处理(也可以不用处理流,看需求),如:BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"gbk")))

常用方法

  • InputStreamReader(InputStream, Charset)
  • OutputStreamWriter(OutputStream, Charset)
  • 转换流使用的 read、write的方法,实际上还是使用的节点流的 read、write 方法

打印流:PrintStream & PrintWriter

  • 只有输出流,没有输入流

  • 可以打印到屏幕上(默认),也可以打印到文件里

  • PrintStream 是 OutputStream 的子类,是字节流

  • PrintWriter 是 Writer 的子类,是字符流

  • 注意没有 close 流,仍然不会打印到文件

  • 标准输出流 System.out 是 PrintStream 的一个实例化对象,可以使用的方法没有区别。只是标准输出流默认(且一般)将结果打印到屏幕,PrintStream 可以选择打印到文件还是打印到屏幕。如果需要改变标准输出流输出位置,用setOut

常用方法(PrintStream 和 PrintWriter通用 )

  • 打印到某个文件时,创建对象:PrintStream out = new PrintStream("D:\\test.txt");

    若打印到屏幕则将地址换成System.out

  • print:底层用的就是 write,代码:public void print(String s) { write(String.valueOf(s));},将要print的内容转化为字符串的形式,再write出来

  • 只不过多了个 null 判断,如果为空,打印 null

  • print方法相比write方法更侧重格式化输出,不需要关心数据的类型,会自动进行类型转换

与直接使用 write 方法的区别

  • 打印流是格式化输出,可以直接打印各种类型的数据,不需要手动转换位字符串,println还会手动添加换行符,而write相比是一个更底层的方法,需要手动将数据转换为字节或字节数组
  • 打印流本身自带了缓冲输入,而write还需要配合bufferedwriter等使用才有缓冲
  • 打印流更适合文本文件写入,write更适合处理非文本数据(如二进制数据)

Properties类

  • 需求:配置文件
  • 传统方法的代码比较麻烦
  • 配置文件的格式:键=值
  • 父类是 HashTable

常用方法

  • load(Reader) 加载指定配置文件

  • list 显示k-v

  • getProperty(key) 返回的是字符串

  • setProperty(key, value) 如果该文件没有这个key,则是创建。否则是修改

  • store(Writer/OutputStream, comment)

    保存的如果是中文,则会转换成unicode码

    comment 是注释,如果为 null,则没有注释,如果写了,会在配置文件最上方写明

韩顺平Java学习笔记:从基础到实战 Java程序由类和对象组成,其中类是对象的蓝图。一个Java程序至少包含一个类,通常包含一个主类,其包含main方法作为程序入口点。Java文件命名通常与公共类名相同,并以.java后缀结束。示例代码:");在Java语言中,类是创建对象的蓝图,它定义了将要创建的对象的状态(属性)和行为(方法)。类的定义使用关键字class,后跟类名,以及类体(用大括号{}包围的部分)。// 类的属性// 类的构造方法// 类的方法// 对象的创建对象是类的实例,通过关键字。 阅读详情

相关推荐

windows10系统上安装最新版mysql 8.0详细步骤

windows10系统上安装最新版mysql 8.0详细步骤

glei20的博客 6715

韩顺平 java io编程

文件流文件在程序中是以流的形式来操作的。 - 内存 –输出流–> 文件 - 内存 <–输入流– 文件 流:数据在数据源(文件)和程序(内存)之间经历的路径。 注意:以内存为参照物 输入流:数据从数据源(文件)到程序(内存)的路径 输出流:数据从程序(内存)到数据源(文件)的路径文件流分类java流分为两种流 1. 字节流:可以用于读写二进制文件及任何类型文件(以byte单位读取) 2

chen 746

Exchange 2013/2016/2019修改附件大小限制

Exchange 2013/2016/2019邮件大小限制 可以在三个位置上配置Exchange上的默认邮件大小限制: 组织传输设置 发送/接收连接器设置 用户邮箱设置 1.打开Exchange Management Shell 使用命令查看默认限制 get-transportconfig | ft maxsendsize, maxreceivesize get-receiveconnector | ft name, maxmessagesize get-sendconnector | ft

高级基础架构专家-Hunter 6098

JAVA IO流(韩顺平)

JAVA IO流(韩顺平)

wztmds的博客 1157

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》标准解读

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》针对智能网联汽车的自动驾驶数据记录系统进行了全面规范。标准要求我们记录车辆在自动驾驶模式下的所有关键操作数据,如:1. 车辆状态数据,如速度、加速度、转向角度、制动状态等;2. 环境感知数据,如周围物体的位置、速度、类型等;3. 驾驶决策数据,如路径规划、避障决策、紧急制动指令等;4. 系统状态数据,如软件版本、硬件状态、系统警告信息等。在数据存储方面,标准强调了数据的安全性和可靠性。

daopuyun的博客 2669

Python爬虫实战:5分钟搞定东方财富A股数据抓取(附完整代码)

本文提供了一套基于Python的A股数据自动化采集与分析系统构建方案。文章详细解析了如何通过稳健的爬虫框架从东方财富等公开数据源高效抓取A股数据,并设计数据库进行自动化存储与管理,特别适合量化研究和数据分析场景。

weixin_29062963的博客 4429

韩顺平Java | C19 IO流

文件在程序中是以流的形式来操作的输入流:数据从输入源/文件到程序/内存的路径输出流:数据从程序/内存到输入源/文件的路径。

媛媛 302

Veeam Backup & ONE download

前言 Veeam® Availability Suite™ 是 Veeam 的旗舰解决方案,可实现简单、灵活和可靠的数据管理。消除与数据保护、恢复、监控、勒索软件防护和合规性相关的手动流程,从而减轻数据维护压力。Veeam 能够帮助您节省时间和成本,同时支持您减少在备份方面花费的时间,将更多精力放在推动业务发展上。 Veeam Availability Suite Release 版本 包含 发布时间 复制磁力链接使用迅雷或者bittorrent ...

极致,细节 1997

韩顺平Java-第十九章:IO流

IO流的使用

weixin_47199727的博客 1280

一文速览:大模型语料构建与基础训练全流程实战指南

因为模型只有看到足够丰富、高质量的数据,才能真正学到“真本事”,展现出更强大的泛化能力,也就是能够在全新的场景和任务下,做出准确的推理和判断。我们日常做饭的时候,通常会先把买回来的菜仔细清洗干净,把坏掉的叶子、泥土、杂质等去除掉。同理,训练大模型的数据就像我们的食材,如果不干净,就会影响模型的学习效果,甚至训练出逻辑紊乱的模型。在大模型的世界里,有一句名言:“Garbage in, Garbage out”,翻译过来就是“垃圾输入,垃圾输出”,说白了,就是给模型喂的是什么数据,它学到的就是什么知识。

master_hunter的博客 1671

【HALCON工业视觉应用探索】10. C#+Halcon 3D视觉实战:点云处理与三维测量工业指南(附完整代码与实操案例)

摘要:本文聚焦C#+Halcon在3D视觉领域的工业应用,从新手友好的“基础3D检测系统”切入,逐步深入“汽车铸件三维测量”等工业级场景。内容涵盖核心概念(点云数据结构、3D采集原理、坐标系统)、完整技术流程(数据采集→预处理→特征提取→三维测量→结果可视化)、工业级代码实现(多视角点云融合、微缺陷检测、高精度尺寸测量),以及现场落地关键技巧(硬件选型、标定流程、抗干扰优化)。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2004

韩顺平Java学习笔记_IO流专题

韩顺平io流专题学习笔记

m0_62661440的博客 638

【AN7581】AN7581 SDK编译环境搭建操作说明

安装编译需要的工具包。

wgl307293845的博客 338

韩顺平老师-IO流

视频地址:【韩顺平讲Java】Java IO流专题 -io流 io机制 字符流 字节流 节点流 处理流 等 课程资料:课程资料:链接:https://pan.baidu.com/s/1GKg1SZicHhDXCQRNiSOhEA 提取码:x10f 文章目录文件基础知识创建文件获取文件信息目录操作IO流原理和分类FileInputStreamFileOutputStream文件拷贝文件字符流说明 文件基础知识 文件,对我们并不陌生,文件是保存数据的地方,比如大家经常使用的word文档,txt文件,excel

想握住此生辽阔 3376

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

学习:韩顺平java—IO流(第19章)

类型默认设备System.in 标准输入键盘System.in 标准输出显示器//System类的public final static InputStream in = null;//System.in的编译类型是InputStream// 运行类型是BufferedInputStream//System类的public final static PrintStream out = null;//System.out的编译类型是PrintStream。

weixin_47095832的博客 994

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

B站韩顺平java学习笔记(十八)-- IO流 章节

一 文件 文件是保存数据的地方。 1 文件流 文件在程序中是以流的形式来操作的。 流:数据在数据源(文件)和程序(内存)之间经历的路径; 输入流:数据从数据源(文件)到程序(内存)的路径; 输出流:数据从程序(内存)到数据源(文件)的路径。 二 IO流原理及流的处理 三 节点流和处理流 四 输入流 五 输出流 六 Properties类 ...

LW_20180806的博客 3869

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java学习笔记-IO流(韩顺平)

FileReader 和 FileWriter 是字符流,即按照字符来操作ioFileReader相关方法read:每次读取单个字符,返回该字符,如果到文件末尾返回-1read(char[]) :批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1相关APInew String(char[]):将char[] 转换成Stringnew String(char[],off,len):将char[] 的指定部分转换成String​​​​//单个字符读取@Test。

2301_79070677的博客 1440

非零基础自学Java (老师:韩顺平) 第19章 IO流 19.3 IO 流原理及流的分类 && 19.4 IO 流体系图 - 常用的类

非零基础自学Java (老师:韩顺平) 第19章 IO流 19.3 IO 流原理及流的分类 && 19.4 IO 流体系图 - 常用的类

代码改变世界 293

韩顺平老师坦克大战优化版

目录一、项目介绍1、前言2、涉及知识点3、关键代码4、运行数据二、主要优化方面1、系统常量2、用线程池管理线程3、采用线程安全集合类4、控制坦克发射频率5、敌方自动追击我方6、避免坦克重叠7、生成一组不重复随机整数8、统计数量时采用原子类一、项目介绍 1、前言 基于韩顺平老师坦克大战的框架和思路,进行了一些优化。编码上尽量按照阿里的代码规约;有非常详尽的注释;引入了线程池,线程安全集合类,原子类...

土味儿 2847

IO流(师从韩顺平)

package IO流;import orgpackage IO 流;/*** @Author: 韩如意} //方式 1 new File(String pathname) @Test public void create01() {try {System . out . println("文件创建成功");

2201_75798871的博客 810

非零基础自学Java (老师:韩顺平) 第20章 坦克大战【3】 20.1 IO流 - 应用到坦克大战

非零基础自学Java (老师:韩顺平) 第20章 坦克大战【3】 20.1 IO流 - 应用到坦克大战

代码改变世界 898

韩顺平java基础——坦克大战(含有线程、I\O流的讲解)

}代码展示。

feifeide123的博客 4427

韩顺平老师讲解IO流

韩顺平老师IO流详解

G189D的博客 461

Java基础IO流 韩顺平Java笔记

文件是保存数据的地方,比如word文档,txt文件,excel文件,都是文件。它能保存图片、视频、声音……文件在程序中时以流的形式来操作的 流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从数据源(文件)到程序(内存)的路径 输出流:数据从程序(内存)到数据源(文件)的路径类图:比较和串行化 代码示例: 常用的文件操作 目录的操作和文件删除 mkdir创建一级目录、mkdirs创建多级目录、delete只能删除空目录或者文件示例: IO流原理和分类 JAVA IO流原理 I/O 流是In

心向阳光的天域的博客 898

非零基础自学Java (老师:韩顺平) 第19章 IO流 19.5 节点流 和 处理流

非零基础自学Java (老师:韩顺平) 第19章 IO流 19.5 节点流 和 处理流

代码改变世界 286

Java SE : 第19章 IO流

本文章内容来自韩顺平老师的课堂笔记的 第19章 IO流

weixin_48409574的博客 387
上一篇: Datawhale AI夏令营 从零入门机器学习竞赛 Task 2
下一篇: 【Java】韩顺平Java学习笔记 第21章 网络编程
COTAS
博客等级 码龄7年 369粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值