1. 字节流和字符流的区别:
字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符。
2. 节点流和处理流的区别:
可以从/向一个特定的IO设备(如磁盘、网络)读、写数据的流,称为节点流,也被称为低级流。
处理流则用于对一个已经存在的流进行连接或封装,通过封装后的流实现数据读写功能。
3. InputStream 和Reader
InputStream 和Reader 是所有输入流的抽象基类,本身不能创建实例或执行输入,但成为所有输入流的模板,它们的方法是所有输入流都可使用的方法。
InputStream包含如下方法:
// 从输入流种读取单个字节,返回所读取的字节数据 int read(); // 从输入流种最多读取b.length个字节的数据,并存储在字节数组b种,返回实际读取的字节数 int read( byte b[]); // 从输入流中最多读取len个字符的数据,并将其存储在字符数组buff中,并不是从数组起点开始,而是从off位置开始 int read( byte b[], int off, int len)
Reader包含如下方法:
// 从输入流中读取单个字符,返回所读取的字符数据 int read(); // 从输入流中最多读取cbuf.length个字符数据,并存储在cbuf中,返回实际读取的字符数 int read( char cbuf[]); // 从输入流中最多读取cbuf.length个字符数据,并存储在cbuf中,从off开始存储,返回实际读取的字符数 int read( char cbuf [], int off, int len);
InputStream和Reader是抽象基类,本身不能创建实例,但它们分别有一个用于读取文件的输入流: FileInputStream, FileReader
public class FileInputStreamTest { public static void main(String[] args) { InputStream fis = null ; try { fis = new FileInputStream("D:/rding/testfile2/file.txt" ); byte [] bbuf = new byte [1024 ]; int hasRead = 0 ; while ((hasRead = fis.read(bbuf)) > 0 ) { System.out.println( new String(bbuf, 0 , hasRead)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fis != null ) { fis.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
public class FileReaderTest { public static void main(String[] args) { Reader fr = null ; try { fr = new FileReader("D:/rding/testfile2/file.txt" ); char [] cbuf = new char [32 ]; int hasRead = 0 ; while ((hasRead = fr.read(cbuf)) > 0 ) { System.out.print( new String(cbuf, 0 , hasRead)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fr != null ) { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
4. OutputStream和Writer
OutputStream 和 Writer都有这三个方法: