Java基础总结--IO总结2
1.键盘录入--Java具有特定的对象封装这些输入输出设备
在System类定义 in-InputStream类型和out-PrintStream类型成员变量
阻塞是方法:read()无数据就阻塞
windows里面回车键对于两个字节\r-13\n-10
从系统获得流对象只有一个,所以别关流
InputStream in = System.in(调用的是系统的流,在Java中被定义为该中类型)
不要进行关闭,因为关闭的是系统的流否则会用不了。
StingBulider/StringBuffer清空用的是delete()
键盘录入的结束通常都是自定义结束的
2.转换流(字节流与字符流之间的转化)
字节流想利用字符缓冲流的readLine()--先转化为字符流,在被缓冲流装饰
InputStreamReader和OutputStreamReader继承Reader
InputStreamReader(InputStream in)--字节流转化为字符流可以指定charset编码
对于字节与字符流的区别:字节对于一个中文需要读两次,字符对于中文其实也是利用底层的字节流读两次再进行查表,返回一个中文字符。
字符流 = 字节流 + 编码表(未指定按照操作系统默认的码表)
编码:文字转化为数字encode
解码:数字转化为文字decode
流的传送:源A地--小管道--大管道--大管道--小管道--目的B地
转化流:可以指定编码表(未指定就用本机默认和其子类相同)
中文GBK-2B/UTF-8(国际标准-按照实际长度定字节数-每字节存在编码头)
指定用UTF-8写就要用UTF-8读
* 什么时候使用转化流:
源或目是字节流操作是文本数据,可以使用转化流,提高对 文本的操作
一旦文本操作涉及具体的编码表时候,必须使用转化流
3.流操作的基本规律---流只能对传送的数据进行操作
* 明确源地和目地
* 明确数据是否是纯文本数据--确定使用的具体体系
是:字符流
否:字节流
* 明确具体的设备
源设备:
硬盘--文件
键盘--System.in
内存--数组
网络--Socket流
目设备:
硬盘--文件
控制台--System.out
内存--数组
网络--Socket流
* 是否需要提高额外功能
需要高效(缓冲区)
是否需要转换流
4.File类--将存在/不存在的文件或文件夹封装成对象
* 方便对文件或文件夹的属性信息进行操作
* File类对象可以作为参数传递给流对象
* File类的常见方法
构造方法
File(File parent, String child) //1,2类似
File(String parent, String child)
File(String pathname)
字段
char separatorChar系统默认名称分隔符\\
char pathSeparatorChar系统默认路径分隔符
常见的方法
1.获取:文件名,文件路径,文件大小(不存在就0B),文件修改时间
注意文件路径:相对路径和绝对路径(从根目录开始)
2.创建与删除(文件、文件夹)
boolean-创建createNewFile()不存在就创建,存在就不创建,与输出来不同,每次 都是进行覆盖/或者续写 --只能操作的文件或目录,不可以操作里面的数据
删除boolean-delete() windows删除从里往外删除
创建单极或多级目录(删除多级目录--只会删除最里面的一个目录)
文件正在被访问不能删除
3.判断
先文件是否存在(是否目录/是否文件-针对存在)是否隐藏
4.重命名renameTo(File dest) 重命名文件
5.获取指定的当前目录下的文件及文件夹名称 String[]-list()
(包含隐藏的文件夹)
注意:封装File对象的时候必须是目录,不能是文件名
如果目录存在,会返回一个长度为0的数组
6.文件过滤器(重点)
list(FilenameFilter filter)-String[]
FilenameFilter--文件过滤器(接口)定义类--实现FilenameFilter接口
将该类的对象传递给List()方法
过滤器方法原理:先遍历目录,放在数组中并遍历,满足条件放在容器里面,
把集合转化为数组返回
7.深度变量文件夹--对指定目录的所有目录的列出[递归]
8.递归
* 一定要明确递归的条件,否则容易栈溢出
5.Map接口的子类Properties--可以和IO技术结合--Map集合的属性集
特点:集合中键和值都是字符串类型
集合中的数据可以保存在流中,或者从流中获取
作用:通常该集合用于操作以键值对形式存在的配置文件
配置文件:存储配置信息的文件,用于配置某些应用程序<键值对,xml,数据库>
遍历集合中元素:Set<String> stringPropertyNames()--变成集合,再迭代器
Properties与流的结合
list(PrintStream out)--直接将集合信息打印在控制台
store(OutputStream out, String comments)--将集合信息存储硬盘--这就叫持久化
两个参数,前面指定写的位置,后面字符串对数据进行描述--不要写中文注释
修改硬盘上存储的键值对信息
先读文件(保证里面是键值对)--放到集合--修改--存储
load(InputStream inStream) 读数据
java里面配置信息文件命名XX.properties/ini(windows系统)/xml文件
eg:记录程序使用的次数---使用Properties--仅仅是Properties一个使用方面
配置信息--通常用在保存应用程序的个性化设置(保存设置后关掉依然存在)
注意:递归过程保证容器唯一,不要将容器定义在方法里面,要传参数容器
定义方法的时候需要确定传入的参数--针对谁进行的处理
6.其他的流对象--辅助功能
打印流(不跑出异常):PrintStream--System.out返回值
构造方法:接收File,字符串路径,流out对象
常见方法:提供操作各种数据的打印方法。print方法保存数据的表示形式
print(97)--文件里面就是97,write(97)--会选择最低的1B存储不会保留形式
实现原理:将数字变成字符串然后写字符串
PrintWriter--使用平台默认编码方式
构造方法:接收File,字符串路径,流out对象,写字符流
序列流:SequenceInputStream--对于多个流的合并--只有处理源的对象
输入流的逻辑串联--把多条流封装为一条流(SequenceInputStream)
本质就是集合中装入多个流--最后一个流返回值当作是结束
将多个源合并成一个源
eg:文件切割(按照顺序切割)+文件合并
注意切割文件时候将文件类型和文件的个数存在一个配置文件里面,因为合并
的时候需要用到这些信息
对象流:ObjectInputStream/OutputStream--为了能够保存对象数据的关联性
存储的对象--在硬盘的文件里面(对象的持久化存储)对象流+文件流的配合使用
对象流的前提:要操作的对象必须实现serializable(标记接口)将对象转化为二进制数字流--对象要按照顺序存储在文件中--writeObject(Object obj)、readObject()
注意:*存储对象仅仅只是想延长对象的生命周期,所以并不关心写出去的格式。
*读对象所在文件时候必须使用基本流+对象流才能将数据转化为一个对象
*读对象的时候必须保证有该对象的类文件在内存在+写出去的文件--两个存在 才可以成功读对象--强制转型
*写对象--序列化;读对象--反序列化(类似于编码和解码)
*关于存储对象--存储的是对象的非静态成员变量(被transient修饰的也不会 写到对象文件里面--其他并无差别--非静态数据不想被序列化)
serializable(标记接口)存在的意义?--给类加ID
存储对象--序列化的时候得到一个序列化id号(对应的类也有相同的id号),再进行读对象的反序列化的过程中,会检测加载的类与原来的类的对象id是否一致,不一致就会发生异常,就不能读对象
不同版本的编译器可能编译的id结果不一致,解决办法自己定义对象序列化id号
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
RandomAccessFile--随机访问文件--不属于任何io的继承体系--字节流
特点
* 自身具备对随机访问文件的读写功能
* 该对象内部维护了一个byte数组,并通过指针可以操作数组中的元素--数组可以延长--自动扩展
* 可以设置和获取当前指针的位置
* 其实该对象将字节输入流和字节输出流的封装--为一个整体的工具对象
* 操作随机文件---只能是文件(源/目的)
* 构造方法的特殊之处--指定操作文件的模式(读写的控制四种可选)
* 该类里面有许多有用的方法读写基本数据类型(保证原本的字节数),字节数组等
* 如果文件不存在则创建,存在则不创建-不会覆盖
* 可以指定存储和写的位置,随机的对文件操作seek(long pos)--设置当前指针位置
没有指定的情况下是从0角标开始写(若原来存在则覆盖)
* 随机写--可以给任意位置写,可以从任意位置开始读
* 随机访问文件要求数据要有规律,长度可以进行规律的估计
* 小应用:利用多个线程负责不同地方的数据写数据(利用该类可以指定开始写位置)
PipedInputStream/PipedOutputStream-管道流[应用于多线程]
特点
* 输入流与输出流可以直接连接 read()<-->write()
* 管道流读必须要读管道流的输出
read()[阻塞方法没管道输出数据,就一直等待]-->write()[后面就执行不到]
程序就等待在这--一般用多线程可以处理该问题,写线程写出数据唤醒读线程
* 管道流内部含有一个缓冲区
* 需要调用connect()方法连接两个流
DataInputStream/DataOutputStream---操作基本数据类型
特点--保存基本数据类型的形态
* 使用结合+InputStream--读和写的类型必须一致
* writeUTF()--readUFT()对于使用(编码和解码是utf8修改版)自动添加的头信息
操作数组的流对象--[源与目都是内存上]
ByteArrayInputStream/ByteArrayOutputStream--用流的思想操作数组
特点
* 内存中存在可变长度的数组缓冲数据
* 不用关闭流(关闭流原因:调用底层的资源)--操作的内存不用底层的资源
* 不会抛出io异常
* ByteArrayInputStream(byte[] buf)--明确源内存
ByteArrayOutputStream()--自动包含数组--也可以指定缓冲区的大小
* 如果要操作的源是内存--直接就用ByteArrayInputStream
CharArrayReader/CharArrayWriter
StringReader/StringReader
7.常见的编码表
ASCII-可以是7bit字符
GBK--中文编码
unicode--统一处理方式固定长度编码--2B
utf-8--不固定长度的编码,最多可以用三个字节表示一个字符
Java基础总结--IO总结2的更多相关文章
- java基础之IO流(二)之字符流
java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...
- java基础之IO流(一)字节流
java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...
- Java基础之IO流整理
Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...
- Java基础之IO技术(一)
---恢复内容开始--- Java基础中的IO技术可谓是非常重要,俗话说的好,万丈高楼起于垒土之间.所以学习Java一定要把基础学好,今天我们来学习IO技术的基础. IO无非就是输入与输出,而其中处理 ...
- java面试:java基础、Io、容器
1.java基础 1.JDK 和JRE有什么区别 JDK:java开发工具包,java开发运行环境.包含了JRE. JRE:java运行环境,包含java虚拟机,java基础类库. 2.jav ...
- Java基础之IO和NIO补完
Java Stream,File,IO 关于NIO和IO的比较,参考:Java NIO系列教程(十二) Java NIO与IO java包之java.io 参考材料:菜鸟教材 NIO 由于下面的系列教 ...
- 【Java基础】IO 流
IO 流 File 类 java.io.File 类是文件和文件目录路径的抽象表示形式,与平台无关. File 能新建.删除.重命名文件和目录,但 File 不能访问文件内容本身. 如果需要访问文件内 ...
- 【java基础】]IO流
IO流 概念: 流的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备,外部文件等 一个流,一定能够会有源和去向(目的地),他 ...
- 黑马程序员——JAVA基础之IO流缓冲区,转换流,字节流
------- android培训.java培训.期待与您交流! ---------- 字符流的缓冲区 缓冲区的出现提高了对数据的读写效率. 对应类 • BufferedWriter ...
- java基础之 IO流
javaIO流 IO流 : (input output) 输入输出流 :输入 :将文件读到内存中 输出:将文件从内存输出到其他地方. IO技术的作用:主要就是解决设备和设备之间的数据传输问题 ...
随机推荐
- Window10中利用Windbg与虚拟机(window7)中调试驱动建立方法
想起自己的windbg配置就转载:eqera的windows内核调试配置,真的是获益良多希望他不会介意我转载他的博客,帮了我很多,记录下来给我也给大家, 其中我主要看的是VMWare的pipe建立,而 ...
- 04面向对象编程-01-创建对象 和 原型理解(prototype、__proto__)
1.JS中对象的"不同":原型概念 从Java中我们可以很好地去理解 "类" 和 "实例" 两个概念,可是在JavaScript中,这个概念 ...
- SQL三类语句
1. DDL (Data Definition Language, 数据定义语言) CREATE: 创建数据库和表等对象 DROP: 删除数据库和表等对象 ALTER: 修改数据库和表等对象的结构 2 ...
- 警惕Java编译器中那些“蜜糖”陷阱
一.前言 随着Java编译器不断地向前发展,它为程序员们提供了越来越多的“蜜糖”(compiler suger),极大地方便了程序的开发,例如,foreach的增强模式,自动拆箱与装箱以及字符串的连接 ...
- Mybatis学习(二)常用对象SqlSessionFactory和SqlSession
1.SqlSessionFactory SqlSeesionFactory对象是MyBatis的关键对象,它是一个数据库映射关系经过编译后的内存镜像. SqlSeesionFactory对象的实例可以 ...
- POJ3069(贪心+巧用优先队列)
题目传送门:http://poj.org/problem?id=3069 题目大意:一个直线上有N个点.点i的距离是Xi.从这些点中选取若干个加上标记.要求:对于每个点,与其距离为R的范围内必有做标记 ...
- [js高手之路] es6系列教程 - 迭代器与生成器详解
什么是迭代器? 迭代器是一种特殊对象,这种对象具有以下特点: 1,所有对象都有一个next方法 2,每次调用next方法,都会返回一个对象,该对象包含两个属性,一个是value, 表示下一个将要返回的 ...
- 关于ng-options
在实际使用过程中对angular的ng-options指令有点不解,有的时候觉得很容易理解和上手,但其实等到遇到问题时,发现它很是生疏,(key,value)键值对获取,as关键词,track by ...
- 用static声明的函数和变量小结
static 声明的变量在C语言中有两方面的特征: 1).变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值.这一点是它与堆栈变量和堆变量的区别. 2).变量用static ...
- 支持向量机SVM(Support Vector Machine)
支持向量机(Support Vector Machine)是一种监督式的机器学习方法(supervised machine learning),一般用于二类问题(binary classificati ...