IO高级流
知识点:
1、 认识IO中的高级流
2、 内存操作流的使用
3、 System类对IO的支持
4、 BufferedReader类的作用
5、 字符编码的问题
认识IO中的高级流
Reader继承图
类 | 描述 |
BufferedReader | 从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取 |
CharArrayReader | 此类实现一个可用作字符输入流的字符缓冲区 |
InputStreamReader | InputStreamReader 是字节流通向字符流的桥梁:它使用指定的charset 读取字节并将其解码为字符 |
FilterReader | 用于读取已过滤的字符流的抽象类 |
PipedReader | 管道的字符输入流 |
StringReader | 其源为一个字符串的字符流 |
Writer继承图
类 | 描述 |
BufferedWriter | 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入 |
CharArrayWriter | 此类实现一个可用作 Writer 的字符缓冲区 |
OutputStreamWriter | OutputStreamWriter 是字符流通向字节流的桥梁:使用指定的charset将要向其写入的字符编码为字节 |
FilterWriter | 用于写入已过滤的字符流的抽象类 |
PipedWriter | 管道的字符输出流 |
StringWriter | 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串 |
PrintWriter | 向文本输出流打印对象的格式化表示形式 |
InputStream继承图
类 | 描述 |
FileInputStream | 从文件系统中的某个文件中获取输入字节 |
PipedInputStream | 管道输入流应该连接到管道输出流;管道输入流会提供要写入管道输出流的所有数据字节 |
FilterInputStream | 包含其它一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能 |
ByteArrayInputStream | 包含一个内部缓冲区,该缓冲区存储从流中读取的字节 |
SequenceInputStream | 表示其它输入流的逻辑串联 |
StringBufferInputStream | 已过时。 此类未能正确地将字符转换为字节 |
ObjectInputStream | ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化 |
DataInputStream | 数据输入流允许应用程序以与机器无关方式从基础输入流中读取基本 Java 数据类型 |
BufferedInputStream | 作为另一种输入流,BufferedInputStream添加了功能,即缓冲输入和支持mark 和reset方法的能力 |
PushbackInputStream | PushbackInputStream向另一个输入流添加“推回 (push back)”或“取消读取 (unread)”一个字节的功能 |
LineNumberInputStream | 主要完成从流中读取数据时,会得到相应的行号,至于什么时候分行、在哪里分行是由改类主动确定的,并不是在原始中有这样一个行号。 |
StringBufferInputStream | 已过时。 此类未能正确地将字符转换为字节 |
OutputStream继承图
类 | 描述 |
FileOutputStream | 文件输出流是用于将数据写入File 或 FileDescriptor的输出流 |
PipedOutputStream | 管道输出流可以连接到管道输入流,以创建通信管道 |
FilterOutputStream | 此类是过滤输出流的所有类的超类 |
ByteArrayOutputStream | 此类实现了一个输出流,其中的数据被写入一个字节数组 |
ObjectOutputStream | ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream |
DataOutputStream | 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中 |
BufferedOutputStream | 该类实现缓冲的输出流 |
PrintStream | 为其它输出流添加了功能,使它们能够方便地打印各种数据值表示形式 |
内存操作流的使用
ByteArrayInputStream和ByteArrayOutputStream
ByteArrayInputStream的主要是完成将内容写入到内存中;
ByteArrayOutputStream的功能是将内存中的数据输出出来。
此时操作以内存为操作点,我们之前学的流以程序为操作点
public class ByteArrayDemo { public static void main(String[] args) { ByteArrayInAndOut("QWERTYUIOP"); } //大小写的转换 public static void ByteArrayInAndOut(String str){ ByteArrayInputStream bis = null;//内存输入流 ByteArrayOutputStream bos = null;//内容输出流 bis = new ByteArrayInputStream(str.getBytes()); bos = new ByteArrayOutputStream();//直接是从ByteArrayInputStream中读取内容 int temp = 0; while((temp = bis.read())!=-1){ char c = (char) temp; bos.write(Character.toLowerCase(c)); } System.out.println(bos.toString()); try { bis.close(); bos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
总结:1.内存操作流的操作对象是以内存为准,不是以程序。
3.3、 System类对IO的支持
字段摘要 | |
static PrintStream | err |
static InputStream | in |
static PrintStream | out |
System.out 标准输出流,
public class SystemDemo { public static void main(String[] args) { //OutputStream out= System.out;//控制台输出 //try { //out.write("Hello Wrold".getBytes()); //out.close(); //} catch (IOException e) { //// TODO Auto-generated catch block //e.printStackTrace(); //} //输出重定向 PrintStream ps = null; try { ps = new PrintStream(new FileOutputStream(new File("D:" + File.separator + "test.txt"))); System.setOut(ps);// 修改了输出位置 System.out.println("Hello World!!!"); ps.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
System.in
public class SystemDemo1 { public static void main(String[] args) { //Scanner sc = new Scanner(System.in); //InputStream in = System.in; //try { //int tmep = 0; //while((tmep=in.read())!=-1){ //char c = (char) tmep; //System.out.println(c); //if(c == 'y'){ //break; //} //} //in.close(); //} catch (IOException e) { //// TODO Auto-generated catch block //e.printStackTrace(); //} //System.in 重定向 InputStream in = null; try { in = new FileInputStream("D:"+File.separator+"test.txt"); System.setIn(in); byte[] b = new byte[1024]; int len = System.in.read(b); System.out.println(new String(b,0 , len)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
System.err:错误输出
是不希望用户看到的输出内容,用法跟System.out是一样的
3.3、 BufferedReader类的作用
java.io.BufferedReader |
Buffer:表示缓冲区
StringBuffer,字符串存在缓冲区中,缓冲区的内容是可以更改的,并且可以提高效率
作用:如果利用缓冲输入输出流直接从缓冲区里面去取,不是直接到文件,那么效率就提高了。
注意:缓冲区要结合流才可以使用
• 输入输出缓冲流的缓冲区默认大小是8K,即8192字节。
• 我们还可以利用缓冲流对象的构造方法自己指定一个缓冲大小。
• 例如:BufferedInputStream bis=new BufferedInputStream(fis,1024);就是指定了缓冲区的大小为1024字节。
注意:对于缓冲的设置多少合适要结合自己的具体情况,在效率和空间之间寻找平衡点。
注意:为了确保缓冲区中的内容一定被写出,最后一定要执行flush()将缓冲区
中的内容全部写出到目标对象。
BufferedReader是防止输入的数据有可能出现中文,这样会产生乱码
public class BufferReaderDemo { public static void main(String[] args) throws IOException { //Reader reader = new InputStreamReader(new FileInputStream("D:\\test.txt")); //BufferedReader buffer = null; //buffer = new BufferedReader(reader); //String str = buffer.readLine();//读一行内容 //System.out.println(str); //reader.close(); //buffer.close(); BufferedReader buffer = null; buffer = new BufferedReader(new InputStreamReader(System.in)); String temp = null; while((temp = buffer.readLine())!=null){ System.out.println(temp); } buffer.close(); } } |