java笔记09 IO流(含大量习题)

IO 流  Input Output 输入 输出
流  Stream 在计算机中输入与输出之间 运动的数据序列  流中包含  
(1)被处理过得数据  
(2)未经处理过的数据  (二进制源码)
1.字节流  Byte Stream
2.字符流  Character Stream 
FIle 文件类  
(1)如何创建文件类对象
1.File(String filaname) 创建文件名为filename 的文件对象
2.File(String path,String filename)创建文件名为 filename 存储的路径为path
File f1=new File("1.txt");
File f2=new File("c:\\test","1.txt");
3.File(File f,String filename)
备注:无论使用哪种构造方法创建文件类对象都不会创建出一个真实的文件 如果需要真正的创建文件  利用文件对象 createNewFile()
文件操作的方法 
1.boolean canRead() 判断文件类的对象是否是可读的
2.boolean  canWrite()判断文件类得对象是否可写 
3.String getName()获取文件名
4.boolean delete() 删除文件
5.boolean exists() 判断文件是否存在
6.String getAbsolutePath()获取文件对象的绝对路径
7.boolean isDirectory()判断是否是文件夹 
8.boolean  isFile() 判断是否是文件
9.boolean isHidden()判断 文件是否是隐藏
10.long lastModified() 返回最后修改的时间
11.length() 获取文件的大小  字节为单位

File  f=new File("c:\\test","abc.txt");
f.createNewFile();
1.目录(文件夹)
boolean mkdir() 创建文件夹    
常见的目录方法
1.String[] list()//获取目录下所有的文件名  
2.File[] listFiles()//获取目录下所有的文件名 是以File类对象的形式  
补充:获取文件名的时候 FilenameFilter接口  进行文件名的过滤
accept(File dir,String name)

运行可执行文件
.exe
Runtime类  
对象的构建
Runtime rt=Runtime.getRunTime()
rt.exec(File f);
字节流  
输入流和输出流
Inputstream    OutputStream
InputStream 字节流中的输入流  主要作用是从输入流中读取数据  read
常见方法
(1)int read()从输入流中读取一个字节
(2)void close() 关闭数据流
(3)int read(byte[] b)从输入流中读取数据放入到 字节数组b中
(4)int read(byte[] b,int off,int len)从数据流中读取len个字节放入到字节数组中off位置开始
OutputStream常见方法
(1)void write(int b)写入一个字节到数据流中
 (2)void close() 关闭流
(3)void write(byte[] b)写入数据流到字节数组中
(4)void write(byte[] b,int off,int len)从数据流中写入len个字节放入数组off开始的位置上
输入流对象的创建  输出流对象的创建  
FileInputStream  

FileInputStream   f=new FileInputStream (String name)
FileInputStream  f1=new FileInputStream(File f2);  
从计算机的磁盘中读取文件 将文件的内容显示控台


FileOutputStream
FileOutputStream f=new FileOutputStream(String name)
FileOutputStream f1=new FileOutputStream(f);
利用输出流  输出到一个文档中  

字符流 对字符文件读和写的时候(中文)容易产生乱码 
Reader  
1.int read() 读取一个字符
2.int read(char c[])从数据流中读取一个字符数组
3.int read(char c[],int off,int len)从输入的数据流中 读取len个字符放到c的off位置
4.long skip(long n)跳过n个字符
5.void mark() 在数据流中标记一个位置
6.boolean ready()测试数据流是否可读取
7.close()关闭流
 Writer
1.flush()刷新缓冲区 将缓冲区的内容清除
2.int write() 写入一个字符
2.int write(char c[])从数据流中写入一个字符数组
3.int write(char c[],int off,int len)从输入的数据流中 写入len个字符放到c的off位置
4.void write(String ch)将字符串输出到数据流中
FileReader 文件字符输入流    FileWirter 文件字符输出流
BufferedReader  BufferedWriter   readLine()  
利用缓冲区读 写流 文件编辑操作 

RandomAccessFile 随机访问
1.如何创建对象
(1)RandomAccessFile(String name,String mode)
(2)RandomAccessFile(File f,String mode)
mode : r  rw  读取  读写
File f =new File("a,txt");
RandomAccessFile ra=new RandomAccessFile(f,"rw");
2.对文件的操作  使用指针   
指针用法
(1)long getFilePointer()获取文件的当前位置
(2)void seek(long pos)移动指针到指定的位置上 (position)
(3)int skipBytes(int n)将指针移动n个字节
规律
(1)创建一个随机访问流的对象RandomAccessFile 指针在文件的开头处
(2)每次读写操作之后 指针都应该读写相应的字节数(指针放在文件的末尾)
(3)getFilePointer()获取指针位置
(4)seek()移动指针
RandomAccessFile 读操作
(1)boolean readBoolean()读取一个布尔值
(2)int readint() 读取一个整型数据
(3)char readChat() 读取一个字符
(4)long readLong() 读取一个长整型数据
(5)float readFloat() 读取单精度浮点型数据
(6)double readDouble() 读取双精度浮点型数据
(7)String readUTF() 读取一个UTF字符串
RandomAccessFile 写操作
(1)boolean writeBoolean()写入一个布尔值
(2)int writeint() 写入一个整型数据
(3)char writeChat() 写入一个字符
(4)long writeLong() 写入一个长整型数据
(5)float writeFloat() 写入单精度浮点型数据
(6)double writeDouble() 写入双精度浮点型数据
(7)String writeUTF() 写入一个UTF字符串
数据流
DataInputStream 数据输入流
DataOutputStream 数据输出流
允许程序以机器无关的方式读取和写入java嗯嗯原始数值 不必关心数据占用的字节数

我们这部分仍然有大量的习题。

练习题:

例1:

 

 

先在如图路径下创建一个空的txt文件。

 

我们再运行一下:

 

我们这个题如果想正确的读出文件被读取的次数,只能创建空文件。

首先实例化文件类File。并不是真的创建这个路径下的文件,而是我们要事先准备这个路径下文件。实例化文件类File可以理解为要针对这个文件进行一些操作。然后用文件输入流读取文件中的字节信息,这里读取的字节是和ASCII码对应的。所以空文件的字节为0,ASCII码也是0。此时读出的b就是0。然后我们利用输出流去写入++b。此时b就加一。但是我们现在没有再进行输入流read读取文件,此时我们输出的b就还是原来的0,只有写入之后再读取才能读取到新的值,所以这时我们输出++b就是加一后的b值。这样就能读出文件的读取次数了。这个题对于刚学io流的同学来说可能很难理解这个题为什么要这么做,别的做法为什么不行。这就要很好的理解输入流和输出流的功能作用。

例2:

 

我们新建一个文本:

 

现在文本是空的。

我们运行代码:

 

再去看我们的文本:

 

例3:

 

事先准备一个文件夹。

我们运行代码:

 

 

这是真正的创建文件的方式。

例4:

 

 

运行代码:

 

例5:

 

 

这是上一个题的第二种做法。

这两个题都是一个文件过滤器的使用。

例6:

 

 

例7:

 

 

例8:

 

 

 

运行代码:

 

例9:

 

 

 

这个和之前的代码做的事是一样的,把一个文件的内容复制粘贴到另一个文件中。但是之前我们都是用的字节流来配合文件类。这里我们是使用了字符流。使用字符流时我们要对应读写字符流创建对应的读写缓冲器。

例10:

 

新建一个路径:

 

 

 

运行代码:

 

 

例11:

我们io流还可以和集合一起使用,可以把类的数据存到集合中,再把集合中的数据存到文件中,最后再把集合的内容从文件中读出来,显示出来:

 

 

 

 

 

 我们这里使用了对象操作流,这个是用的时候比较少,就是当我们想对一个对象类型的数据进行读写时可以使用它。对象操作流:该流可以将一个对象写出,或者读取一个对象到程序中,也就是执行了序列化和反序列化操作。

例12:

 

 

我们这里用到了一个新的io流,PrintStream。

PrintStream继承了FilterOutputStream.是"装饰类"的一种,所以属于字节流体系中(与PrintStream相似的流PrintWriter继承于Writer,属于字符流体系中),为其他的输出流添加功能.使它们能够方便打印各种数据值的表示形式.此外,值得注意的是:

与其他流不同的是,PrintStream流永远不会抛出异常.因为做了try{}catch(){}会将异常捕获,出现异常情况会在内部设置标识,通过checkError()获取此标识.
PrintStream流有自动刷新机制,例如当向PrintStream流中写入一个字节数组后自动调用flush()方法.

我们先是把字符串转成字符数组写入文件中是68,然后直接用write写入数字,是输出的对应的ASCII码为D,用print方法是把数字原数输出。System.setOut(PrintStream ps):原本 system.out 是系统 standard output stream, 默认是向控制台输出信息,但是通过System.setOut方法就可以将输出定向到其他的文件或者地方。我们这里就可以把sysout的输出内容写到文件中而不是在控制台中打印。这个流真的很少用到,但是作为拓展可以了解一下。

例13:

 

 

 

我们现在还是把1.txt的内容复制到4.txt中,但是这里使用字符流, 并且用分隔符分割。这个题有点像前面两个题的结合。

 

例14:

 

 

 

我们这个题还是进行复制粘贴,用字符流和ArrayList实现。

 

 

我们这里还可以进行二分排序,但是我们这个数据涉及不到。

例15:

 

 

 

 

这里是创建了文件并且存入了数据,只不过产生了乱码,这个我们先不去解决。

我们这里是使用了数据输出流。

例16:

 

 

 

 

这个题之前有做过类似的,就是把类对象存到文件中再从文件中读出来并打印到控制台,这个还是想再练习一遍对象操作流。我们这里的类实现了 Serializable接口。所以在这里我把一些Serializable的东西说一说,这部分说实话,我用到的比较少,但是面试常常都会考,所以相关的东西还是要掌握。

什么是Serializable接口

一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。

什么是序列化?

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

为什么要序列化对象

把对象转换为字节序列的过程称为对象的序列化

把字节序列恢复为对象的过程称为对象的反序列化

例17:

我们之前的习题都是使用Io流对文件进行各种的读写操作。但是我们在学习项目的时候又很少会涉及到对文件进行操作。我们学习过项目的都知道,做一个项目都会有登录和注册的功能。我们在学习io流时和学习集合时一样都是在为之后的后端学习做一个过渡,这里我们学习io流也可以做类似的有点逻辑,有点后端影子的东西。这里我们就使用io流来模拟一个登录注册的功能:

 

 

 

 

 

我们的习题就是这些。io流实际上还是比较简单的,因为常用的就是文件类,字节流,字符流。基本的功能就是对文件的读写操作。但是这些确实以后在项目的应用当中最起码是学习阶段很难再用上了。但是为什么还说在学习java的时候io流也是很重要的一章呢?那是因为我们学习io流其实是在为以后的学习数据库做铺垫。我们之前的代码都是有时效性的,数据并不会被保存。但是学习了io流就是能把数据进行保存,只不过我们以后是用数据库实现的。

我们之前学习集合的时候是给大家分享了两个集合学习时做的伪项目。这里学了io流又可以对数据进行保存了,我在学习这部分时也做了两个伪项目,分享给大家:

项目1:

对学生信息进行添加和查找:

 

 

 

 

 

 

 

 

 

 

 

我们运行StudentManager:

 

 

可以用这种方式实现。

也可以用第二种方式,运行StudentSystem:

 

 

项目2:

IO学生管理系统(对学生进行增删改查) 

 

 

 

 

 

 

 

 

 

 

 

 

 

如果这些习题都做的滚瓜烂熟,我们的io流也就基本掌握了。 

 

 

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值