Java提供了专用于输入输出功能的包java.io,其中包含了5个非常重要的类,所有与输入输出有关的类都继承了这5个类
- 文件流 FileInputStream FileOutputStream
- 字节流 InputStream OutputStream
- 字符流 Reader Writer
- 过滤流 FilterInputStream FilterOutputStream
- 基本流 System.out System.in
按所读写的数据类型分为两类:
- 字节流类(Byte Streams):字节流类用于向字节流读写8位二进制的字节。一般地,字节流类主要用于读写诸如图像或声音等的二进制数据
- 字符流类(Character Streams):字符流类用于向字符流读写16位二进制字符
InputStream类
- 类中包含了一套所有输入流都需要的方法,可以完成最基本的从输入流读取数据的功能
- 当java程序需要从外设中读入数据时,先创建一个适当类型的输入流类对象来完成与外设的连接,然后再调用执行该新建对象的特定方法,实现对应外设的操作。
InputStream子类对象继承InputStream类的如下方法
- read()方法、定位指针的方法、close()方法
- public int read()
- 使用完毕后,应用close()方法关闭流
InputStream常用子类
- FileInputStream
用于从文件File中将诸如图像数据之类的原始字节的数据流读出
- ByteInputStream
此类实现了一个输入流,从一个byte数组中读出数据
- ObjectInputStream
实现对象的持久存储,从OutputStream读入java对象的基本数据类型和图形
<span style="font-size:12px;">//使用FileInputStream从文件中读取字节流
//未考虑异常处理
import java.io.*;
public class TestFileInputStream {
public static void main(String[] args) throws Exception{
int b = 0;
long num = 0;
FileInputStream in = new FileInputStream("c://source.txt");//或"c:/source.txt"
while((b=in.read())!=-1){//一次读一个字节,判断是否读到文件结尾
System.out.print((char)b);
num++;
}
in.close();
System.out.println("\n共读取了 "+num+" 个字节");
}
}</span>
OutPutStream类
当java程序需要向某外设输出数据时,先要创建一个输出流类对象,通过该对象实现与外设的连接,再利用OutputStream类提供的方法将数据写入该外设中
OutputStream类是一个抽象类,不能直接创建OutputStream类对象,而应该创建它的某个子类的对象。
子类的继承方法有:
- Write()方法、flush()方法和close()方法
- public void write(int c); 将参数c对应的字符写入输出流
- public void write(char array[]); 将字符数组array中全部字符顺序写入输出流
- 使用完毕后,应用close()方法关闭流
OutputStream常用子类
- FileOutputStream
用于将诸如图像数据之类的原始字节的数据流写入File
- ByteArrayOutputStream
此类实现了一个输出流,数据被写入一个byte数组
- ObjectOutputStream
实现对象的持久储存,将java对象的基本数据类型和图形写入OutputStream
- PipedOutputStream
将管道输出流连接到管道输入流来创建通信管道
<span style="font-size:12px;">//以字节流方式,将一个文件中的信息复制到另一个文件
//读入:程序<-FileInputStream<-文件(信息源)
//写出:程序->FileOutputStream->文件(信息去向)
//未考虑异常处理
import java.io.*;
public class TestFileCopy_Stream {
public static void main(String[] args)throws Exception {
int b = 0;
FileInputStream in = null;
FileOutputStream out = null;
//数据源,用于向程序中读取信息
in = new FileInputStream("e://source.txt");
//目标文件,程序将信息写到此文件中,会自动创建文件
out = new FileOutputStream("e://dest.txt");
while((b=in.read())!=-1){//一次读一个字节,判断是否读到文件结尾
out.write(b);//一次写一个字节
}
in.close();
out.close();
System.out.println("文件已复制");
}
}</span>
Reader类
- 用来以字符方式从流中读入数据。Reader类中包含了一套所有字符输入流都需要的方法,可以完成最基本的从字符输入流读取数据的功能
- Reader类是一个抽象类,所以实际应用中创建的对象是Reader某个子类的对象,通过该子类对象与外接数据源连接
- 子类必须实现的方法只有
- int read(char[] b,int offset,int length);
- void close();
- 当输入流使用完毕后,可以调用该方法将其关闭,断开java程序与外接数据源的联系,释放此连接所占用的系统资源
Reader类常用子类
- BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
可以指定缓冲区的大小
- InputStreamReader
字节流通向字符流的桥梁:它使用指定的charset读取字节并将其解码为字符
每次调用InputStreamReader的read()方法都会导致从底层输入流读取一个或多个字节
- FileReader
用来读取字符文件的类
用于读取字符流
Writer类
- 用来以字符方式从流中写入数据。Writer类中包含了一套所有字符输出流都需要的方法,可以完成最基本的向字符输出流写入数据的功能
- Writer类是一个抽象类,所以实际应用中创建的对象是Writer某个子类的对象,通过该子类对象与外接数据源连接
子类必须实现的方法只有 - void write(char[] b,int offset,int length);
- void close();
- void flush();//强制清空缓冲区
- 当输出流使用完毕后,关闭输出流,断开java程序与外接数据源的连接,释放此连接所占用的系统资源
Writer类常用子类
- BufferedWriterStream
将文本写入字符输出流,缓冲各个字符
可以指定缓冲区的大小
- OutputStreamWriter
字符流通向字节流的桥梁:它使用指定的charset将要写入流中的字符编码为字节
每次调用write()方法都会导致在给定字符(或字符集)上调用编码转换器
- FileWriter
用来写入字符文件的类
文件是否可用或是否可以被创建取决于底层平台
- PrintWriter
向文本输出流打印对象的格式化表示形式
<span style="font-size:12px;">//输入字符串、浮点数、整数在屏幕上显示输入结果
//输入流的套接使用,
//System.in -> InputStreamReader -> BufferedReader
import java.io.*;
public class standardIO3{
public static void main(String[] args) throws IOException{
//使用System.in创建InputStreamReader类对象ii
InputStreamReader iin=new InputStreamReader(System.in);
//创建BufferedReader类对象bin,并关联到iin
BufferedReader bin=new BufferedReader(iin);
//或者合并写成如下
//BufferedReader stdin= new BufferedReader( new InputStreamReader(System.in));
String s;
float f;
int i=0;
System.out.println("输入任一字符串");
s=bin.readLine();
System.out.println("输入浮点数");
f=Float.parseFloat(bin.readLine());
System.out.println("输入整数");
i=Integer.parseInt(bin.readLine());
System.out.println("输入的字符串:"+s);
System.out.println("输入的浮点数:"+f);
System.out.println("输入的整数:"+i);
}
} </span>
文件处理
File类
- File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新File实例
- exists()
测试此抽象路径名表示的文件或目录是否存在
- canRead()
测试应用程序是否可以读取此抽象路径名表示的文件
- listFiles()
返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
- mkdir()
创建此抽象路径名指定的目录
使用BufferWriter类的方法:
- 为文件建立FileWriter对象
- 再为该FileWriter对象建立BufferWriter类对象
- 写入操作将使用所建立的BufferWriter类对象
向磁盘文件写入各类数据
- java通过DataInputStream & DataOutputStream类实现各类数据的读写。向文件写入各种类型数据的具体步骤是:
- 为磁盘文件建立File对象
- 为File对象建立FileOutputStream类流对象,建立其与磁盘文件的连接
- 为FileOutputStream类流对象建立DataOutputStream类对象
- 利用DataOutputStream类的writeInt(),writeFloat(),writeDouble(),writeBoolean()等方法,分别向文件中写入整型、单精度型、双精度型、布尔型等数据
- 写入操作完成后,利用close()方法将流关闭,断开与磁盘文件的联系
基本流
java系统预先定义好3个流对象,分别表示标准输入设备、标准输出设备和标准错误设备。
- System.in : 用于程序的输入; 对应外设为键盘
- System.out : 用于一般输出; 对应外设为屏幕
- System.err : 用于显示出错信息; 对应外设为屏幕
System类的所有属性都是静态static的,调用时以类名System为前缀。