IO 是什么意思? data source 是什么意思?
IO:输入输出
data source:数据源
字节流和字符流有什么区别?输入流和输出流有什么区别?
IO流分类
1、按流向 : 输入流 输出流
2、按数据: 字节流:二进制,可以传输一切文件类型
字符流:只能处理纯文本文件
3、按功能: 节点流:包裹源头
功能流:增强功能,改善性能
字节流与字符流常用方法:
1、字节流
输入流:InputStream read(byte[] b) read(byte[] b, int off,int len) close()
FileInputStrea()
输出流:OutputStream write(byte[] b) write(byte[] b, int off,int len) flush() close()
FileOutputStream()
2、字符流
输入流:Reader read(char[] cbuf) read(char[] cbuf,int off,int len) close()
FileReader()
输出流:Writer write(char[] cbuf) write(char[] cbuf,int off,int len) flush() close()
FileWriter()
节点流和处理流有什么区别?
按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为节点流和处理流两类。
节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader.
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
JAVA常用的节点流有以下几个:
文 件 FileInputStream FileOutputStrean FileReader FileWriter 文件进行处理的节点流。
字符串 StringReader StringWriter 对字符串进行处理的节点流。
数 组 ByteArrayInputStream ByteArrayOutputStreamCharArrayReader CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)。
管 道 PipedInputStream PipedOutputStream PipedReaderPipedWriter对管道进行处理的节点流。
父 类 InputStream OutputStream Reader Writer
常用处理流(关闭处理流使用关闭里面的节点流)
缓冲流:BufferedInputStrean BufferedOutputStream BufferedReader BufferedWriter
增加缓冲功能,避免频繁读写硬盘。
转换流:InputStreamReader OutputStreamReader实现字节流和字符流之间的转换。
数据流 DataInputStream DataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来。
word 文档能使用字符流操作吗?为什么?
不能,纯文本才可以用字符流
流对象使用完后,一般要调用close方法关闭,释放资源。 这种做法对吗?
虽然在字节流当中,操作没有用到缓冲区,所以使用完流之后不写close方法也可以,但是为了规范,最好也要写上。字符流当中,必须使用close方法,否则内容无法输入输出。
InputStream和OutputStream基本特点是?
• Java语言中最基本的两个字节输入输出类。
• 其他所有字节输入输出流类都继承自这两个基类。
• 这两个类都是抽象类,不能创建它们的实例,只能使用它们的子类.
Reader 和 Writer 的基本特点是?
• Java语言中最基本的两个字符输入输出类。
• 其他所有字符输入输出流类都继承自这两个基类。
• 这两个类都是抽象类,不能创建它们的实例,只能使用它们的子类.
FileInputStream 和 OutputStream 的基本作用是?
• 使用FileInputStream读取文件内容
• abstract int read( );
• int read( byte b[ ] );
• int read( byte b[ ], int off, int len );
• int available( );
• close( );
• 使用FileOutputStream写内容到文件
• abstract void write( int b );
• void write( byte b[ ] );
• void write( byte b[ ], int off, int len );
• void flush( );
• void close( );
• 使用FileInputStream/FileOutputStream复制文件
FileReader 和 FileWriter 的作用是?
使用FileReader和FileWriter完成文件复制
BufferInputStream 和 BufferedOutputStream 的特点是?
• BufferedInputStream和BufferedOutputStream是处理流(包装流)
• 读文件和写文件都使用了缓冲区,减少了读写次数,从而提高了效率
• 当创建这两个缓冲流的对象时时,会创建了内部缓冲数组,缺省使用32字节大小的缓冲区.
• 当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区
• 当写入数据时,首先写入缓冲区,当缓冲区满时,其中的数据写入所连接的输出流。使用方
法flush()可以强制将缓冲区的内容全部写入输出流
• 关闭流的顺序和打开流的顺序相反.只要关闭高层流即可,关闭高层流其实关闭的底层节点流
• Flush的使用:手动将buffer中内容写入文件
InputStreamReader 和 OutputStreamWriter 的作用是?
• 为处理流
• 用于将字节流转化成字符流,字符流与字节流之间的桥梁
• InputStreamReader的作用是把InputStream转换成Reader
• OutputStreamWriter的作用是把OutputStream转换成Writer
• 存在将字节流转换成字符流的转换流,因为字符流操作文本更简单
• 不存在把字符流转换成字节流的转换流,因为没有必要
• System.in代表标准输入,即键盘输入,是InputStream的实例
PrintStream 打印流经常用于什么情况? System.out 是不是打印流?
• PrintStream提供了一系列的print()和println(),可以实现将基本数据类型格式化成字符串输出。
对象类型将先调用toString(),然后输出该方法返回的字符串
• System.out就是PrintStream的一个实例,代表显示器
• System.err 也是PrintStream的一个实例,代表显示器
• PrintStream的输出功能非常强大,通常需要输出文本内容,都可以将输出流包装成
PrintStream后进行输出
• PrintStream的方法都不抛出IOException
System.out 是打印流,被称作标准的输出流。输出的目的是标准的输出设备,即显示器。
DataInputStream 和 DataOutputStream 的特点是?
• 提供了可以存取所有Java基础类型数据(如:int,double 等)和String的方法。
• 处理流,只针对字节流,二进制文件
中文乱码是怎么造成的?
编码方式与解码方式额设之不当
unicode 字符集是几个字节表示一个字符?为什么需要 utf-8?
2个字节表示一个字符,utf-8是Unicode最重要的实现方式之一。另外还有utf-16、utf-32等。UTF-8不是固定字长编码的,而是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。这是种比较巧妙的设计,如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。
序列化和反序列化指的是什么?
• 对象序列化 (Serialization)
• 将Java对象转换成字节序列(IO字节流)
• 对象反序列化 (DeSerialization)
• 从字节序列中恢复Java对象
想序列化某个类的对象,该类必须实现 Serializable 接口吗?
必须
只有实现了Serializable接口的类的对象才可以被序列化。Serializable接口中没有任何的方法,实现该接口的类不需要实现额外的方法;如果对象的属性是对象,属性对应类也必须实现Serializable接口
说说 Serializable 接口的特点。
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。因为实现接口也是间接的等同于继承。序列化接口没有方法或字段,仅用于标识可序列化的语义
transient 的作用是?
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化。