IO流(2)

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 = (chartemp;

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.lang.Object

  java.io.Reader

      java.io.BufferedReader

 

 

Buffer:表示缓冲区

StringBuffer,字符串存在缓冲区中,缓冲区的内容是可以更改的,并且可以提高效率

作用:如果利用缓冲输入输出流直接从缓冲区里面去取,不是直接到文件,那么效率就提高了。

注意:缓冲区要结合流才可以使用

 

• 输入输出缓冲流的缓冲区默认大小是8K,即8192字节。

• 我们还可以利用缓冲流对象的构造方法自己指定一个缓冲大小。

• 例如:BufferedInputStream bis=new BufferedInputStream(fis,1024);就是指定了缓冲区的大小为1024字节。

注意:对于缓冲的设置多少合适要结合自己的具体情况,在效率和空间之间寻找平衡点。

注意:为了确保缓冲区中的内容一定被写出,最后一定要执行flush()将缓冲区

中的内容全部写出到目标对象。

 

 

 

BufferedReader是防止输入的数据有可能出现中文,这样会产生乱码

 

public class BufferReaderDemo {

public static void main(String[] argsthrows 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();

}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值