从今天开始每天把技术学习总结统统放到这里,哈哈密瓜。
1.Java I/O整体框架是什么样的?Java流分为那两种?
Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的:
其中FilterInputStream ,FilterOutputStream,FilterReader,FillerWriter为Decorator类,用来包装。OutpurtStreamReader,InputStreamWriter是用来转换字节流到字符流。RandomAccessFile并不是从InputStream或OutputStream继承过来,它只实现 DataIput和DataOutput方法。接口DataInput 中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数。如:readBoolean()、readInt( )、readLine( )、readFully() 等。
接口DataOutput 中定义的方法主要是向流中写入基本类型的数据、或者写入一定长度的字节数组。如:writeChar( )、writeDouble( )、write( ) 等。
· 字节与字符的主要区别是:字节是二进制的数据,字符也是二进制数据,但是这种数据包含有区域信息(字符集), 需要翻译才可以获取实际的信息。
· 输入流与输出流的主要区别是:输入流的主要作用是从流中读取数据,输出流的主要作用是向流中写入数据。
· 整个java.io 的核心都是采用了Decorator(装饰)模式。
2.Java I/O设计原则是什么?什么是Decorator(装饰)模式?
JavaI/O设计原则:1)Java的I/O提供了一个称做链接的机制,可以将一个流与另一个流首尾相接,形成一个流管道的链接。这种机制实际上是一种被称为Decorator(装饰器)设计模式的应用。2)通过流的链接,可以动态的增加流的功能,而这种功能的增加是通过组合一些流的基本功能而动态获取。3)我们要获取一个I/O对象,往往需要产生多个I/O对象,但是I/O库中Decorator的运用,提供了实现的灵活性。
3.Java I/O 的基本类和类方法?
1)InputStream的基本方法
int read() throws IOException 读取一个字节以整数形式返回,如果返回-1已到输入流的末尾
void close() throws IOException 关闭流释放内存资源
long skip(long n) throws IOException 跳过n个字节不读
2)OutputStream的基本方法
void write(int b) throws IOException 向输出流写入一个字节数据
void flush() throws IOException 将输出流中缓冲的数据全部写出到目的地
3)Writer的基本方法
void write(int c) throws IOException 向输出流写入一个字符数据
void write(String str) throws IOException将一个字符串中的字符写入到输出流
void write(String str,int offset,int length)将一个字符串从offset开始的length个字符写入到输出流
void flush() throws IOException 将输出流中缓冲的数据全部写出到目的地
4)Reader的基本方法
int read() throws IOException 读取一个字符以整数形式返回,如果返回-1已到输入流的末尾
5)File相关:
FileInputStream和FileOutputStream继承基类用于向文件中输入输出字节
FileReader和FileWriter继承基类用于向文件中输入输出字符
输出流在构造函数第二个参数可以设置true意义为跟在已有文件后进行输入
此类流会抛出FileNotFoundException需要对其进行显示捕捉
4.流的分类?
1)过滤流:使用节点流作为输入或输出。
过滤流是使用一个已经存在的输入流或输出流连接创建的。(FilterInputStream),过滤流就是采用Decorator(模式)。
2)缓冲流(也是过滤流一种):
缓冲流:缓冲流要套接在相应的节点流之上,提高了读写的效率。
此处理流的构造方法都得传相对应的基类类型
BufferedReader:提供了readLine方法用于高校读取一行字符串
BufferedWriter:提供了newLine用于写入一个行分隔符也就是换行
BufferedInputStream 没多大用处
BufferedOutputStream 没多大用处
3)转换流:
主要作用将字节流转换成字符流。用处较大!
转换流在构造时可以指定其编码集合
InputStreamReader需要和InputStream套接
OutputStreamWriter需要和OutputStream套接
例:OutputStreamWriter osw = new OutputStreamWriter (new FileOutputStream(文件路径);
方法例:osw.getEncoding(); 获得流的编码方式
4)节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。
类型 | 字符流(Reader/Writer) | 字节流(Input/Output) |
File | FileReader/FileWriter | FileInputStream/FileOutStream |
MemoryArray | CharArrayReader/CharArrayWriter | ByteArrayInputStream/ByteArrayOutputStream |
MemoryString | StringReader/StringWriter | -- |
Pipe | PipeReader/PipeWriter | PipeInputStream/PipeOutputStream |
5)管道流:用于线程间的通信,一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入,要使管道流有用,必须同时构造管道输入流和管道输出流。