A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lx_1995 初级黑马   /  2018-12-19 23:11  /  973 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

IO流:
intput(读取)
output(输出)
流:数据(字符、字节),1个字符等于2个字节,1个字节等于8个二进制位(比特位)
输入:把硬盘的数据读取到内存中
输出:把内存中的数据,写到硬盘中保存
顶层的父类:
字节输入流:inputstream,读取
字节输出流:outputstream,写入
字符输入流:reader,读取
字符输出流:writer

内存:关机就没了
硬盘:关机后还存在,所以需要写入输出到硬盘中。

二:字节流:一切皆为字节,
一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一 样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底 层传输的始终为二进制数据。

四:io包
字节输出流:
outputstream是个输出所有字节流抽象类(超类),定义的都是一些子类共性的成员方法:
close()关闭
flush()刷新此输出流
write(byte[]b)将b.length字节从指定的字节数组写入此输出流
write(byte[]b,int off ,int len)从指定的字节数组写入此输出流
abstract write(int b):将指定的字节输出流

抽象类无法创建对象,必须要用子类:他的子类分别有六个:
ByteArrayOutputStream:
FileOutputStream:
FilterOutputStream:等六个
FileOutputStream:文件字节输出流,往文件中写字节数据
重点:FileOutputStream 继承 outputstream :文件字节输出流
作用:把内存中的数据写到硬盘文件夹中
构造方法:
FileOutputStream(String name):创建一个具有指定名称的文件中写入数据的输出文件流
FileOutputStream(File name):创建一个具有file对象表示的文件中写入数据的输出文件流
String name:目的地是一个文件的路径
File name:目的地是一个文件
构造方法的作用:(只能创建一个文件,不能创文件夹)
1:创建一个FileOutputStream对象
2:根据构造方法中传递的文件或文件路径,创建一个空的文件
3:会把FileOutputStream对象指向创建好的文件


五:字节输出流写数据到硬盘原理和步骤
写数据的原理:(内存-硬盘):java程序-jvm-os(操作系统)-os调用写数据的方法 - 吧数据写到文件中
字节输出流的使用步骤:
1:创建一个FileOutputStream对象,构造方法中传递写入的数据到目的地
2:调用FileOutputStream对象中的方法write,把数据写入到文件中
3:释放资源 (close)(流使用会占用一定的内存,使用完毕要把内存清空,提供程序的效率)

六:文件存储的原理和记事本原理
计算机都储存的是二进制数据,所以
写数据的时候,会把10进制的整数97转换为二进制的整数97
97-11000001
任意文本编辑器(记事本或者++)在打开文件的时候,都会查询编码表,把字节转换为字符表示
0-127:查询ASCII表
其他值:查询系统默认码表(中文系统GBK)

七:字节输出流写多个字节的方法
write(byte[]b):
一次性写多个字节:
如果写的第一个字节是正数(0-127),那么显示时候回查询ASCII表
如果写的第一个字节是负数,那么第一个字节会和第二个字节,两个字节组成一个中文显示,查询默认码表(GBK)

write(byte[]b,int off ,int len):
intoff:数组的开始索引
int len:写几个字节

将字符串转换byte字节数组:“你好”.getbytes()
utf-8:三个字节是一个中文
GBK:两个字节是一个中文


八:数据的追加写和换行写
追加写(续写):
使用两个参数的构造方法
FileoutputStream(String neme,boolean append)
FileoutputStream(File neme,boolean append)
File neme:写入数据的目的地
boolean append:追加写的开关,
ture:创建对象不会覆盖源文件,在末尾追加
false:创建新文件,覆盖源文件
换行:(直接写在打印语句里面即可)
Windows:\r\n或者 .newLine();
例:将你好输入换行
fos.write("你好".getbytes());
fos.write("\r\n.getbytes());

linux:/n
mac:/r







九:字节输入流(inputstream),io包,是个所有字节输入流抽象类(超类),定义的都是一些子类共性的成员方法:
int read()从输入流中读取数据的下一个字节。
int read(byte[]b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
void close():关闭此输入流并释放与该流相关的索引系统资源。

抽象类,无法创建对象,需要用子类,有6个,重点研究Fileinputstream:文件字节输入流,继承了inputstream,作用:把硬盘文件的数据读取到内存中使用
构造方法:
Fileinputstream(string name)
Fileinputstream(File file)
string name:文件的路径
File file:文件
作用:
1:会创建一个Fileinputstream对象
2:会把Fileinputstream对象指定构造方法中要读取的文件

十:使用字节输入流读取文件
读取数据原理:java-jvm-os-os读取数据的方法-读取文件
字节输入流的使用步骤:
1:创建Fileinputstream对象构造方法中绑定要读取的数据源
2:使用Fileinputstream对象中的方法read,读取文件
3:释放资源

int read ()读取文件中的一个字节并返回,读取到末尾返回-1,例:读a b c ,读取a之后自动跳转到b,最后是-1,所以很麻烦,使用while循环,
例:int len =0;while(len=fis.read!=-1){sout(len)}
注意不能省略变量len哦!!!



十一:字节输入流读取数据的原理

十二:字节输入流一次读取多个字节方法
int read(byte[]b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中

了解:
String类的构造方法:
String(byte [] bytes):把字节数转化为字符串
String(byte [] bytes,intoffset,int length):把字节数组的一部分转换为字符串,offset:数组的开始索引,length:转化的字节个数。

明确两件事:
1:方法中的参数byte[]的作用?
起到缓冲作用,存储酶促读取到的多个字节
数组长度一般定义为1024,或者1024的整数倍
2:方法返回值int是什么?
每次读取的有效字节个数
读取也是重复过程,也可以使用whlie循环,结束条件:-1;
bayte[] bytes =new byte[1024];//存储读取到的多个字节
int len=0;//记录每次读取的有效字节个数
while((len.fis.read(bytes))!-1){sout(new string,0,len }

十三:练习:文件的复制
原理:一读一写







                    




十四:字符流  io包
字节流读取文件时候遇到问题,遇到utf-8表时候,一个中文代表三个字符,如果想读取3个汉字或者将读的转为字符,如果想转为字符,会出现读半个汉字的情况,就会乱码,所以用字符流,专门处理文本和符号的文档。1个中文占一个字符
十五:字符输入流,io包, Reader,是字符输入流的最顶层的父类,定义了一些共性的成员方法,是一个抽象类。
共性成员方法:
int read():读取单个字符并返回
int read(char[] cbuf):一次读取多个字符,将读取的字符放到数组中
void close :关闭
是个抽象类,无法使用,需要使用它的子类,6个
FileReader 继承了input stream reader 又继承了Reader
重点了解FileReader:文件字符输入流
作用:把硬盘文件中的数据以字符的方式读取到内存中
构造方法:
File Reader (String file name)
File Reader (File file )
String file name:文件的路径
File file:一个文件
FileReader构造方法的作用:
1:创建一个FileReader对象
2:会把FileReader对象指向要读取的文件

十六:字符输入流使用步骤:
1:创建FileReader对象,构造方法中绑定要读取的数据源
2:使用FileReader对象中的方法Read读取文件
3:释放资源

String的构造方法:
String(char[] value )把字符数组转化为字符串
String(char[] value,int offset ,intcount )把字符数组的一部分转化为字符串,offset:数组的开始索引,count:转化的个数。

十七:字符输出流:Writer,是所有字符输出流最顶层的父类,是个抽象类,共性成员方法:
write(char [ ] cbuf)写入字符数组
void write(char [ ] cbuf,int off,ine len)写入字符数组的某一部分,off是索引,len是字符个数
void write(String str):写入字符串
void write(String str,int off,ine len)写入字符串的某一部分,off是索引,len是字符个数
void flush():刷新
void flush():关闭,但是要先刷新它

是抽象类,使用它的子类,有6个,重点了解
out put StreamWriter

FileWriter 继承out put StreamWriter 继承Writer
FileWriter:文件字符输出流,
作用:把内存中的字符数据写入文件中
它的构造方法:
File Writer(String file name)
File Writer(File file )
String file name:文件的路径
File file:是一个文件
构造方法的作用:
1:创建对象
2:根据构造方法中传递的文件或文件的路径,创建文件
3:会把file Writer 对象指向创建好的文件

十八:字符输出流的使用(重点)
步骤:
1:创建对象,构造方法中绑定写入数据的目的地
2:使用FileWriter中方法writer,把数据写入到内存缓冲区(字符转为字节的过程)
3:使用flush,刷新
4:释放资源(会把内存缓冲区的数据刷新到文件中)
因为第二步写入的数据是在缓冲区中,不能直接显示,所以需要刷新。
字符输出流和字节输出流的区别:字符输出流是把数据写到内存缓冲区中,在把缓冲区的的数据刷新到文件中(默认了一个把字符转化为字节的过程),而字节输入流是直接写到硬盘中。,字节输出流和字符输出流都有flash,输入流没有flash

十九:flush和close的区别:
flush:刷新缓冲区,流对象可以继续使用
close:先刷新缓冲区,然后通知系统释放资源,对象从内存消失了,流对象不可以再被使用了,close的底层其实就是flash。

二十:字符输出流写数据的其他方法
write(char [ ] cbuf)写入字符数组
void write(char [ ] cbuf,int off,ine len)写入字符数组的某一部分,off是索引,len是字符个数
void write(String str):写入字符串
void write(String str,int off,ine len)写入字符串的某一部分,off是索引,len是字符个数

二十一:字符流的续写和换行
FileWriter(String neme,boolean append)
FileWriter(File neme,boolean append)








二十二:IO异常的处理
在jdk1.7之前,可以使用Try catch finally 处理流中的异常
格式:try{
可能睡产生异常的代码
}catch(异常类的变量 变量名){
异常的处理逻辑
}finally{
一定会执行的代码
资源释放
}

二十三:在jdk7后,try后边可以增加()(了解,不管他)
格式:try(定义流对象...){
可能睡产生异常的代码
}catch(异常类的变量 变量名){
异常的处理逻辑
}finally{
一定会执行的代码
资源释放
}
jdk9新特性(了解,不会使用,不管他)
A a =new A();
B b =new B();
try(a,b){
可能睡产生异常的代码
}catch(){}



hashmap(线程不安全,效率高,基本都会去用)
Linkedhashmap
Hashtable:(线程安全,效率低下,基本不会使用,被淘汰)但是他的子类properties用的比较多,唯一一个可以读写数据的集合


二十四:属性集 properties继承Hashtable<k,v>
properties是一个唯一和io路结合的集合,是一个双列集合,k和y默认是字符串。
方法:
store:把集合的临时数据,持久化写入到硬盘中存储(一般不会往里面写数据)


properties集合K和v默认都是字符串,所以不用写泛型
所以properties有操作字符串的特有方法:
1:Object setproperty(String k,String v),调用Hashtable的方法put
2:Object  getproperty(String k),通过k找v值,相当于map集合中的get(key)方法
3:set<String>    StringPropertynames():返回此属性列表的键集,其中键及其对应的都是字符串,想当与map集合的keyset

二十五:load的使用,重要
load:(里面装inputstream)把硬盘中保存的文件(键值对),读取到集合中使用,在里面添加输入流使用(意思就是把经常变的数据装到properts集合里面去,改动的时候在集合里里面改动,再读取出来即可,一般操作用户名账号和密码,常用)
void load(inputstream i)
void load(reader i)
inputstream i:字节输入流,不能读取含有中文的键值对
reader i:字符输入流,能读取含有中文的键值对
使用步骤:
1:创建 properties集合对象
2:使用 properties集合对象中的方法load读取保存键值对的文件(一般放在字符输入流里面)
3:遍历properties集合(使用键找值的方法)
注意:
1:存储键值对的文件中,键与值默认的连接符号可以使用等号,空格,逗号。
2:存储键值对的文件中,可以使用#进行注释,被注释的键值对不会被读取
3:存储键值对的文件中,键与值默认都是字符串,不用在加引号
意思即:在要读取的文件中,
例:一个记事本中装的数据:迪丽热巴=20,中间可以用等号逗号空格,不用加引号
#迪丽热巴=20,这种就不能被读取了



复制图片视频等文件时候(都为二进制的),必须使用字节流
有中文的时候,用字符流。




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马