| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> IO流的基本原理和使用 -> 正文阅读 |
|
[Java知识库]IO流的基本原理和使用 |
目录 2.4.1? ? ? ? ?FileInputStream 和 FileOutputStream 2.4.2字节缓冲流 BufferedInputStream 和 BufferedOutputStream 3.1?字符流 FileReader 和 FileWriter public class FileReader extends InputStreamReader ?3.2?、字符缓冲流 BufferedReader 和 BufferedWriter 一:用file来进行文件操作1.1 file类使用的准备
java.io.File
类是一个普通的类
,
如果要实例化对象,则常用到两个构造方法
1.2?File类常用方法-基本文件操作代码1:检验文件是否存在
?结果如下: 代码2:检验是否是目录,文件并删除
?结果如下: ?代码3:创建新文件
结果:
E:\java_code\file
路径下,新增指定
dome1.txt
文件。可以再次运行,就会看到已经存在的
提示
1.3?File类常用方法-目录操作代码1:创建指定一个或者多个目录的路径
?结果: 代码2:获取父路径
结果: 代码3:获取父目录 File 对象,并在父目录下,创建文件 demo.java
?结果: ?1.4?File类常用方法-文件属性操作代码1:获取示例信息
?结果: 1.5?File类常用方法-其他操作代码1:列出desktop目录中的全部组成
?二:流2.1流的概念
流:
在
?Java
中所有数据都是使用流读写的。流是一组有顺序的,有起点和终点的字节集合,是对数据传
输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象
为各种类,方便更直观的进行数据操作。
1.
按照流向分:输入流;输出流
2.
按照处理数据的单位分:字节流
(8
位的字节
)
;字符流
(16
位的字节
).
2.2什么是输入输出流
输入
就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中。
输出
则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。
例如键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,
但是文件既可以作为输入设
备,又可以作为输出设备。
?2.3?什么是字节流,字符流
File
类不支持文件内容处理,如果要处理文件内容,必须要通过流的操作模式来完成。
在
java.io
包中,流分为两种:字节流与字符流
字节流:数据流中最小的数据单元是字节 。
InputStream
、
OutputStream
字符流:数据流中最小的数据单元是字符,
Java
中的字符是
Unicode
编码,一个字符占用两个字节
。
Reader
、
Writer.
Java
中
IO
流的体系结构如图
2.4 字节流2.4.1? ? ? ? ?FileInputStream 和 FileOutputStream
FileInputStream
从文件系统中的某个文件中获得输入字节。
FileInputStream
用于读取诸如图像数据之类的原始字节流。
文件输出流是用于将数据写入到输出流
File
或一个
FileDescriptor
。 文件是否可用或可能被
创建取决于底层平台。
特别是某些平台允许一次只能打开一个文件来写入一个
FileOutputStream
(或其他文件写入对
象)。 在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。
2.4.2字节缓冲流 BufferedInputStream 和 BufferedOutputStream
问题一:为什么需要有缓冲流?
答:当我们用
read()
读取文件时,每读一个字节,访问一次硬盘,效率很低 。文件过大时,操作
起来也不是很方便。因此我们需要用到
buffffer
缓存流,
当创建
buffffer
对象时,会创建一个缓冲区
数组。
当我们读一个文件时,先从硬盘中读到缓冲区,然后直接从缓冲区输出即可,效率会更
高。
BufferedInputStream
为另一个输入流添加了功能,即缓冲输入和支持
mark
和
reset
方法的功
能。 当创建
BufferedInputStream
时,将创建一个内部缓冲区数组。
当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次有多个字
节。
mark
操作会记住输入流中的一点,并且
reset
操作会导致从最近的
mark
操作之后读取的所
有字节在从包含的输入流中取出新的字节之前重新读取。
该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为
写入的每个字节导致底层系统的调用。
示例使用 BufferedInputStream 和 BufferedOutputStream 实现文件拷贝:
?有无缓冲效率的对比(以读为例)
结果输出: 三:字符流3.1?字符流 FileReader 和 FileWriterpublic class FileReader extends InputStreamReader
如果要从文件中读取内容,可以直接使用
FileReader
子类。
FileReader
是用于读取字符流。 要读取原始字节流,请考虑使用
FileInputStream
。
如果是向文件中写入内容,应该使用
FileWriter
子类
FileWriter
是用于写入字符流。 要编写原始字节流,请考虑使用
FileOutputStream
?示例使用 FileReader 和 FileWriter 复制文件:
?3.2?、字符缓冲流 BufferedReader 和 BufferedWriter
为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。
BufferedReader
用于加快读取字符的速度,
BufferedWriter
用于加快写入的速度。
BufferedReader
和
BufferedWriter
类各拥有
8192
个
字符的缓冲区。当
BufferedReader
在
读取文
本文件时,会先尽量从文件中读入字符数据并放满缓冲区,而之后若使用
read()
方法,会先从缓冲区中
进行读取。如果缓冲区数据不足,才会再从文件中读取,使用
BufferedWriter
时,写入的数据并不会
先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。
从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取
将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。 示例使用 BufferedReader 和 BufferedWriter 进行文件拷贝 ?
四:字节流对比字符流
1
、字节流操作的基本单元是字节;字符流操作的基本单元为
Unicode
码元。
2
、字节流在操作的时候本身不会用到缓冲区的,是与文件本身直接操作的;而字符流在操作的时候使
用到缓冲区的。
3
、所有文件的存储都是字节
(byte)
的存储,在磁盘上保留的是字节。
4
、在使用字节流操作中,即使没有关闭资源(
close
方法),也能输出;而字符流不使用
close
方法的
话,不会输出任何内容。
总结:? ?码文不易,大家多多支持,望不吝赐教,感激不尽!越来越好!!! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 21:58:12- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |