Java基础总结--IO总结1

1.IO流(数据流)主要应用概述
数据来源:存储在设备里面
* IO流用来处理设备间数据之间的传输
* Java对数据的操作是通过流的方式
* Java用于对流的操作的对象都在IO包
* 流按照流向分为:输出流(写动作)与输入流(读动作)(相对于程序来说)
读写的方式不同造成被封装成不同的对象
* 按照一次操作数据的字节数目:字节流(1B)与字符流(2B)
以前无字符流:ASCII码1B--表达英语的文字数字,随机计算机普及,为了表示更多国家的语言,兼容了许多国家的码表,这样不利于信息沟通,统一出了unicode编码用来表示众多语言的文字和符号,特点是任何字符用2B表示--比较浪费资源(后面会出现不同的编码方式优化这些问题)。一个中文字在不同码表里面编码不一样,所以希望在读取文字信息的时候按照unicode编码方式,对于同一信息,获取相同的结果
所以使用字符流处理文字。
* 字符流来历:字节流读取字节数据后,不直接操作而是先查指定的编码表获取对应的字,在对文字进行操作==字节流+编码表

2.具体的IO对象
共性抽取--获得IO流的根类(抽象类)
字节流:InputStream OutputStream
字符流:Reader Writer
其子类均是以其相应的后缀结尾的,对象名的前缀是功能

3.传送文字信息 内存--硬盘的文件(优先考虑字符流的输出流Writer)
找到可以操作文件的Writer
Writer-->OutputStreamWriter-->FileWriter
* 必须明确存储数据的目的地--文件名
* 文件不存在会自动创建,文件存在且有数据,文件会被覆盖(删除+创建新文件)
* 输入或输出异常--IOException最好要进行处理
具体步骤:
1.FileWriter fw = new FileWriter("demo.txt");
2.调用Writer的写方法void write()-参数可以是字符串,字符数组,int
fw.write("abcd");--此时数据被临时存储缓冲区
3.进行刷新--将缓冲区流存储在目标文件中
fw.flush();
4.关闭Windows资源
fw.close()--一般写在try-catch-finally(一定会执行)
close()由来--Java程序,记事本程序等写入硬盘文件的操作其实都是调用windows底层的输出流,所以在写操作进行完后,必须将此流占有的资源释放
注意:关闭资源的时候会先刷新close(){flush()}
流关闭后不能在写数据,但是刷新后可以继续写
要实现换行,直接那操作系统的换行命令操作
追加数据FileWriter(String filename, boolean append)-追加true
close与flush区别:后者相当于打开文件写保存,后者要关闭文件时候,询问是否要保存,关闭文件。再次打开文件就是新的流。

4.异常处理IOException(只要读写就可能会发生异常)
文件不存在,写失败,关闭底层资源也会抛出异常
利用try(里面放肯发生异常的语句)-catch-finally(close())
注意:声明在try外面,里面进行对象的初始化
关闭资源的时候先判断是否为空指针,在进行关闭动作

5.从文件中读数据,将其打印在控制台 FileReader
read-读单个字符,字符数组等
* 创建都文件的对象,确定要读取的文件名和存在性
FileReader fr = new FileReader(String filename);-找不到文件就发生异常
* 用Reader里面的read()方法读单个字符
fr.read()-int(0-655235 char的一个字符的范围);读取到结尾会返回-1表示结束
read()方法其实是和底层的操作系统关联,读到结尾出,把结束标识传给JVM,然后JVM自定义一个符合传给调用者。
* 通常将都的动作放在循环里面
* 第二种读的方法(效率比较高)
int read(char[] cbuf)--返回读的字符的个数.结尾为-1,将读到的字符存在字符数组里面。注意:空格也算是一个字符。字符数组的长度固定
int num = fr.read(ch);//数据读到字符数组里面
System.out.println(num + " " + new String(ch));3 abc
int num1 = fr.read(ch);//数据读到字符数组里面 2 dec
System.out.println(num1 + " " + new String(ch));//覆盖前两个元素
总结上面:写成循环
从硬盘上取数据必须是一个一个取,字符数组相当是取一个放进去,等达到个数后
再统一进行处理。
关于字符数组长度1024的整数倍
eg:把一个文件复制到另一个文件里面--复制原理先读后写-字符流
1.创建读取文件的字符流对象
2.创建一个目的,用来存储读到的数据
3.频繁的读写操作
4.关闭资源
注意:一次读一写一,累计多个后再写
write(char[] cbuf, int off, int len) --多个读时候写方法的选择

6.字符流的缓冲区--用数组来缓冲流中的数据
出现的原因:提高对数据读写的效率--Java将其封装为两个对象
对应的类:BufferedReader(字符,字符数组行)/BufferedWriter(字符,字符数组)

缓冲区的使用:要结合对应的流进行使用,在流的基础上对流功能的增强
缓冲区:对要操作的数据进行临时存储,磁头切换次数少,效率高
代码优化:设计优化(代码重构),性能优化(增加功能-缓冲区)eg:超市拿框
缓冲区必须结合流来进行操作才会起到作用--提高效率
具体写数据流程--使用缓冲流
//创建写成流
FileWriter fw = new FileWriter("demo3.txt");
//创建写成字符缓冲流对象和字符写出流进行关联
BufferedWriter bw = new BufferedWriter(fw);
//使用缓冲流的写方法-连续写操作
bw.write("ggsghjdjcjmdkkdkd");
//刷新数据到目标文件
bw.flush();
//关闭资源--其实底层关的是fw,缓冲仅仅是提高效率
bw.close();
[字符写入流不断的写数据不处理,放在写缓冲流中在特定的时间统一操作]
换行LINE_SEPARATOR 定义该常量,传递给System.getProperties();-优先选择
也可以使用方法换行bw.newLine();
字符缓冲读取流--readLine()-String表示读一行(行是根据回车符判断)
可以利用循环返回值为null时候,控制循环
[读字符流不断的读出数据不处理,放在缓冲流中在特定的时间统一操作]
BufferedReader重写了父类的方法,读的时候父类从源读数据,缓冲区方法从缓冲区进行读取数据--就是不需要直接读取内存,而是直接操作缓冲区,为了让用户读文本更便捷-读一行--将read方法的字符进行判断,越到换行,就停止不包含换行符

6.模拟readLine()功能的实现
* 先实现read()-在缓冲区读
创建数组,调用FileReader的read(char[]ch),定义两个变量分别表示数组中剩余的字符count,和数组的角标pose.
* 当缓冲区为0时候,开始往缓冲区方数据count = r.read(buff);pose = 0
* count < 0的时候直接返回-1
* 其他情况直接取字符 int ch = buff[pose++],count--;
实现readLine()方法
* 创建新的缓冲区StringBuilder
* 循环加入元素调用myRead()
* 循环中分别判断\r使用continue;和\n 返回字符串。
* 其他情况读到尾巴返回null
* 注意enter键对应的是 \r+\n 读到\n后在会换行

7.装饰设计模式--对某种功能的增强
缓冲区主要作用:将读取源数据进行存储,提供对该缓冲区操作的方法,把读内存改为读缓冲区。缓冲区的出现对字符流的操作进行功能的提升--装饰着模式
装饰者模式:对已有的东西进行增强,主体还是原来的东西
装饰者与继承的区别:
*相同点:装饰和继承都能实现对功能的扩展
*对于继承来说:首先有一个继承体系,下面有各种子类对象,为了更好的操作并提 高效率必须在产生新的子类提供功能的扩展,这样就会导致继承体系的臃肿,不灵 活,关系一旦产生,关系很难去除。
* 装饰着模式:产生新类对旧的类功能的扩展,在结合已经存在的子类对某个功能的 扩展的实现,使得类之间的关系没有特别紧密。比较灵活
* 使用装饰者模式的要求
装饰者与被装饰者具有同一个父类或同一个父接口(具有相同的方法功能的增强)
eg:BufferedReader& FileReader--Reader

8.LineNumberReader(BufferedReader子类也是装饰者)--获取设置当前行号
setLineNumber(int lineNumber)
getLineNumber()
BufferedReader的增强版本

9.字节流-操作字节、字符以及其他的媒体文件
操作思想和字符流完全一致
* InputStram/OutputStream--字节流用的缓冲区是字节数组byte[]b
写不进缓冲直接去目的地,不用刷新,直接关闭资源。写的是原码
avaliable()-int 可操作的字节数目;
* 字节流的应用--复制mp3
1.自定义缓冲区FileInputStram 2.使用封装的BufferedInputStram(写要刷新)
注意:不能用字符流读图片,因为字符流会把所以字节拿到后在去查码表解析,但是对于文字有固定的码表对应,对于图片无固定的码表,所以可能存在找不到对于信息的情况,所以复制图片不能代表原来的图片

时间: 2024-11-06 15:01:24

Java基础总结--IO总结1的相关文章

java基础之IO

java基础之IO 1,字节流与字符流常用方法: public class testIO { /** * 字符输入输出流实现文件的复制(类比字节操作) * @throws IOException * */ @Test public void testWriterReaderFileCopy() throws IOException{ Reader read = new FileReader("cyq1.txt"); Writer write = new FileWriter("

java基础篇IO流的规律

前两篇降了IO流中的字节流和字符流复制的例子,今天来总结一下IO流的规律 掌握好IO流的规律,再开发中会很好用 下面来总结一下: 1,明确源和目的 源:输入流 InputStream 和Reader 目的:输出流 OutputStream 和Writer 2,操作的数据是否是纯文本. 是:使用字符流 不是:使用字节流 3,当体系明确后,在明确要使用哪个具体的对象,通过设备来进行区分 源设备: 内存,硬盘,键盘 目的设备: 内存,硬盘,控制台 这里的源就是你想进行的操作,比如说你想从c盘复制一个文

JAVA 基础之 IO复习

一.文件: 在IO包中唯一与文件相关的类就是 File类. File类中常用的常量和方法 1.创建文件: 指定路径和将要创建的文件名字以及类型: 然后调用 createNewFile()方法 File file = new File("D:"+File.separator+"MyJavaProgram"+File.separator+"hello.java"); file.createNewFile(); 2.删除文件: 指定路径和文件,包括类型

Java基础: IO操作

最近抽了点时间回顾了java基础,昨天看了java的IO操作,把大致的总结写在这里. Java的IO操作主要是数据的输入.输出操作和文件管理,输入输出操作可以包括控制台.文件的输入输出和流的输入输出,流的输入输出可以用于文件,也可以用于网络数据. 控制台 控制台的输入输出中,输出大家最熟悉,最常用的就是System.out,那么输入操作可以用System.in,也可以System.console,区别是前者读入字节,后者读入字符串 文件处理 File类:可以实现对文件目录和文件的增删改,查看文件

java基础之IO流(一)

java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典型数据源与目标媒介包括磁盘.网络.内存等等. IO流的分类: 按流向分为:输入流和输出流(本地内存为参考) 按处理数据单位:字符流和字节流 按照是否与特定的地方相连(磁盘.网络.内存):节点流和处理流 节点流:可以从或向一个特定的地方(节点)读写数据. 处理流:是对一个已存在的流的连接和封装,通过所

Java基础之IO技术(一)

---恢复内容开始--- Java基础中的IO技术可谓是非常重要,俗话说的好,万丈高楼起于垒土之间.所以学习Java一定要把基础学好,今天我们来学习IO技术的基础. IO无非就是输入与输出,而其中处理的数据无非是字符与字节.字符最简单的定义就是这个数据是否是纯文本组成,除此之外所有的都是字节.Java给我们提供了字符和字节的处理,其中字符的处理有Writer和Reader两个抽象父类(分别对应的是写和读),字节的处理有OutputStream和InputStream两个抽象类(分别对应的是写和读

java基础之IO操作

IO操作 ·文件类的使用(File) ·IO中流的基本使用(字符流.字节流.内存流.打印流) ·System类对IO的支持 ·对象序列化的问题 在整个的IO操作中,流的操作分为两种: ·字节流 字节输出流:OutputStream 字节输入流:InputStream ·字符流 字符输出流:Writer 字符输入流:Reader IO操作的基本步骤: 在Java的使用io的话,必须要按照以下的几个步骤进行(对文件操作来说): ·使用File找到一个文件 ·使用字节流或者字符流的子类为OutputS

Java 基础 - 基本 IO

基本 IO 重要接口 重要类 字节类 InputStream 特点: 读取字节流的抽象类 BufferedInputStream 特点: 用字节缓冲区来从 InputStream 中读取流 缓冲区默认大小是 8K, 可能会增长 实现了 mark() 和 reset() 方法 fill() 方法 ByteArrayInputStream 特点: 从内存中的字节数组的字节读取流 实现了 mark() 和 reset() DataInputStream 特点: 允许从下层流中以Java基本数据类型 一

java基础知识----IO篇

写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,文章依旧以例子为主,因为讲解内容的java书很多了,我觉的学以致用才是真.代码是写出来的,不是看出来的. 最后欢迎大家提出意见和建议. [案例1]创建一个新文件 1 2 3 4 5 6 7 8 9 10 11 import java.io.*; class hello{     public static void main(String[] args) {         File f=new File("D:\\he