IO流--高级部分
缓冲流
bufferedoutputstream字节缓冲输出流
bufferedoutputstream(outputstream out)创建一个新的缓冲输出流
bufferedoutputstream(outputstream out,int size)创建一个新的缓冲输出流,在指定一个缓冲区的大小,如果不写,就会有一个默认的大小
使用步骤:
1.创建fileoutputstream对象,构造方法中传递目的地
2.创建bufferedoutputstream对象,构造方法中传递fileoutputstream对象,提高效率
3.使用bufferedoutputstream对象中的方法write,把数据写入到内部缓冲区中
4.使用bufferedoutputstream对象中的方法flush,把内部缓冲区的数据,刷新到文件中
5.释放资源(close会先调用flush方法,所以第4步可以省略)
bufferedinputstream字节缓冲输入流
构造方法同上
使用步骤:
1.创建Fileinputstream对象,构造对象中传递数据源
2.创建bufferedinputstream对象,构造方法中传递Fileinputstream对象,提高效率
3.使用bufferedinputstream对象中的方法,read读取文件
4.释放资源
bufferedreader字符缓冲输入流
bufferedwriter字符缓冲输出流
和字节缓冲流差不多.
特有的方法:
void newline() 写入一个行分隔符,会自动根据不同系统,获取不同的行分隔符
string readline() 一行一行的读,返回的是string
所以格式:
string line;
while((line=br.readline())!=null){... }
转换流
inputstreamreader(字节输入流);read读到的是字节数字.
outputstreamwriter(字节输出流):
构造方法:
outputstreamwriter(outputstream out)创建使用默认字符编码的outputstreamwriter
outputstreamwriter(outputstream out,string charsetname)创建指定字符集的outputstreamwriter
参数:不传递指定的编码表名称,就使用默认的utf-8
步骤:
1.创建outputstreamwriter对象,构造方法中传递字节输出流和指定的表码表名称
2.使用outputstreamwriter对象中的方法write,把字符转换为字节存储缓冲区中(编码)
3.使用flush
4.释放资源
序列化流(使用字节流)
transient关键字:即瞬态关键字
用法和static一样,被关键字修饰的成员变量,不会被序列化,因为静态不是对象.
objectoutputstream:对象的序列化流;
构造方法传递字节输出流
特有的方法writeobject(p) 把对象以流的方式保存到文件中
注意:
1.对象要implement serializable 接口,添加一个标记
2.手动添加一个序列号常量(不然修改一下文件序列号会改变,导致反序列化失败):
格式:private static final long serialVersionUID =1L
objectinputstream:把文件中保存的对象,以流的方式读取出来,叫对象的反序列化流;
特有的方法readobject() 返回的是object.所以要强转:person p = (person)o之后使用
printstream打印流
特点:
1.只负责数据的输出,不负责数据的读取
2.与其他输出流不同,printstream永远不会抛出IOexception
3.有特有的方法,print,println
构造方法:
可以传递文件File,传递流outputstream,传递文件路径string filename
注意:如果使用继承自父类的write方法写数据,那么查看数据的时候会查询编码表 97->a
如果使用自己特有的方法print/println方法写数据,写的数据原样输出 97->97
IO流
I:input 输入/读取
O:output 输出/写入
1个字符=2个字节 1个字节=8个二进制位
硬盘-->内存 输入
内存-->硬盘 输出
字节流:inputstream 输入流 outputstream输出流
字符流:reader读取 writer写入
一切皆为字节
Fileoutputstream字节输出流
构造方法:
Fileoutputstream(string name,boolean append)
Fileoutputstream(File file,boolean append)
参数:写入数据的目的地
string name:目的地是一个文件的路径
File file:目的地是一个文件
构造方法的作用:
1.创建换一个Fileoutputstream对象
2.会根据构造方法中传递的文件/文件路径,创建一个空的文件
3.会把Fileoutputstream对象指向创建好的文件
使用步骤:
1.创建Fileoutputstream对象,构造方法中传递写入数据的目的地
2.调用Fileoutputstream对象中的方法write,把数据写入到文件中
3.释放资源 close
write的两种用法:
write(int b):将指定的字节输出流;单个单个传
write(byte[] byte):将byte数组中的数据一次性输出
一次写多个字节:
如果写的第一个字节是正数(0-127),那么显示的时候回查询ASCII表
如果写的第一个字节是负数,那么第一个字节会和第二个字节组成一个中文显示,查询系统默认码表(GBK)
write(byte[] byte,int off,int len):从指定数组写入len个字节,从角标off开始
Windows:\r\n换行符
Linux: /n
mac:/r
Fileinputstream字节输入流
构造方法:
Fileinputstream(String name)
Fileinputstream(File file)
参数:读取文件的数据源
string name:数据源是一个文件的路径
File file:数据源是一个文件
构造方法的作用:
1.会创建一个Fileinputstream对象
2.会把Fileinputstream对象指定构造方法中要读取的文件
使用步骤:
1.创建Fileinputstream对象,构造方法中传递要读取的数据源
2.使用Fileinputstream对象中的方法read,读取文件
3.释放资源 close
固定格式:
int len =0;(返回读到的一个字节转换为ASCII表对应的数字)
while((len =fis.read())!=-1){...};
byte[] byte =new byte[1024];
int len =0;(返回读到的有效个数)
while((len =fis.read(byte))!=-1){
sout(new string(byte,0,len))
};
read的两个方法:
int read()一个字节读取并返回int数字,读到末尾返回-1;
int read(byte[] byte) 一次读取多个字节,并将其存储在缓冲区数组byte中
Filereader字符输入流
步骤:
1.创建Filereader对象,构造方法中传递读取的数据源
2.使用Filereader对象中的read读取文件
3.释放资源
char[] ch = new char[1024];
int len =0;
while((len=fr.read(ch))!=-1){
sout(new string(ch,0,len))
}
Filewriter字符输出流
步骤
1.创建Filewriter对象,构造方法中传递目的地
2.使用Filewriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
3.使用Filewriter中的方法flush,把内存缓冲区的数据刷新到文件中(可以省略)
4.释放资源(会先把内存缓冲区中国的数据刷新到文件中,在关闭释放)
write的多种用法:
fw.write("黑马程序员",2,3)-->"程序员"
char[] ch = ['a','b','c'];
fw.write(ch,0,1)-->'a'
try-catch-finally处理流中的异常
格式:
FileInputsream fis = null;
Fileoutputsream fos = null;
try{
fis = new Fileinputsream
fos = new Fileoutputsream
byte[] byte =new byte[1024];
int len =0;
while((len =fis.read(byte))!=-1){
fos.write(byte,0,len);
};
}catch(IOexception e ){
sout(e)
}finally{
if(fos!=null&&fis!=null){
fos.close();
fis.colse();
}
}
JDK7新特性
try(FileInputsream fis =new Fileinputsream;
Fileoutputsream fos = new Fileoutputsream)
{
byte[] byte =new byte[1024];
int len =0;
while((len =fis.read(byte))!=-1){
fos.write(byte,0,len);}
}catch(IOexception e){
sout(e)
}
properties集合
properties集合是一个唯一和IO流相结合的集合
可以使用properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
可以使用properties集合中的方法load,可以把硬盘中保存的文件(键值对),读取到内存中使用
属性列表中每个键及值都是一个字符串,及key和value都是字符串,所有不用写泛型
properties集合有一些特有的操作字符串的方法
object setproperty(String key,string value)调用hashtable的方法 相当于put方法
string getproperty(string key)通过key找到value值,相当于map集合中的get(key)方法
set<string> stringpropertynames() 相当于map集合中的keyset方法
void store(outputstream out,string comments)
参数:string comments:注释,用来解释说明保存文件是做什么的,不能用中文,一般使用""空字符串
void load(inputstream is)读取,
存储键值对的文件中,可以使用#进行注释,被注释的键值对不会被读取
存储键值对的文件中,键与值默认都是字符串,所以不用加引号
存储键值对的文件中,键与值默认的链接符号可以使用=,空格,其他符号 File类
File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
重点:
file:文件
directory:文件夹
path:路径--不区分大小写
静态成员变量:
static String File.pathSeparator:路径分隔符 Windows:分号; Linux:冒号:
static String File.separator:文件名分隔符 Windows: 反斜杠\ Linux:正斜杠/
构造方法:
File(String pathname) :通过字符串给定的路径创建一个File类
参数:pathname:字符串的路径名称
路径可以是文件结尾,也可以是文件夹结尾
路径可以是相对路径,也可以是绝对路径
路径可以是存在的,也可以是不存在的
创建File对象,只是把字符串路径封装为file对象,不考虑路径的真假情况
File(String parent, String child)
参数:把路径分为了两部分
String parent:父路径
String child:子路径
好处:父路径和子路径,可以单独的书写,使用起来非常灵活,父路径和子路径都可以变化
File(File parent, String child)
参数:把路径分为了两部分
File parent:父路径
String child:子路径
好处:
父路径和子路径,可以单独的书写,使用起来非常灵活,父路径和子路径都可以变化
父路径是File类型,可以使用File类的方法对路径进行一些操作,在使用路径创建对象
File类获取方法
getAbsolutePath():获取当前file对象的绝对路径
getPath();获取file对象构造中传递的路径
getName():获取文件名字
length():获取当前文件大小
File类判断功能方法
boolean exists():判断此file表示的目录或文件是否实际存在
boolean isDirectory():判断此file表示的是否为文件夹
boolean isFile():判断此file表示的是否为文件
使用前提,路径必须是存在.否则直接返回false
File类创建删除功能方法
boolean createNewFile():创建一个新的文件
true:文件不存在,创建文件 false:文件存在,不会创建
注意:只能创建文件不能创建文件夹
路径必须存在,否则抛出异常
boolean delete():删除由此file表示的文件或目录
注意:可以删除文件或者文件夹
true:文件/文件夹删除成功 false:文件夹中有内容,不会删除,返回false,构造方法中路径不存在,返回false
直接在硬盘删除文件/文件夹,不走回收站,删除要谨慎
boolean mkdir():创建单级空文件夹
boolean mkdirs():创建单级/多级空文件夹
true:文件夹不存在,创建文件夹 false:文件夹存在,不会创建
注意:只能创建文件夹不能创建文件
路径如果不存在,则返回false;
File类遍历
String[] list() :遍历构造方法中给出的目录,会获取目录中所有的文件/文件夹名称
把获取到的多个名称存储到一个string数组中
遍历当前目录下的第一层的所有文件/文件夹的数组 不能遍历多级文件夹
File[] listFiles():返回的是封装的file对象数组,能遍历隐藏的文件/文件夹
注意:这两个方法遍历的是构造方法中给出的目录
如果构造方法中给出的目录不存在,会抛出空指针异常
如果构造方法中给出的路径不是一个目录(即文件或者文件夹),也会抛出空指针异常
递归
方法自己调用自己成为递归
分为直接递归和间接递归
使用前提:
当调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归
注意事项:
递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
在递归中输入有条件限定,但是递归次数不能太多,否则也会发生栈内存溢出
构造方法,不能使用递归
Thread类
常用方法:
getname(); ==>获取线程的名称,返回值是String
用法:直接调用方法.
currentThread(); ==>获取当前正在执行的线程,在使用.getname可以获得线程对象的名称
用法:Thread.currentThread().getname();
Thread.sleep(毫秒值);==>让线程睡一下
Runnable接口
实现步骤:
1.创建Runnable接口的实现类
2.在实现类中重写Runnable接口的run方法.设置线程任务
3.创建一个runnable接口的实现类对象
4,创建一个thread类对象,构造方法中传递runnable接口的实现类对象
5.调用thread类中的start方法,开启多线程
解决线程安全的问题,有以下几种办法:
同步代码块
格式:synchronized(锁对象){需要同步操作的代码}
同步方法
格式:修饰符 synchronized 返回值类型 方法名(参数列表){代码...}
lock锁接口
实现类Reentrantlock
使用步骤:
1.在成员位置创建一个Reentrantlock对象
Lock l = new Reentrantlock();
2.在可能会出现安全问题的代码前调用lock接口中的方法lock()获取锁
3.在可能会出现安全问题的代码后调用lock接口中的方法unlock()释放锁
|
|