第十五章 I/O(输入/输出)流

15.1 输入/输出流

流是一组有序的数据序列,可分为输入流和输出流两种。

程序从指向源的输入流中读取源中数据,源可以是文件、网络、压缩包或者其他数据源

输出流的指向是数据要到达的目的地,输出流的目标可以是文件、网络、压缩包、控制台和其他数据输出目标

15.1.1 输入流

InputStream类是字节输入流的抽象类,他是所有字节输入流的父类。InputStream类的具体层次结构如下:

read()方法:从输入流中读取数据的下一字节。返回0~255的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回值为-1.
read(byte[]b):从输入流中读入一定长度的字节,并以整数的形式返回字节数。
mark(int readlimit)方法: 在输入流的当前位置放置一个标记,readlimit参数告知此输入流再标记位置失效之前允许读取的字节数。
reset()方法:将输入指针返回到当前所做的标记处。
skip(long n)方法:跳过输入流上的n个字节并返回实际跳过的字节数。
markSupported()方法:如果当前流支持mark()/reset()操作就返回turn。
close方法:关闭此输入流并释放与该流关联的所有系统资源。
 

并不是所有的 InputStream类的子类都支持 InputStream 类中定义的所有方法、如skip0、mark0、Tset0等方法只对某些子类有用。

Java 中的字符是Unicode 编码,是双字节的。InputStream 类是用来处理字节的,并不适合处理字符文本。Java为字符文本的输入专门提供了一套单独的类,即Reader 类,但Reader 类并不是InputStear类的替换者,只是在处理字符串时简化了编程。Reader 类是字符输入流的抽象类,所有字符输入流的实现都是它的子类。Reader 类的具体层次结构如图所示。

15.1.2 输出流 

OutputStream类是字节输出流的抽象类,此抽象类是表示输出字节流的所有类的超类

OutputStream类中的所有方法均返回void,在遇到错误时会引发IOException异常,

1.write(intb)方法:将指定的字节写入此输出流。

2. writebyte[]b)方法:将b个字节从指定的byte 数组写入此输出流。

3.write(byte[ b,int off,int len)方法:将指定 byte 数组中从偏移量of开始的len个字节写入此输

出流。

4.fush0方法:彻底完成输出并清空缓存区。

5.close0方法:关闭输出流。

Writer 类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。Writer 类的层次结构如:

15.2 File类


File 类是 java.io包中唯一代表磁盘文件本身的类。File类定义了一些与平台无关的方法来操作文件,可以通过调用 File类中的方法,实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本身的一些信息,如文件所在的目录、文件的长度、文件读写权限等。数据流可以将数据写入文件中,文件也是数据流最常用的数据媒体

15.2.1 文件的创建与删除


可以使用File类创建一个文件对象。通常使用以下3种构造方法来创建文件对象。

1. File(String pathname)

该构造方法通过将给定的路径名字符串转换为抽象路径名来创建一个新File实例。语法如下:
 

new File(String pathname)

其中,pathname代表路径名称(包含文件名)。例如

File file = new File("d:/1.txt");

2. File(String parent,String child)

该构造方法根据定义的父路径和子路径字符串(包含文件名)创建一个新的File对象。语法如

new File(String parent, String child)

3. File(File f, String child)

该构造方法根据f抽象路径名和child路径名字符串创建一个新File实例。语法如下

new File(File f,String child)

f:父路径对象,如D:/doc/。

child:子路径字符串,如letter.txt。

当使用 File类创建一个文件对象后,例如:

Re lie =new FileCword.txt");

知果当前目录中不存在名称为word的文件,File 类对象可通过调用createNewFile0方法创建一个名称

wndtxt 的文件;如果存在word.txt文件,可以通过文件对象的deleteO方法将其删除,如例15.1所示。

例题

import java.io.File;
import java.io.IOException;
public class FileText {private static File[] files;public static void main(String[] args) {// TODO Auto-generated method stub/*	File file=new File("c:\\happy\\word.txt"); //创建文件对象if(file.exists()) {//如果文件存在file.delete(); //如果文件删除System.out.println("文件已删除");       printAllFiles(f);}else {                                 //如果文件不存在try {                     //try语句块捕捉可能出现的异常file.createNewFile(); //创建新文件System.out.println("文件已创建");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}*/File file=new File("C:\\happy");printAllFiles(file);}private static void printAllFiles(File file) {File[] files = file.listFiles();for(File f : files){if(f.isDirectory()) {System.out.println("------- " + f.getName() + " -------");printAllFiles(f);}else {System.out.println(f.getName());}}
}}

运行结果如下:

15.2.2 获取文件信息

例题15.2

import java.io.File;public class FileText2 {public static void main(String[] args) {// TODO Auto-generated method stubFile file=new File("c:\\happy\\word.txt"); //创建文件对象if(file.exists()) {String name=file.getName();  //获取文件名称long length=file.length();  //获取文件长度boolean hidden=file.isHidden(); //判断文件是否为隐藏文件System.out.println("文件名称:"+name);System.out.println("文件长度是:"+length);System.out.println("该文件是隐藏文件吗?"+hidden);}else {//如果文件不存在System.out.println("该文件不存在");}}}

 运行结果如下:

15.3 文件输入/输出流


程序运行期间,大部分数据都在内存中进行操作,当程序结束或关闭时,这些数据将消失。如果需要将数据永久保存,可使用文件输入/输出流与指定的文件建立连接,将需要的数据永久保存到文件中。本节将讲解文件输入/输出流。

15.3.1  FilelnputStream 与 Fileouisieam 类


FilelnputStream 类与FileOutputStream类都用来操作磁盘文件。如果用户的文件读取需求比较简单,则可以使用FileInputStream 类,该类继承自 InputStream 类。FileOutputStream 类与FilelmputStream类对应,提供了基本的文件写入能力。FileOutputStream类是OutputStream类的子类。

FileinputStream 类常用的构造方法如下:

 FileinputStream(String name)

 FilelnputStream(File file)

第一个构造方法使用给定的文件名 name 创建一个FilelnputStream对象,第二个构造方法使用File对象创建FilelnputStream 对象。第一个构造方法比较简单,但第二个构造方法允许在把文件连接输入流之前对文件做进一步分析。

FileOutputStream 类有与FilelnputStream类相同的参数构造方法,创建一个FileOutputStream 对象时,可以指定不存在的文件名,但此文件不能是一个已被其他程序打开的文件。下面的实例就是使用FileinputStream 类与FileOutputStream类实现文件的读取与写入功能的。

例题15.3

import java.io.File;                   //缓冲流                //字节流  FileOutputStream输出流   FileInputStream输入流
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class FileStreamDemo {public static void main(String[] args) throws IOException {// TODO Auto-generated method stubFile file = new File("C:\\happy\\word.txt");FileOutputStream out = new FileOutputStream(file); //输出字节流byte[]by = "hello world".getBytes(); out.write(by);  //往文件中写入数据out.close();FileInputStream in = new FileInputStream(file);byte[] by1 = new byte[1024];int len = in.read(by1);System.out.println(new String(by1,0,len));//从零号位开始打印,只打印len长度}}

运行结果如下:

15.3.2 FileReader 和 FileWriter类
使用FileOutputStream 类向文件中写入数据与使用FilelnputStream类从文件中将内容读出来,都存在一点不足,即这两个类都只提供了对字节或字节数组的读取方法。由于汉字在文件中占用两个字节,如果使用字节流,读取不好可能会出现乱码现象,此时采用字符流 FileReader 类或 FileWriter 类即可是兔这种现象。

FileReader 类和 FileWriter 类对应了FileInputStrcam 类和FileOutputStrcam 类。FileReader 类顺序地读取文件,只要不关闭流,每次调用 read0方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭.

 例题15.4
 

import java.io.BufferedReader;                //文件流
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;                        //字符流   FileWriter输出流  FileReader输入流
import java.io.FileWriter;
import java.io.IOException;public class FileReaderDemo {public static void main(String[] args) throws IOException {// TODO Auto-generated method stubFile file = new File("C:\\happy\\word.txt");FileWriter writer = new FileWriter(file);  //输出字符流//char[]by = new char[] {'h','e','l','l','o'}; //输入数据//带缓存的输出流BufferedWriter bw = new BufferedWriter(writer); //BufferedWriter缓存流//String str="门前大桥下,游过一群鸭";bw.write("门前大桥下,游过一群鸭");bw.newLine();                       //换行bw.write("快来快来数一数,二四六七八");bw.newLine();bw.write("咕嘎咕嘎,真呀真多");bw.newLine();bw.write("数不清到底多少鸭");bw.close();//writer.write(str);  //往文件中写入数据writer.close();FileReader reader = new  FileReader(file);/*char[] ch1 = new char[1024];int len = reader.read(ch1);System.out.println(new String(ch1,0,len));*/BufferedReader br =new  BufferedReader(reader);String s1 = br.readLine();System.out.println("第一行:"+ s1);System.out.println("第二行:"+ br .readLine());System.out.println("第三行:"+ br .readLine());System.out.println("第四行:"+ br .readLine());reader.close();}}

 运行结果如下:

15.4 带缓存的输入/输出流


缓存是VO的一种性能优化。缓存流为VO流增加了内存缓存区,使得在流上执行skip0、markO和reset0方法都成为可能

15.4.1  BufferedInputStream 与BufferedOutputStream类


BufferedInputStream 类可以对所有 InputStream 类进行带缓存区的包装以达到性能的优化。BufferedInputStream 类有两个构造方法:

1. BufferedInputStream(InputStream in)

2.BufferedInputStream(InputStream in,int size)

第一种形式的构造万法创建了一个有32个字节的缓存区;第二种形式的构造方法按指定的大小来创建缓存区。一个最优的缓存区的大小,取决于它所在的操作系统、可用的内存空间以及机器配置。从构造方法可以看出,BufferedInputStream对象位于InputStream类对象之后。图15.7描述了带缓存的字节流读取文件的过程。
使用BufferedOutputStrcam 类输出信息和仅用0utputStream 类输出信息完全一样,只不过BufferedOutputStream 有一个fushO方法用来将缓存区的数据强制输出完。BufferedOutputStream类也有两个构造方法:

1. BufferedOutputStream(OutputStream in)

2. BufferedOutputStream(OutputStream in,int size)

第一种构造方法创建一个有32个字节的缓存区,第二种构造方法以指定的大小来创建缓存区。
 

15.4.2 BufferedReader 与 BufferedWriter类


BufferedReader 类与BufferedWriter 类分别继承Reader 类与Writer 类。这两个类同样具有内部缓存机制,并能够以行为单位进行输入/输出。

BufferedReader 类常用的方法如下:

区readO方法:读取单个字符。

区readLine0方法:读取一个文本行,并将其返回为字符串。若无数据可读,则返回null.

BufferedWriter 类中的方法都返回void。常用的方法如下:

write(String s,int off, int len)方法:写入字符串的某一部分。

flushO方法:刷新该流的缓存。

newLineO方法:写入一个行分隔符。

在使用 BufferedWriter 类的WriteO方法时,数据并没有立刻被写入输出流,而是首先进入缓存区中。如果想立刻将缓存区中的数据写入输出流,一定要调用flushO方法。

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class BufferedDemo {public static void main(String args[]) {String content[] = { "好久不见", "最近好吗", "常联系" };// 写入的内容File file = new File("C:\\happy\\word.txt"); // 创建文件对象try {FileWriter fw = new FileWriter(file); // 文件字符输出流BufferedWriter bw = new BufferedWriter(fw); // 换成输出流for (int k = 0; k < content.length; k++) { // 遍历要输入的内容bw.write(content[k]); // 写入字符串bw.newLine(); // 写入一个换行符}bw.close(); // 关闭缓冲输出流fw.close(); // 关闭文件字符输出流} catch (IOException e) {e.printStackTrace();}try {FileReader fr = new FileReader(file); // 文件字符输入流BufferedReader br = new BufferedReader(fr);// 缓冲输入流String tmp = null; // 作为缓冲的临时字符串int i = 1; // 行数// 从文件中读出一行,如果读出的内容不为null,则进入循环while ((tmp = br.readLine()) != null) {System.out.println("第" + i + "行:" + tmp); // 输出读取的内容i++; // 行数递增}br.close(); // 关闭缓冲输入流fr.close(); // 关闭文件字符输入流} catch (IOException e) {e.printStackTrace();}}
}//例题15.5

 运行结果如下:

15.5 数据输入/输出流
数据输入/输出流(DataInputStream 类与DataOutputStream类)允许应用程序以与机器无关的方式从底层输入流中读取基不)ava数据类型。也就是说,当读取一不数据时,不必再关心这个数值应当是哪种字节。DatalnputStream 类与DataOutputStream类的构造方法如下。
 

1. DatalnputStream(InputStream in):使用指定的基础 InputStream 对象创建一个DataInputStream

对象

2. DataOutputStream(OutputStream out):创建一个新的数据输出流,将数据写入指定基础输出流

DataOutputStream 类提供了将字符串、double 数据、int 数据、boolean数据写入文件的方法。其中,将字符串写入文件的方法有 3种,分别是writeBytes(String s)、writeChars(String s)、writeUTF(String s)。由于Java 中的字符是Unicode 编码,是双字节的,writeBytesO方法只是将字符串中的每一个字符的低字节内容写入目标设备中;而writeCharsO方法将字符串中的每一个字符的两个字节的内容都写到目标设备中;writeUTFO方法将字符串按照UTF 编码后的字节长度写入目标设备,然后才是每一个字节的UTF 编码。

DatalnputStream 类只提供了一个readUTFO方法返回字符串。这是因为要在一个连续的字节流读取一个字符串,如果没有特殊的标记作为一个字符串的结尾,并且不知道这个字符串的长度,就无法知道读取到什么位置才是这个字符串的结束。DataOutputStream 类中只有writeUTFO方法向目标设备中写入字符串的长度,所以也能准确地读回写入字符串。

 例题15.6
 

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class DataStreamDemo {public static void main(String[] args) throws IOException {// TODO Auto-generated method stubFile file = new File("C:\\happy\\word.txt"); // 创建文件对象FileOutputStream fos = new FileOutputStream(file);DataOutputStream dos = new DataOutputStream(fos);dos.writeBoolean(false);dos.writeUTF("你好世界");dos.writeDouble(13.25);dos.close();fos.close();FileInputStream fis = new FileInputStream(file);DataInputStream dis = new DataInputStream (fis);System.out.println(dis.readBoolean());System.out.println(dis.readUTF());//输出字符串System.out.println(dis.readDouble());dis.close();fis.close();}}

 运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/168671.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习笔记 - 特斯拉的占用网络简述

一、简述 ​ 2022 年,特斯拉宣布即将在其车辆中发布全新算法。该算法被称为occupancy networks,它应该是对Tesla 的HydraNet 的改进。 自动驾驶汽车行业在技术上分为两类:基于视觉的系统和基于激光雷达的系统。后者使用激光传感器来确定物体的存在和距离,而视觉系统…

【tg】6: MediaManager的主要功能

【tg】2:视频采集的输入和输出 的管理者是 media manager‘ media 需要 network的支持:NetworkInterface friend class MediaManager::NetworkInterfaceImpl;NetworkInterfaceImpl 直接持有 MediaManager 的指针即可:发送rtp包、rtcp包、设置socket选项?

小程序 swiper滑动

整个红色区域为可滑动区域&#xff0c;数字1区域为展示区域&#xff0c;数字2为下一个展示模块 <scroll-view class"h_scroll_horizontal" enhanced"ture" bind:touchend"touchEnd" bind:touchstart"touchStart"><view clas…

从昏暗到明亮—改善照明环境,提升编程效率

作为一名程序员博主&#xff0c;长时间写代码、写博客&#xff0c;对着电脑屏幕的生活方式已经渐渐成为了我的日常。 然而&#xff0c;这种生活方式却给我的眼睛带来了相当大的压力。每当一天的工作结束&#xff0c;我的眼睛总是感到干涩、疲劳&#xff0c;让我感到不舒适。&am…

基于C语言 --- 自己写一个通讯录

C语言程序设计笔记---039 C语言之实现通讯录1、介绍C/C程序的内存开辟2、C语言实现通讯录2.1、ContactMain.c程序大纲2.2、Contact2.h2.3、Contact2.c2.3.1 InitContact( )初始化通讯录函数2.3.2 AddContact( )添加联系人和CheckCapaticy( )检查容量函数2.3.3、ShowContact( )显…

模式识别——高斯分类器

模式识别——高斯分类器 需知定义特殊情况&#xff08;方差一致&#xff09;Sigmoid 需知 所有问题定义在分类问题下&#xff0c;基于贝叶斯决策 定义 条件概率为多元高斯分布&#xff0c;此时观测为向量 X X 1 , X 2 , . . . , X n X{X_1,X_2,...,X_n} XX1​,X2​,...,Xn​…

Docker Service 创建

Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 service 只能依附于 docker swarm 集群&#xff0c;所以 service 的创建前提是&#xff0c;swarm 集群搭建完毕。 1. 创建 service docker service create 命令用于创建 service&#xff…

【C++项目】高并发内存池第二讲中心缓存CentralCache框架+核心实现

CentralCache 1.框架介绍2.核心功能3.核心函数实现介绍3.1SpanSpanList介绍3.2CentralCache.h3.3CentralCache.cpp3.4TreadCache申请内存函数介绍3.5慢反馈算法 1.框架介绍 回顾一下ThreadCache的设计&#xff1a; 如图所示&#xff0c;ThreadCache设计是一个哈希桶结构&…

前端领域的插件式设计

插件&#xff0c;是一个常见的概念。 例如&#xff0c;当我们需要把我们前端代码中的 css 样式提取打包&#xff0c;我们可以用 webpack 的 mini-css-extract-plugin&#xff0c;或者你如果用 rollup 的话&#xff0c;可以选择 rollup-plugin-postcss。 再比如我们可以给 bab…

RDB.js:适用于 Node.js 和 Typescript 的终极对象关系映射器

RDB.js 是适用于 Node.js 和 Typescript 的终极对象关系映射器&#xff0c;可与 Postgres、MS SQL、MySQL、Sybase SAP 和 SQLite 等流行数据库无缝集成。无论您是使用 TypeScript 还是 JavaScript&#xff08;包括 CommonJS 和 ECMAScript&#xff09;构建应用程序&#xff0c…

X32位汇编和X64位区别无参函数分析(一)

前言 一、X32汇编函数无参无返回分析 二、X64汇编函数无参无返回分析 总结 前言 提示&#xff1a;以下是个人学习总结&#xff1a;如有错误请大神指出来&#xff0c;只供学习参考&#xff0c;本内容使用使用VS2017开发工具&#xff1a;语言是C&#xff0c;需要一些常见的汇编指…

MySQL1——喵喵期末不挂科

宝宝&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重要…

阶段六-Day04-MyBatis2

一、别名 Alias 1. 为什么使用别名 一般映射文件中会包含大量<select>标签, 每个<select>中都需要配置resultType"com.bjsxt.pojo.People"&#xff0c;MyBatis提供了别名机制可以对某个类起别名或给某个包下所有类起别名&#xff0c;简化resultType取值…

sklearn-6算法链与管道

思想类似于pipeline&#xff0c;将多个处理步骤连接起来。 看个例子&#xff0c;如果用MinMaxScaler和训练模型&#xff0c;需要反复执行fit和tranform方法&#xff0c;很繁琐&#xff0c;然后还要网格搜索&#xff0c;交叉验证 1 预处理进行参数选择 对于放缩的数据&#x…

性能测试 —— Jmeter 命令行详细

我们在启动Jmeter时 会看见&#xff1a;Don’t use GUI mode for load testing !, only for Test creation and Test debugging.For load testing, use CLI Mode (was NON GUI) 这句话的意思就是说&#xff0c;不要使用gui模式进行负载测试&#xff0c;gui模式仅仅是创建脚本…

Unity 通过jar包形式接入讯飞星火SDK

最近工作上遇到了要接入gpt相关内容的需求&#xff0c;简单实现了一个安卓端接入讯飞星火的UnitySDK。 或者也可以接入WebSocket接口的。本文只讲安卓实现 我使用的Unity版本为2021.3.27f1c2 Android版本为4.2.2 1.下载SDK 登陆讯飞开放平台下载如图所示SDK 2.新建安卓工程…

【广州华锐互动】关于物理力学的3D实验实操平台

在科学的广阔领域中&#xff0c;物理力学是一个至关重要的分支&#xff0c;它探索了物体在力作用下的运动规律。然而&#xff0c;传统的物理实验往往需要复杂的设备和大量的操作&#xff0c;这对于学生来说是一项巨大的挑战。为了解决这个问题&#xff0c;广州华锐互动开发了物…

django 商品及购物车逻辑实现

基于类视图模式实现商品分类菜单接口开发 创建菜单子应用 python manage.py startapp menu测试 apps/menu/views from django.http import HttpResponse from django.views import Viewclass GoodsMainMenu(View):def get(self,request):print("get请求")return …

二叉搜索树进阶--AVL树详细实现过程

目录 AVL树概念AVL树实现AVL树基础结构插入插入&#xff1a;左旋实现插入&#xff1a;右旋实现 AVL树完整实现代码&#xff1a; 之前学习到的二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中…

实现Traefik工具Dashboard远程访问:搭建便捷的远程管理平台

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…