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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 白菜蔡 初级黑马   /  2018-12-19 12:52  /  755 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        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()释放锁



0 个回复

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