【Java】输入输出流

输入/输出流

通常程序需要从外部获取/输出信息
这个“外部”范围很广,包括诸如键盘、显示器、文件、磁盘、网络、另外一个程序等
“信息”也可以是任何类型的,例如一个对象、串字符、图像、声音等
通过使用java.io包中的输入/输出流类就可以达到输入输出信息的目的

I/O流(Input/Output)

在Java中将信息的输入与输出过程抽象为I/O流
输入是指数据流入程序
输出是指数据从程序流出
一个流就是一个从源流向目的地的数据序列
IO流类一旦被创建就会自动打开
通过调用close方法,可以显式关闭任何一个流,如果流对象不再被引用,Java的垃圾回收机制也会隐式地关闭它

不论数据从哪来,到哪去,也不论数据本身是何类型,读写数据的方法大体上都是一样的:
在这里插入图片描述

预定义的I/O流类概述

输入/输出流可以从以下几个方面进行分类

  • 从流的方向划分
    输入流
    输出流
  • 从流的分工划分
    节点流
    处理流
  • 从流的内容划分
    面向字符的流
    面向字节的流

面向字符的流:专门用于字符数据

针对字符数据的特点进行过优化,提供一些面向字符的有用特性
源或目标通常是文本文件

实现内部格式和文本文件中的外部格式之间转换

  • 内部格式:16-bit char 数据类型
  • 外部格式:UTF(Universal character set Transformation Format):很多人称之为"Universal Text Format"。也包括ASCII 码及非ASCII 码字符,比如: 斯拉夫(Cyrillic)字符, 希腊字符,亚洲字符等

面向字符的抽象类——Reader和Writer
java.io包中所有字符流的抽象基类

  • Reader提供了输入字符的API
  • Writer提供了输出字符的API

它们的子类又可分为两大类

节点流:从数据源读入数据或往目的地写出数据
处理流:对数据执行某种处理

多数程序使用这两个抽象类的一系列子类来读入/写出文本信息
例如FileReader/FileWriter用来读/写文本文件
在这里插入图片描述
在这里插入图片描述

面向字节的流:用于一般目的

数据源或目标中含有非字符数据,必须用字节流来输入/输出
通常被用来读写诸如图片、声音之类的二进制数据
绝大多数数据是被存储为二进制文件的,世界上的文本文件大约只能占到2%,通常二进制文件要比含有相同数据量的文本文件小得多

InputStream和OutputStream
是用来处理8位字节流的抽象基类,程序使用这两个类的子类来读写8位的字节信息
分为两部分:节点流,处理流

标准输入输出流对象
System类的静态成员变量,包括:
System.in: InputStream类型的,代表标准输入流,这个流是已经打开了的,默认状态对应于键盘输入。
System.out:PrintStream类型的,代表标准输出流,默认状态对应于屏幕输出
System.err:PrintStream类型的,代表标准错误信息输出流,默认状态对应于屏幕输出

标准I/O重新导向
setIn(InputStream): 设置标准输入流
setOut(PrintStream):设置标准输出流
setErr(PrintStream):设置标准错误输出流
在这里插入图片描述

import java.io.*;
public class Echo {
    public static void main(String[] args)  throws IOException {
        BufferedReader in = new BufferedReader(
                                        new InputStreamReader(System.in));
        String s;
        while((s = in.readLine()).length() != 0)
           System.out.println(s);
      }
  } 

System.in
程序启动时由Java系统自动创建的流对象,它是原始的字节流,不能直接从中读取字符,需要对其进行进一步的处理
InputStreamReader(System.in)
以System.in为参数创建一个InputStreamReader流对象,相当于字节流和字符流之间的一座桥梁,读取字节并将其转换为字符
BufferedReader in
对InputStreamReader处理后的信息进行缓冲,以提高效率

处理流

不直接与数据源或目标相连,而是基于另一个流来构造
从流读写数据的同时对数据进行处理
InputStreamReader和BufferedReader都属于处理流

  • InputStreamReader读取字节并转换为字符
  • BufferedReader对另一个流产生的数据进行缓冲

在这里插入图片描述
在这里插入图片描述

文件读写

写文本文件

在C盘根目录创建文本文件Hello.txt,并往里写入若干行文本
import java.io.*;   
class FileWriterTester {
  public static void main ( String[] args ) throws IOException {  
     //main方法中声明抛出IO异常
     String fileName = "C:\\Hello.txt"; 
     FileWriter writer = new FileWriter( fileName );   
     writer.write( "Hello!\n"); 
     writer.write( "This is my first text file,\n"  );  
     writer.write( "You can see how this is done.\n" ); 
     writer.write("输入一行中文也可以\n");
     writer.close(); 
  }
}

Writer类的流可实现内部格式到外部磁盘文件格式的转换
“Hello.txt”是一个普通的ASCII码文本文件,每个英文字符占一个字节,中文字符占两个字节
Java程序中的字符串则是每个字符占两个字节的,采用Unicode编码
在这里插入图片描述

close方法清空流里的内容并关闭它。如果不调用该方法,可能系统还没有完成所有数据的写操作,程序就结束了

处理IO异常
import java.io.*;   
class FileWriterTester {
  public static void main ( String[] args ) {
    String fileName = "c:\\Hello.txt" ;
    try {  //将所有IO操作放入try块中
  	   FileWriter writer = new FileWriter( fileName ,true );
 	   writer.write( "Hello!\n");  
    	   writer.write( "This is my first text file,\n"  );  
    	   writer.write( "You can see how this is done. \n" );
        writer.write("输入一行中文也可以\n");
     	 writer.close();
    }
    catch ( IOException iox) { 
        System.out.println("Problem writing" + fileName ); }
    }
}

在这里插入图片描述
BufferedWriter类
如果需要写入的内容很多,就应该使用更为高效的缓冲器流类BufferedWriter
FileWriter和BufferedWriter类都用于输出字符流,包含的方法几乎完全一样,但BufferedWriter多提供了一个newLine()方法用于换行
不同厂家生产的计算机 (IBM, Apple, VAX, Sun) 对文字的换行方法不同。newLine()方法可以输出在当前计算机上正确的换行符

import java.io.*; 
class BufferedWriterTester {
	public static void main ( String[] args ) throws IOException	{
		String fileName = "C:/newHello.txt" ;
		BufferedWriter out = new BufferedWriter(new  FileWriter( fileName ) );
       out.write( "Hello!"  );
    	out.newLine() ; 
 		 out.write( "This is another text file using BufferedWriter,"  );   
        out.newLine(); ;
        out.write( "So I can use a common way to start a newline" ); 
        out.close();
    }
}

FileReader类
从文本文件中读取字符
继承自Reader抽象类的子类InputStreamReader
BufferedReader
读文本文件的缓冲器类
具有readLine()方法,可以对换行符进行鉴别,一行一行地读取输入流中的内容
继承自Reader

文件输入方法:
BufferedReader in = new BufferedReader(new FileReader( fileName) );
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值