Java输入输出流和文件操作

操作系统中的文件和目录概念

文件与文件系统

文件是信息的一种组织形式,是存储在外部存储介质上的具有标志名的一组相关信息集合。
文件系统用文件概念来组织和管理存放在各种介质上的信息。文件系统提供目录机制实现文件的“按名存取”。

目录结构与文件检索

目录是文件系统组织和管理文件的基本单位,目录中保存它所管理的每个文件的基本属性信息(成为文件目录项或文件控制块)。除了文件外,目录中还可以包含子目录和文件,子目录中还可以再有子目录和文件,由此构成目录的多级树状结构。文件是这种树状结构的叶子节点,文件中不能包含另一个文件。

在多级树状目录结构中,一个文件的全名由该文件的路径名和文件名组成。一个文件的路径名由根目录开始沿各级子目录到达该文件的路径上的所有子目录名组成。

文件的逻辑结构

文件是文件系统中最小的数据组织单位,目录机制提供文件之间的分类和组织方式。
文件的组织是指文件中信息的配置和构造方式。文件的组织包含两方面:逻辑结构存储结构。文件的逻辑结构是从用户角度所观察到的文件中信息的组织方式,文件的存储结构是文件在外部存储器上的实际存放方式。
按照文件的逻辑结构,文件可以划分为两大类:流式文件记录式文件
流式文件由字节序列或字符序列组成。流式文件内的信息不再划分结构,只是具有顺序关系的一系列字节或字符集合,字节或字符是信息的最小单位。
记录式文件是一种有结构的文件,包含若干记录。记录是文件中按信息在逻辑上的独立含义划分的一个信息单位,记录在文件中的排列具有顺序关系。记录是文件内独立的最小信息单位,操作系统每次操作至少存储、检索或更新一个记录。记录可以被进一步划分为若干个更小的数据项,数据项是具有标志名的最小的不可分割的数据单位。数据项的集合构成记录,相关记录的集合构成文件。对记录的划分及对数据项的类型描述,均由应用程序完成。

文件的存取方式

存取方式是操作系统为应用程序听的使用文件的技术手段。文件类型、文件的逻辑结构决定文件的存取方式。文件的存取方式主要有顺序存取随机存取索引存取
①顺序存取是指按记录顺序进行读/写操作的存取方式。
②随机存取是指按记录序号进行读/写操作的存取方式。
③索引存取是基于索引文件的存取方法。由于文件中的记录不按它在文件中的位置,而按它的记录键来编址,所以用户提供给操作系统记录键后就可查找到所需记录。

文件的使用方式

针对用户和应用程序两种不同的对象,操作系统通过操作接口应用程序接口两种方式提供其功能和服务,对文件系统亦是如此。
①操作接口:操作系统将其功能和服务以操作命令形式提供给用户,用户以手动方式对文件系统等进行操作,实现人机交互功能。
②应用程序接口:操作系统将其功能和服务以系统调用(system call)形式提供给应用程序。

流的概念

流的定义和作用

流(stream)是指一组有顺序的、有起点和终点的字符集合,是对数据传输的总称和抽象。换言之,数据在两个对象之间的传输称为流。
对流进行读/写操作的最小单位是字节,即一次可以写入一字节或者读取一字节。提高数据传输效率的办法是,将一块内存空间设计成缓冲区(buffer),暂时存放待传送的数据,通过缓冲区可以一次读/写若干字节,缓冲区使数据能够以较大的数据块形式传送,从而能够显著地提供数据传输效率。配备缓冲区的流成为缓冲流(buffered stream)。
设计流的作用是使数据传输操作独立于相关设备。程序需要根据待传输数据的不同特性而使用不同的流,数据传输给指定设备后的操作由系统执行设备驱动程序完成。

流的存在

以下4种情况存在数据流动问题:
控制台应用程序的标准输入/输出操作
文件读写操作
线程通信
网络通信

Java的流类和文件类

按照流中元素的基本单位,流可分为字节流(binary stream)和字符流(character stream)。按照流的方向性,流可分为输入流输出流。每种流类都有输入流和输出流两个类。
①字节流以字节为单位读/写流,用于传输非字符数据,如整数、浮点数,对象等。InputStream和OutputStream是字节输入/输出流的根类。
②字符流以字符为单位读/写流,仅用于传输字符,包括各种字符集。Reader和Write是字符输入/输出流的根类。
File文件类记载文件属性信息,RandomAccessFile随机存取文件类以随机存取方式进行文件读/写操作。

示例

从字节流中读取1字节

import java.io.FileInputStream;
import java.io.FileOutputStream;public class Main {public static void main(String[] args) throws Exception{String filename = "a.txt";FileOutputStream fout = new FileOutputStream(filename);fout.write(-1);fout.close();FileInputStream fin = new FileInputStream(filename);int i;while ((i = fin.read()) != -1){System.out.print(i + " ");}fin.close();}
}

输出结果:

255

FileOutputStream类的write(int i)方法向字节流写入int整型i的低位一字节,FileInputStream类的read()方法从字节流中读取1字节,作为一个int整数的最低1字节,并将该整数的高位3字节补0。

从字节流中读取4字节作为一个int整数

public class Main {public static void main(String[] args) throws Exception{String filename = "a.txt";FileOutputStream fout = new FileOutputStream(filename);int value = -128;fout.write(value>>>24);fout.write(value>>>16);fout.write(value>>>8);fout.write(value);fout.close();FileInputStream fin = new FileInputStream(filename);while ((value = fin.read()) != -1){int temp;for (int i = 0; i < 3 && (temp = fin.read()) != -1; i++){value = value << 8 | temp;}System.out.println(value + " ");}fin.close();}
}

数据字节流读取操作:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class Main {public static void main(String[] args) throws Exception{String filename = "a.txt";FileOutputStream fout = new FileOutputStream(filename);DataOutputStream dout = new DataOutputStream(fout);for (int i = 0; i < 10; i++){dout.writeInt(i);}dout.close();fout.close();FileInputStream fin = new FileInputStream(filename);DataInputStream din = new DataInputStream(fin);try{while (true){System.out.print(din.readInt() + " ");}}catch (EOFException ex){//ex.printStackTrace();}finally{din.close();fin.close();}}
}

把一个对象的表示转换成一个字节流的过程称为序列化(serialization),反之,从字节流中重建对象的过程称为去序列化。对象能够序列化的标记是该类实现java.io.Serializable序列化接口,Serializable是标记接口,其中没有方法。如果要写入的对象没有实现序列化接口,则抛出java.io.NotSerializableException异常。

public class Main {public static void main(String[] args) throws Exception{String filename = "a.txt";FileOutputStream fout = new FileOutputStream(filename);ObjectOutputStream objout = new ObjectOutputStream(fout);for (int i = 0; i < 10; i++){objout.writeObject(new TreeNode((int)(Math.random() * 100)));}objout.close();fout.close();FileInputStream fin = new FileInputStream(filename);ObjectInputStream objin = new ObjectInputStream(fin);try{while (true){System.out.println(objin.readObject());}}catch (EOFException ex){}finally{objin.close();fin.close();}}
}

管道字节流实现发牌程序示例:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.IOException;public class Main {private PipedInputStream pins[];private PipedOutputStream pouts[];public Main(int cardMax, int number) throws IOException{this.pins = new PipedInputStream[number];this.pouts = new PipedOutputStream[number];for (int i = 0; i < number; i++){this.pins[i] = new PipedInputStream();this.pouts[i] = new PipedOutputStream(this.pins[i]);}new SendThread(this.pouts, cardMax).start();;for (int i = 0; i < number; i++){new ReceiveThread(this.pins[i], "PLAY" + (i + 1)).start();}}public static void main(String[] args) throws Exception{new Main(52, 4);}
}class SendThread extends Thread{private PipedOutputStream pouts[];private int cardMax;public SendThread(PipedOutputStream pouts[], int cardMax){this.pouts = pouts;this.cardMax = cardMax;this.setPriority(Thread.MAX_PRIORITY);}public void run(){DataOutputStream douts[] = new DataOutputStream[this.pouts.length];for (int i = 0; i < douts.length; i++){douts[i] = new DataOutputStream(this.pouts[i]);}try{int value = 1;while (value <= this.cardMax){for (int i = 0; value <= this.cardMax && i < douts.length; i++){douts[i].writeInt(value++);}}for (int i = 0; i < douts.length; i++){douts[i].close();this.pouts[i].close();}}catch(IOException ex){ ex.printStackTrace();}}
}class ReceiveThread extends Thread{private PipedInputStream pin;private String name;public ReceiveThread(PipedInputStream pin, String name){this.pin = pin;this.name = name;}public void run(){DataInputStream din = new DataInputStream(this.pin);while (true){try{System.out.println(this.name + "取牌" + din.readInt());Thread.sleep(100);}catch(IOException ex) { break; }catch(InterruptedException ex) {}}try{din.close();this.pin.close();}catch(IOException ex) {}}
}

使用字符流读写文本文件示例:

public class Main {public static void main(String[] args) throws Exception{String filename = "b.txt";try{FileReader fr = new FileReader(filename);FileWriter fw = new FileWriter("c.txt");BufferedReader br = new BufferedReader(fr);String line;while ((line = br.readLine()) != null){fw.write(line);fw.write('\n');}br.close();fr.close();fw.close();}catch(IOException ex){}}
}

RandomAccessFile随机存取文件类以随机存取方式进行文件读/写操作,对一个文件可以同时进行既读又写的操作;在文件指定位置读取或者写入基本数据类型。


转载:http://blog.csdn.net/foreverling/article/details/46602089

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

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

相关文章

C++复习(七)

C++构造函数 当创建一个对象时,往往需要做一些初始化工作,例如对数据成员赋值等。为了解决这个问题,C++提供了构造函数。 构造函数(Constructor)是一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户调用(用户也不能调用),而是在创建对象时自动执行。构造…

放寒假的硕博研究生将经历什么?

全世界只有3.14 % 的人关注了爆炸吧知识1月中下旬基本全国的高校都放假了&#xff0c;除了部分因为疫情滞留在学校和外地的学生&#xff0c;绝大多数的学生都会回家过年。平时自带学霸光环&#xff0c;可以借口工作学业繁忙&#xff0c;不回家&#xff0c;不用应酬&#xff0c;…

怎么在php登录首页添加样式,首页登录后怎么在首页显示用户名以及隐藏登录框?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼index.php&#xff1a;登录页面用户名&#xff1a;密码&#xff1a;没有账号&#xff1f;立即注册——————————————————————————doaction.php&#xff1a;header("Content-type:text/html;charsetutf…

.NET 6新特性试用 | HTTP日志记录middleware

前言在以前&#xff0c;通常需要我们自己编写middleware记录HTTP请求和响应。而在.NET 6中默认就有已经实现好的middleware&#xff0c;添加了对HTTP日志记录的支持。Demo要想启用HTTP日志记录middleware十分简单&#xff1a;app.UseHttpLogging();运行程序&#xff0c;发现没有…

C++复习8

C++ this指针详解 this 是C++中的一个关键字,也是一个常量指针,指向当前对象(具体说是当前对象的首地址)。通过 this,可以访问当前对象的成员变量和成员函数。 所谓当前对象,就是正在使用的对象,例如对于stu.say();,stu 就是当前对象,系统正在访问 stu 的成员函数 say…

自动化测试有感

1、 研究自动化测试也有一段时间了&#xff0c;从不熟悉到慢慢的了解&#xff0c;从不会到会&#xff0c;从迷茫到清晰...... 前段时间一直都很疑惑&#xff0c;为什么要自动化&#xff0c;自动化能给我们带来哪些好处&#xff1f;它存在的价值在哪里&#xff1f;运行一个脚本…

iOS 集合的深复制与浅复制

2019独角兽企业重金招聘Python工程师标准>>> 概念 对象拷贝有两种方式&#xff1a;浅复制和深复制。顾名思义&#xff0c;浅复制&#xff0c;并不拷贝对象本身&#xff0c;仅仅是拷贝指向对象的指针&#xff1b;深复制是直接拷贝整个对象内存到另一块内存中。 一图以…

linux实时进程优先级rt,Linux实时性- PREEMPT_RT实时抢占实现

作者&#xff1a;Paul E. McKenney翻译整理&#xff1a;土豆丝624原文链接&#xff1a;概述&#xff1a;本篇文章主要讲Linux的实时包PREEMPT_RT 是如何实现的。PREEMPT_RT 的原理PREEMPT_RT包的关键点是要使非抢占式的内核代码量尽可能的少&#xff0c;同时为了提供抢占性而必…

Adb安装程序出现TimeOut错误

为什么80%的码农都做不了架构师&#xff1f;>>> 安装Apk过程中&#xff0c;出现如下错误&#xff1a; Failed to install on device ‘XXX′: timeout 原因时设备速度太卡&#xff0c;导致启动超时&#xff0c;解决办法&#xff1a;延长超时时间。 方法&#xff…

2021.NET大会日程首发!行程亮点全曝光!

{倒计时4天文末有福利→.NET机器人定制抱枕}2021年12月18日由中国各地技术社区共同发起举办、知名企业和开源组织联合协办的2021年中国.NET开发者大会即将盛大开幕▽2020/12/18-12/19主题&#xff1a;开源共建|开放创新|开发赋能形式&#xff1a;线上直播- 长按二维码免费领票 …

C++9

C++类和new、delete操作符 在C++中,你可以像定义变量一样来创建对象,如: Student stu; //对象已被实例化,已分配内存空间,可以使用了 stu.say(); //调用成员函数 这种情况下,系统会在栈区为对象分配内存。栈区是内存中的一块区域,由系统自动分配和释放,程序员无法操控…

一个技术人的知识管理方法论

http://www.cnblogs.com/me-sa/p/my_methodology.html转载于:https://www.cnblogs.com/liushiyong1/p/3556299.html

继Science发文后,Nature也发文评论曹雪涛“误用图片”调查结果

全世界只有3.14 % 的人关注了爆炸吧知识本文转自&#xff1a;募格学术2021年1月26日傍晚 Nature 网站以头条新闻的方式刊出了题为“著名中国免疫学家没有剽窃和学术造假”的新闻并配以曹雪涛的照片&#xff0c;该新闻大篇幅报道了科技部等多部门对于中国工程院院士曹雪涛的联合…

linux运行.pak文件,使用game-to-flatpak脚本将商业Linux游戏安装程序转换为Flatpak应用程序...

现在有一个新的脚本&#xff0c;它允许你将各种商业Linux游戏的安装程序转换成可以在各种GNU/Linux发行版上运行的Flatpak软件包。这是一个开源的shell脚本&#xff0c;由GNOME开发人员Bastien Nocera开发&#xff0c;它做了一件事&#xff0c;即自动将各种格式的商业Linux游戏…

Log4j 2漏洞(CVE-2021-44228)的快速响应

简介2021 年 12 月 9 日&#xff0c;在Log4j的 GitHub 上公开披露了一个影响多个版本的 Apache Log4j 2 实用程序的高严重性漏洞 CVE-2021-44228、CVSSv3 10.0 (https://logging.apache.org/log4j/2.x) 。该漏洞由阿里云安全团队的陈兆军&#xff08;可能为音译&#xff09;发现…

Xcode4.5编译ffmpeg成功,过程说明

最近项目要用音视频的通话&#xff0c;需要用ffmpeg来实现&#xff0c;但是ffmpeg在iOS平台上的编译有些问题。 1 下载代码 1.下载ffmpeg源代码 git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg 参考&#xff1a;http://ffmpeg.org/download.html 2.下载ffmpeg-iphone…

何时使用[self release]

这样的语句 [self release];乍看上去让人很困惑。 从release方法本身的作用上来说&#xff0c;就是给self的引用技术减一&#xff0c;就像release对其他对象所做的一样。一般来说&#xff0c;唯一用到&#xff0c;也是最合适使用 [self release];这一写法的地方是在initXXX方法…

C++10

C++友元函数和友元类 一个类中可以有 public、protected、private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员。现在,我们来补充介绍一个例外——友元(friend)。 fnend 的意思是朋友,或者说是好友,与好友的关系显然要比…

box2d 绘制圆

在让刚体听我的——ApplyForce、ApplyImpulse、SetLinearVelocity一节中&#xff0c;来自天地会的sxl001问道如何创建圆形的边界(Round Boundary)&#xff0c;好吧&#xff0c;我用这个教程来回答他。 实际上Box2D中没有专门创建圆弧的API (b2CircleDef创建的是实体圆形不是圆弧…