Java I/O系统
Java I/O系统概述
什么是流?
流是Java I/O的基础。
当程序需要 写入数据 的时候,就会开启一个通向目的地设备的流。这时候我们就可以想象数据好像在这其中“流”动一样。
流的两个最基本的特性:一是它含有 流质 ,二是它有 方向 。流的分类:
按方向分:
输入流: 从数据源读取数据到程序中。只能从中读取数据,而不能向其写入数据。
(io包中的输入流都继承自抽象类InputStream或Reader)输入流:从数据源读取数据到程序中。只能从中读取数据,而不能向其写入数据。 (io包中的输入流都继承自抽象类InputStream或Reader)
输出流: 将数据从程序写入数据目的地。只能从中写入数据,而不能从中读取数据。
(io包中的输出流都继承自抽象类OutputStream或Writer)按照处理数据的最小单位分:
字节流: 字节流是以byte为最小单位进行数据传送。(io包中的字节流都继承自抽象类InputStream或OutputStream。)
字符流: 字符流是以char为最小单位进行数据传送。(io包中的字符流都继承自抽象类Reader或者Writer。)按照流的功能分:
节点流: 节点流是可以直接从/向一个特定的数据源(例如磁盘文件、内存、网络)读/写数据的流。节点流也称低级流。
处理流: 处理流不直接连接到设备,而是连接在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更强大的读写功能。处理流也称高级流。
所有的IO操作都由以下步骤构成:
- 建立流。根据数据源和具体的操作(是读取还是写入)选择流,然后建立流。通过流的建立,创建内存到数据源之间的数据通道,以传输数据。
- 操作流。将数据读取到内存,或将内存中的数据写入数据源。
- 关闭流。流操作结束后,释放所有与该流相关联的系统资源。
文件类
java.io包中的File类提供了管理磁盘文件和目录的基本功能。我们可以将一个File对象看成是代表一个文件或目录的名称和位置的字符串。File类有四个构造方法:
- public File(String pathname)。创建一个与指定路径名关联的File对象。
- public File(String parent, String child)。使用指定参数创建一个File对象。参数parent代表一个目录,参数child代表在parent中的子目录或文件。
- public File(File parent, String child)。与上一个构造器相同,除了目录是用一个File对象而不是一个字符串来表示。
- public File(URI uri)。使用给定的java.net.URI对象创建一个File对象。URI是统一资源标识符,一个文件的URI是“file:///目录/文件名”格式。
方法 | 描述 |
---|---|
boolean canWrite() | 判断文件是否可写 |
boolean canRead() | 判断文件是否可读 |
boolean createNewFile() | 创建一个新文件 |
boolean delete() | 删除文件对象代表的文件或目录。删除目录时必须保证此目录为空,否则无法删除 |
boolean exists() | 判断文件或目录是否存在 |
String getAbsolutePath() | 获得文件绝对路径 |
boolean isFile() | 判断是否是文件 |
boolean isDirectory() | 判断是否是目录 |
long lastModified() | 获得文件最后一次修改时间 |
long length() | 得到文件长度 |
String[] list() | 返回包含目录中所含文件的文件名的字符串数组 |
File[] listFiles() | 返回该目录中java.io.File对象数组 |
boolean mkdir() | 创建目录 |
字节流
低级字节流
字节流中的主要低级流,根据其输入和输出的设备或数据源,分为三类:
- 对二进制文件进行读写操作的FileInputStream和FileOutputStream类,其数据源是磁盘文件。
- 对内存缓冲区中的字节数组进行读写操作的ByteArrayInputStream和ByteArrayOutputStream类,其数据源是内存中的字节数组。
- 对线程管道进行读写操作的PipedInputStream和PipedOutputStream类,其数据源是线程管道。
public class Main {public static void main(String[] args) {// TODO Auto-generated method stubString fromPath = "C:" + File.separatorChar +"1" + File.separatorChar + "MainEnter.java";File file = new File(fromPath);String toPath = "C:" + File.separatorChar +"2" + File.separatorChar + "MainEnter.java";File file02 = new File(toPath);//判断文件是否存在if(file.exists()) {//无论文件是什么类型的文件,都可以采用字节流//推荐:对于字节码文件,或者图片,或音频,视频等等文件,我们读取时,一般采用字节流//而文本文件,采用字符流FileInputStream in = null;FileOutputStream out = null;byte[] data = new byte[1024];//定义一个数据缓冲区try {in = new FileInputStream(file);//针对该文件,创建一个对应字节输入流int lenth = 0;//代表单次读取内容的长度while((lenth = in.read(data)) != -1) {out.write(data,0,lenth);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {//关流try {in.close();out.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} } }
}
高级字节流
高级字节流对低级字节流进行了封装,并有许多功能的扩展。高级字节流根据其功能分为三大类:
- 过滤流类: 过滤流类提供了额外的功能,在将数据实际写入到输出流之前对输出进行预处理,或者在读取数据之后对输入进行后期处理。过滤流类都是抽象类FilterInputStream 和 FilterOutputStream的子类。
- 缓冲流:包括BufferedInputStream 和 BufferedOutputStream,这两个类实现了带缓冲的过滤流。
- 数据流:包括DataInputStream 和 DataOutputStream,可以用与计算机无关的格式读写Java的基本数据类型以及String对象。
- 计数:包括LineNumberInputStream类,允许在翻译行结束符的基础上,维护一个计数器,该计数器表明正在读取的是哪一行。
- 推回输入流:包括PushbackInputStream类,代表一个流允许从流中读取数据,然后在需要时推回该流。
- 打印输出流:包括PrintStream类,允许将基本类型数据打印输出到字符串流中,带有自动刷新功能。
- 对象流: 包括ObjectInputStream和ObjectOutputStream,允许直接对对象执行读写操作。
- 合并: SequenceInputStream类可以实现两个文件的合并操作,它从两个低级流中读取数据字节,当到达流的末尾时从一个流转到另一个流 ,从而实现合并操作。
高级字节流之—缓冲流:
public class Main {public static void main(String[] args) {// TODO Auto-generated method stubString fromPath = "C:" + File.separatorChar + "1" + File.separatorChar + "MainEnter.java";File file = new File(fromPath);String toPath = "C:" + File.separatorChar + "2" + File.separatorChar + "MainEnter.java";File file02 = new File(toPath);// 判断文件是否存在if (file.exists()) {// 定义低级流FileInputStream in = null;FileOutputStream out = null;// 定义高级流BufferedInputStream bis = null;BufferedOutputStream bos = null;try {// 实例化低级流in = new FileInputStream(file);out = new FileOutputStream(file02);// 实例化高级流bis = new BufferedInputStream(in);bos = new BufferedOutputStream(out);// 读写文件byte[] data = new byte[1024];int lenth = 0;while ((lenth = bis.read(data)) != -1) {bos.write(data, 0, lenth);}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();} finally {try {bos.flush();// 向文件中,写入数据in.close();out.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}} }
}
高级字节流之数据流:
数据输入流允许应用程序以与机器无关方式,从底层输入流中读取 Java 基本数据类型,与机器无关的方式,就是用JAVA的方式
public class Main {public static void main(String[] args) {// TODO Auto-generated method stubString[] names = { "张帅", "徐帅", "袁帅", "胡帅", "帅胡" };// 名字int[] age = { 20, 18, 29, 19, 91 };// 年龄boolean[] marry = { true, false, true, true, false };// 结没结婚// 将上面的这些数据,写入到文件中String fromPath = "C:" + File.separatorChar + "2" + File.separatorChar + "Person";File file = new File(fromPath);if (!file.exists())// 没有文件,就创建一个文件try {file.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 定义低级输出流FileOutputStream out = null;// 定义高级数据流DataOutputStream dos = null;try {// 实例化out = new FileOutputStream(file);dos = new DataOutputStream(out);int lenth = names.length;for (int i = 0; i < lenth; i++) {dos.writeUTF(names[i]);// 以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。dos.writeInt(age[i]);dos.writeBoolean(marry[i]);}System.out.println("我瑟吉欧椎间盘公共IP热门");} catch (Exception e) {// TODO: handle exceptione.printStackTrace();} finally {try {out.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// ----------------------------------------// 使用高级数据流,读取内容// ----------------------------------------// 定义低级输入流FileInputStream in = null;// 定义高级数据流DataInputStream dis = null;try {in = new FileInputStream(file);dis = new DataInputStream(in);while(true) {System.out.println(dis.readUTF());System.out.println(dis.readInt());System.out.println(dis.readBoolean());}} catch (Exception e) {// TODO: handle exception
// e.printStackTrace();}finally {try {in.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} }
}
打印输出流:
使用字节打印输出流 ,去格式化文本文件的内容,可以让我们输出到文件中的内容,以操作系统默认的字符编码集进行编码显示
public class Main {public static void main(String[] args) {// TODO Auto-generated method stubString[] names = { "张帅", "徐帅", "袁帅", "胡帅", "帅胡" };// 名字int[] age = { 20, 18, 29, 19, 91 };// 年龄boolean[] marry = { true, false, true, true, false };// 结没结婚// 将上面的这些数据,写入到文件中String fromPath = "C:" + File.separatorChar + "2" + File.separatorChar + "Person.txt";File file = new File(fromPath);if (!file.exists())// 没有文件,就创建一个文件try {file.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 定义低级输出流FileOutputStream out = null;// 定义高级字节打印输出流/*** PrintStream 在进行输出,采用操作系统的默认字符编码集,来进行输出*/PrintStream ps = null;try {// 实例化out = new FileOutputStream(file);ps = new PrintStream(out);int lenth = names.length;for(int i = 0; i < lenth; i ++) {ps.print(names[i] +" ");ps.print(age[i] +" ");ps.print(marry[i] +" ");ps.println();}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();} finally {try {out.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
}
对象流:
public class StudentBean implements Serializable{*/private static final long serialVersionUID = 5453124311904581252L;/*** 数据的唯一标识 */private String id;/*** 学生名字*/private String stuName;/*** 学生年龄*/private int age;/*** 学生性别(0-女,1-男,-1 不男不女)*/private int gender;/*** 学生学号*/private String stuNo;
/**自行添加下面内容:*无参构造*get/set方法*toString方法
*/
}
public class Main {public static void main(String[] args) {// TODO Auto-generated method stubString fromPath = "C:" + File.separatorChar + "2" + File.separatorChar + "students.data";File file = new File(fromPath);if(file.exists()) {//定义低级字节流FileInputStream in = null;//定义高级对象输入流ObjectInputStream ois = null;try {//实例化in = new FileInputStream(file);ois = new ObjectInputStream(in);//从文件中读取多个JAVA对象Object obj = null;while((obj = ois.readObject()) != null) {if(obj instanceof StudentBean) {StudentBean stu = (StudentBean) obj;System.out.println(stu);}}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}finally {try {in.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
字符流
低级字符流
字符流中的低级流包括:
- 对内存数组进行操作的CharArrayReader和CharArrayWriter类,与ByteArrayInputStream和ByteArrayOutputStream类似,其数据源为内存中的字符数组。
- 对内存中的String对象进行操作的StringReader和StringWriter类,其数据源为内存中的String对象。
- 对线程管道进行操作的PipedReader和PipedWriter类,与PipedInputStream和PipedOutputStream类似,其数据源为线程管道。
- 对文本文件进行读写操作的FileReader和FileWriter类,与FileInputStream和FileOutputStream类似,其数据源为磁盘文件。FileReader和FileWriter按照本地操作系统平台的默认字符编码,读写文件。
低级字符流:
public class Main {public static void main(String[] args) {// TODO Auto-generated method stub//文本文件,适合使用字符流来读取、写入String fromPath = "C:" + File.separatorChar +"1" + File.separatorChar + "MainEnter.java";File file = new File(fromPath);String toPath = "C:" + File.separatorChar +"2" + File.separatorChar + "MainEnter.java";File file02 = new File(toPath);//判断文件是否存在if(file.exists()) {//声明字符输入流,字符输出流FileReader r = null;FileWriter w = null;try {//实例化字符流入流,和字符输出流r = new FileReader(file);w = new FileWriter(file02);char[] data = new char[1024];int lenth = 0;while((lenth = r.read(data)) != -1) {w.write(data, 0, lenth);System.out.println(Arrays.toString(data));}} catch (IOException e) {// TODO: handle exceptione.printStackTrace();}finally {try {r.close();w.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
}
高级字符流
字符流中常用的高级流包括:
- 缓冲流:包括BufferedReader和BufferedWriter类,利用缓冲区来提高读写数据的效率。
- 转换流:用于字节数据到字符数据之间的转换,包括InputStreamReader和OutputStreamWriter。
- 打印输出流:包括PrintWriter类,允许将基本类型数据打印输出到字符串流中,PrintWriter带有带自动刷新(Flush)功能。
Java I/O系统相关推荐
- java云服务器系统选择,java云服务器系统选择
java云服务器系统选择 内容精选 换一换 登录Windows操作系统弹性云服务器时,无法正常进入系统.自启动系统修复模式,但选择修复选项后报错,无法继续进行系统恢复.Windows文件已损坏.登录管 ...
- JAVA 多用户商城系统b2b2c-Spring Cloud常见问题与总结(一)
在使用Spring Cloud的过程中,难免会遇到一些问题.所以对Spring Cloud的常用问题做一些总结.需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台 ...
- 零基础参加java培训的系统学习路线
零基础想要学习java技术,那么最好的选择就是参加java培训,进行系统的学习,以下就是小编为大家整理的零基础参加java培训的系统学习路线,希望能够帮助到正在学习java技术的零基础同学. 零基 ...
- java实验系统常用类,Java的常用系统类
Java的常用系统类Tag内容描述: 1.Java语言与JBuilder应用初步 第六章 常用的Java系统类,本章要点,字符串类 数值(Number)类及其子类 数组类 集合类 Object类,字符 ...
- java6.2免费下载_jasperreports(Java开源报表系统)
jasperreports是一款功能比较大的Java编写开源报表系统:通过该工具,即可快速的对各种类型的数据源进行支持,还可以快捷的完成文档的操作,包括了各种像素级的文档生成,包括了报表的生成工具:支 ...
- JAVA 多用户商城系统b2b2c-服务容错保护(Hystrix依赖隔离)
依赖隔离 "舱壁模式"对于熟悉Docker的读者一定不陌生,Docker通过"舱壁模式"实现进程的隔离,使得容器与容器之间不会互相影响.而Hystrix则使用该 ...
- java托盘图标变白在linux,为什么用java实现windows系统托盘图标总是不显示出来
为什么用java实现windows系统托盘图标总是不显示出来 我用JAVA写了个系统拖盘,不过图标总是不显示出来只有弹出菜单和提示下面是我写的代吗 public class TraySystem ex ...
- Java I/O系统学习系列三:I/O流的典型使用方式
尽管可以通过不同的方式组合IO流类,但我们可能也就只用到其中的几种组合.下面的例子可以作为典型的IO用法的基本参考.在这些示例中,异常处理都被简化为将异常传递给控制台,但是这只有在小型示例和工具中才适 ...
- Java I/O系统学习系列二:输入和输出
编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象."流"屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇 ...
- Java I/O系统学习系列一:File和RandomAccessFile
I/O系统即输入/输出系统,对于一门程序语言来说,创建一个好的输入/输出系统并非易事.因为不仅存在各种I/O源端和想要与之通信的接收端(文件.控制台.网络链接等),而且还需要支持多种不同方式的通信(顺 ...
最新文章
- 卷积神经网络学习笔记与心得(4)池化
- push to origin/master was rejected错误解决方案(IDEA)
- 天天象棋 残局闯关 第12关
- 二叉树的三叉链表存储和基本操作
- 框架中建立浮动框架_建立代理,而不是框架
- 分享一下把pdftk的合并pdf功能添加到TC(Totalcommander)
- 系统分析员备考之经济管理篇(一)
- IXI MEGA声卡M4 6 8 PIUS M2 M-NU2 NU4安装调试教程
- ECshop二次开发细节
- U盘拷贝大文件提示文件过大无法拷贝怎么解决
- RK3399平台开发系列讲解(电源管理篇)11.10、PMIC(生产者)驱动数据结构体
- php活动倒计时代码,JavaScript实现活动倒计时效果的代码分享
- 复盘总结笔记-吴志华老师讲座
- 7-5 单词首字母大写 (15分)
- 自学IOS开发第3天·基础SwiftUI之动态滑动列表(上)
- Squid之传统代理和透明代理解析实验步骤
- Azure基础:什么是云计算(2) NIST云计算模型定义
- coreldraw x4如何出血_coreldraw x4教程
- 人声计算机音乐,将人声转成MIDI imitone会哼哼就会作曲音乐软件
- Java码农进阶之路~StringBuilderStringBuffer全线修饰符
热门文章
- 【计算机网络高分笔记】第三章:数据链路层
- mysql最近7天销售额_mysql查询近七天、近三十天、近年(按月份)的所有统计数据...
- 学习bootstra前端框架2
- 计算机组成原理专有名词对应英文全称
- 【互联互通 WellYa.NET】 WeLLYa通信资源网---通信技术论坛:
- 100个名著浓缩一句话
- GPFS——三大关键组件
- MMC卡的安装与使用注意事项
- 【网站SEO优化】选择什么样的关键词最重要!
- 【XSS漏洞-02】XSS靶场介绍(含BlueLotus_XSSReceiver、DVWA、XSS-labs等)