输入输出流的概念
预定义的I/O流类
- 从流的方向划分
输入流
输出流 - 从流的分工划分
节点流
处理流 - 从流的内容划分
面向字符的流
面向字节的流
java.io包的顶级层次结构
- 面向字符的流:专门用于字符数据
- 面向字节的流:用于一般目的
面向字符的流
- 源或目标通常是文本文件;
- 实现内部格式和文本文件中的外部格式之间转换
- 内部格式: 16-bit char数据类型
- 外部格式:
1.UTF(Universal character set Transformation Format) :很多人称之为"Universal Text Format"
2.包括ASCII码及非ASCII码字符,比如:斯拉夫(Cyrillic)字符, 希腊字符,亚洲字符等
面向字符的抽象流类-- Reader和Writer
- java.io包中所有字符流的抽象超类。
- Reader提供了输入字符的API。
- Writer提供了输出字符的API。
- 它们的子类又可分为两大类
- 节点流:从数据源读入数据或往目的地写出数据;
- 处理流:对数据执行某种处理。
- 多数程序使用这两个抽象类的一系列子类来读入/写出文本信息
例如FileReader/FileWriter用来读/写文本文件。
标准输入输出流对象
- System类的静态成员变量
- 包括
- System.in : InputStream类型的 ,代表标准输入流,默认状态对应
于键盘输入。 - System.out : PrintStream类型的,代表标准输出流,默认状态对应
于显示器输出。 - System.err : PrintStream类型的,代表标准错误信息输出流,默认
状态对应于显示器输出。
- System.in : InputStream类型的 ,代表标准输入流,默认状态对应
按类型输入/输出数据
- printf方法
System.out.printf("%-12s is %2d long", name, l);
System.out.printf("value = %2.2F",value);
%n是平台无关的换行标志。
- Scanner
Scanner s = new Scanner(System.in);
int n = s.nextInt();
口还有下列方法: nextByte(),nextDouble(),nextFloat(),nextInt(),
nextLine(),nextLong(),nextShort().
写文本文件
创建文件并写入若干行文本
import java.io.*;
class FileWriterTester {
public static void main ( String[] args ) throws IOException {
//main方法中声明抛出IO异常
String fileName = "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();
}
}
运行结果:
但是有时候换行那里会出现问题,后面可以用BufferedWriter解决。
写入文本文件,处理IO异常
import java.io.*;
class FileWriterTester {
public static void main ( String[] args){
String fileName = "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 ); }
}
}
说明:
运行此程序,会发现在原文件内容后面又追加了重复的内容,这就是将构
造方法的第二个参数设为true的效果。
如果将文件属性改为只读属性,再运行本程序,就会出现IO错误,程序将
转入catch块中,给出出错信息。
写入文本文件使用BufferedWriter
BufferedWriter类
- FileWriter和BufferedWriter类都用于输出字符流,包含的方法几乎完
全一样,但BufferedWriter多提供了一个newLine()方法用于换行。 - 不同的系统对文字的换行方法不同。newLine()方法可以输出在当前
计算机上正确的换行符。
import java.io.*;
class BufferedWriterTest {
public static void main ( String[] args ) throws IOException {
String fileName = "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。
读文本文件并显示
import java.io.*;
class BufferedReaderTester {
public static void main ( String[] args ){
String fileName = "Hello.txt" ,line;
try{
BufferedReader in = new BufferedReader(new FileReader( fileName ));
line = in.readLine(); //读取一 行内容
while ( line!= null) {
System.out.println( line ); line = in.readLine();
}
in.close();
}
catch ( IOException iox ) { System.out.println("Problem reading " + fileName ); }
}
}
运行结果:
- 运行该程序,屏幕上将逐行显示出Hello.txt文件中的内容。
- FileReader对象:创建后将打开文件,如果文件不存在,会抛出一个IOException
- BufferedReader类的readLine(方法:从一个面向字符的输入流中读取一行文本。如果其中不再有数据,返回null
- Reader类的read(方法:也可用来判别文件结束。该方法返回的一个表示某个字符的int型整数,如果读到文件末尾,返回-1。据此,可修改本例中的读文件部分:
int c;
while((c=in.read()!= -1) System.out.print((char)c);
- close()方法:为了操作系统可以更为有效地利用有限的资源,应该在读取完毕后,调用该方法.