java面试准备3

常用的I/O流

1、字节输入流:InputStream类为所有字节输入流的父类
三个基本的read()方法: 
      int read()
      从流里读出的一个字节。不推荐使用
      int read(byte[] b)
      将数据读入到字节数组中,并返回所读的字节数
      int read(byte[] b, int off, int len)
      off  从哪里开始读。
      len  读取多少。
      将输入流中最多 len 个数据字节读入字节数组。
其它方法: 
      void close() 
      关闭此输入流并释放与该流关联的所有系统资源。
      int available()
      返回不受阻塞地从此输入流读取的字节数。
      long skip(long n)
      跳过和放弃此输入流中的n个数据字节,该方法有可能失效。
      boolean markSupported()
      测试此输入流是否支持 mark 和 reset 方法。
      void mark(int n)
      在此输入流中标记当前的位置
      void reset()
      将此流重新定位到对此输入流最后调用 mark 方法时的位置。 
 
2、字节输出流:OutputStream类是所有字节输入流的父类

三个基本的write()方法: 
void write(int n)
将指定的字节写入此输出流。
void write(byte[] b) 
将 b.length 个字节从指定的字节数组写入此输出流。
void write(byte[] b, int off, int len)
将指定字节数组中从偏移量off开始的len个字节写入此输出流。
其它方法: 
void close()
      关闭此输出流并释放与此流有关的所有系统资源。
void flush()
      刷新此输出流并强制写出所有缓冲的输出字节。 
     
3、文件输入输出流:FileInputStream和FileOutputStream
要构造一个FileInputStream,所关联的文件必须存在而且是可读的。
如:
FileInputStream fis = new FileInputStream("myfile.dat"); 
要构造一个FileOutputStream,而输出文件已经存在,则它将被覆盖。
如:
  FIleOutputStream fos = new FileOutputStream("results.dat"); 
  要想以追加的方式写,则需要一个额外的参数,如:
FileOutputStream outfile = new FileOutputStream("results.dat" ,true);//参数为true时输出为追加,为false时为覆盖。  

4、RandomAccessFile: 
允许随机访问文件,类支持直接输出输入各种数据类型。

构造器:
RandomAccessFile(File file, String mode) 
          创建从中读取和向其中写入(可选)的随机存取文件流,该文件由 File 参数指定。 
RandomAccessFile(String name, String mode) 
          创建从中读取和向其中写入(可选)的随机存取文件流,该文件具有指定名称。 
mode( r:以只读方式打开      rw:可读可写,不存在则创建)

相关方法:
long getFilePointer()
返回文件指针的当前位置。 
void seek(long pos)
设置文件指针到给定的绝对位置。 
long length()
返回文件的长度。

5、对象流:ObjectInputStream和ObjectOutputStream(实现对象序列化)

对象流是过滤流,需要节点流作参数来构造对象,用于直接把对象写入文件和从文件中读取对象。
只有实现了Serializable接口的类型的对象才可以被读写,Serializable接口是个标记接口,其中没有定义方法。
对象会序列化成一个二进制代码,文件中保存对象的属性。

writeObject(o)、readObject()这两个是对象读写操作时用的方法。
Object o = new Object();
FileOutputStream fos=new FileOutputStream("Object.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(o);
oos.close();


FileInputStream fis =new FileInputStream(“Object.txt”);
ObjectInputStream ois =new ObjectInputStream(fis);
Object o = (Object)Ois.readObject();
ois.close();

一个类中有其他类型的对象,那么,这个类实现了Serializable接口,在对象序列化时,也同样要求这个类中属性都能够对象序列化(基本类型除外)。

在开发中如何选择流?
答:

先考虑是输入流还是输出流,
再考虑是字节流还是字符流,
最后考虑是节点流还是处理流。

字符流:Reader和Writer所有字符流的父类型

Java技术使用Unicode来表示字符串和字符,而且提供16位版本的流,以便用类似的方法处理字符。 
如果构造了一个连接到流的Reader和Writer,转换规则会在使用缺省平台所定义的字节编码和Unicode之间切换。 

桥梁流:InputStreamReader和OutputStreamWriter(字节流转化成字符流的桥转换器)
这两个类不是用于直接输入输出的,他是将字节流转换成字符流的桥转换器,并可以指定编解码方式。

逐行读写流:BufferedReader/BufferedWriter
以上两个都是过滤流,需要用其他的节点流来作参数构造对象。
BufferedReader的方法:readLine():String ,当他的返回值是null时,就表示读取完毕了。要注意,再写入时要注意写换行符,否则会出现阻塞。
BufferedWriter的方法:newLine() ,这个方法会写出一个换行符。

管道流:线程交互的时候使用
PipedInputStream/PipedOutputStream
传送输出流可以连接到传送输入流,以创建通信管道。传送输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。
注意:管道输出流和管道输入流需要对接。

数据流:DataInputStream和DataOutputStream
通过流来读写Java基本类,注意DataInputStream和DataOutputStream的方法是成对的。 
支持直接输出输入各种数据类型。
注意:使用DataOutputStream/DataInputStream时,要注意写入顺序和读取顺序相同,否则会将没有分割写入的信息分割不正确而读取出错误的数据。

Properties类:

针对属性文件(*.properties,内容是name=value)进行操作,在java.util包下
load(InputStream inStream) 
          从输入流中读取属性列表(键和元素对)。
          getProperty(String key) 
          用指定的键在此属性列表中搜索属性。

如何解决乱码?

答:

String temp = 乱码的字符串
temp = new String(temp.getBytes("ISO8859-1") , "GBK")   
将temp按照ISO8859-1的方式进行解码生成一个字节序列,然后在按照GBK的方式解码字节序列生成字符串。

深入理解File类?

答:File类的对象实例表示一个文件并不是真正的文件,只是一个代理而已,通过这个代理来操作文件。

并发线程:
三个多线程包:
java.util.concurrent    包含了常用的多线程工具,是新的多线程工具的主体。 
java.util.concurrent.atomic    包含了不用加锁情况下就能改变值的原子变量。
java.util.concurrent.locks    包含锁定的工具。 

Executor接口:
替代了Thread类,他可以创建定量的、动态的以及周期性的线程池。
ExecutorService接口:
线程池,用来存放线程来节省创建和销毁资源的消耗。

Callable和Future接口:
Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。Callable和Runnable有几点不同:
Callable规定的方法是call(),而Runnable规定的方法是run(). 
Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。 
call()方法可抛出异常,而run()方法是不能抛出异常的。 
运行Callable任务可拿到一个Future对象,通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章