在Java中,通过java.io包提供的类来表示流,基本的输入输出流为InputStream和OutputStream。从这两个基本的输入输出流派生出面向特定处理的流,如缓冲区读写流、文件读写流等。
1 InputStream类
InputStream是抽象类,代表字节输入流的所有类的超类。这个类本身不能使用,只能通过继承它的具体类完成某些操作。它的常用方法如下:
public int available() throws IOException 返回流中可用的字节数。
public void close() throws IOException 关闭流并释放与流相关的系统资源。用户使用完输入流时,调用这个方法。
public void mark(int readlimit) throws IOException 输入流中标志当前位置。
public boolean markSupported() throws IOException 测试流是否支持标志和复位。
public abstract int read() throws IOException 读取输入流中的下一个字节。
public int read(byte[] b) throws IOException 从输入流中读取字节并存储到缓冲区数组b中,返回读取的字节数,遇到文件结尾返回-1。
public int read(byte[] b, int off, int len) throws IOException 从输入流中读取len个字节并写入b中,位置从off开始。返回写的字节数。
public void reset() throws IOException 重定位到上次输入流中调用的位置。
public long skip(long n) throws IOException 跳过输入流中n个字节,返回跳过的字节数,遇到文件结尾返回-1。
2 OutputStream类
OutputSteam是抽象类,代表输出字节流的所有类的超类。
public void close() throws IOException 关闭输出流,释放与流相关的系统资源。
public void flush() throws IOException 清洗输出流,使得所有缓冲区的输出字节全部写到输出设备中。
public void write(byte[] b) throws IOException 从特定字节数组b将b数组长度个字节写入输出流。
public void write(byte[] b, int off, int len) throws IOException 从特定字节数组b将从off开始的len个字节写入输出流。
public abstract void write(int b) throws IOException 向输出流写一个特定字节。
3 系统输入输出对象
Java定义了两个流对象System.in和System.out,允许用户在自己的程序中直接使用。System.in对象允许用户从键盘读取数据,System.out对象可以产生屏幕输出。
例:使用流对象System.in和System.out,接收用户从键盘上输入的数据并将数据输出到屏幕上。
package inputOutput;
import java.io.*; public class SystemIO {
public static void main(String[] args)
{
int bytes = 0;
byte buf[] = new byte[255];
System.out.println("\n请输入任意文本:");
try
{
//接收输入字符串
bytes = System.in.read(buf,0,255); System.out.println("这是你输入的文本行:");
String inStr = new String(buf,0,bytes);
//输出字符串
System.out.println(inStr);
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
}
4 FileInputStream类
FileInputStream(文件输入流)类是用来得到文件的输入字节流。大部分方法继承于InputStream类。它的构造方法如下:
FileInputStream(File file) 通过打开一个到实际文件的链接,创建一个文件输入流,参数file是一个文件对象。
FileInputStream(String name) 通过打开一个到实际文件的链接,创建文件输入流,参数name为文件的实际路径。
例:使用FileInputStream对象打开源程序文件
package inputOutput; import java.io.*;
public class UseFileInputStream
{
public static void main(String[] args)
{
byte buf[] = new byte[2056];
try
{
//构造文件输入流
FileInputStream fileIn = new FileInputStream("UseFileInputStream.java");
//存入缓冲buf
int bytes = fileIn.read(buf,0,2056);
String inStr = new String(buf,0,bytes);
//输出文件内容
System.out.println(inStr);
}
catch(IOException e){
System.out.println(e.getMessage());
}
}
};
注:此时需要用System.getProperty("user.dir");打印出来看看是在哪个文件夹。需将UseFileInputStream放到此文件夹下。
5 FileOutputStream类
FileOutputStream(文件输出流)类是将数据写入File或 FileDescriptor对象的输出流。它的方法大都是从OutStream继承来的,其构造方法如下:
FileOutputStream(File file) 创建输出流写到特定的file对象。
FileOutputStream(File file, boolean append) 以追加的方式写入file对象。
FileOutputStream(FileDescriptor fdObj) 创建输出文件流到fdObj对象,代表一个到实际文件的链接。
FileOutputStream(String name) 创建输出流,写到指定的name文件。
FileOutputStream(String name, boolean append) 是否以追加的方式写到指定的name文件。
例:使用FileOutputStream对象,打开一个文件,写入一行文本,然后追加一行从键盘接收的字符串
package inputOutput;
import java.io.*; public class UseFileOutputStream { public static void main(String[] args) {
// TODO 自动生成的方法存根
byte buf[] = new byte[255];
byte bufIn[] = new byte[255];
try
{
String str = "你好,这是已有的文本";
buf = str.getBytes();
//创建文件输出流对象
FileOutputStream fileOut = new FileOutputStream("Hello.txt");
//写入文件
fileOut.write(buf,0,buf.length);
//fileOut.flush();
//fileOut.close();
System.out.println("\n请输入一行文本:");
//从键盘接收文本
int bytes = System.in.read(bufIn,0,255);
//追加文本
//fileOut = new FileOutputStream("Hello.txt",true);
fileOut.write(bufIn,0,bytes);
fileOut.flush();
fileOut.close();
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
}
6 File类
用户接口和操作系统使用依赖于系统的路径字符串来命名文件和目录。File类就表示这些文件和目录路径,它代表一个抽象的依赖于系统的层次路径视图。File类允许用户向系统查询该文件的所有信息,也可以使用类来创建新的目录或者删除和重命名文件。当用户需要获得有关文件的信息时,就需要创建一个File类,而当File类用于文件读写时,通常与FileInputStream流相结合。
package inputOutput; import java.io.*; public class UseFile { public static void main(String[] args) {
// TODO 自动生成的方法存根
try
{
File f = new File("temp.txt");
System.out.println("创建临时文件");
FileOutputStream fout = new FileOutputStream(f);
PrintStream p = new PrintStream(fout);
p.println("将这句话放入临时文件");
System.out.println("写临时文件");
f.deleteOnExit();
System.out.println("删除临时文件");
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
}
7 RandomAccessFile类
RandomAccessFile(随机访问文件)类的实例支持对随机访问文件的读/写。随机访问文件就像存储在文件系统中的巨大的字节数组,通过游标或者索引(叫做文件指示器)指向这个暗含的数组,输入操作从指示器处读取字节,然后前进指针。如果随机访问文件以可读/写模式创建,那么还支持输出操作,输出操作写到暗含数组的尾端,使得数组得以扩展。
例:随机访问文件,将文件内容输出,并写入两个字符“O”、“K”。若文件内容直接输出到屏幕上,的乱码问题,添加一个parseChinese方法后,得以修正。
package inputOutput;
import java.io.*; public class UseRandom { public static void main(String[] args) {
// TODO 自动生成的方法存根
try
{
//构建随机访问文件对象
RandomAccessFile f = new RandomAccessFile("Hello1.txt","rw");
//得到文件指针和长度
long flag = 0;
long len = f.length();
//字符处理后输出
while(flag <len)
{
String s = f.readLine();
System.out.println(parseChinese(s));
flag = f.getFilePointer();
}
//末尾写入字符
f.writeChar('O');
f.writeChar('K');
f.writeUTF("美女,你好!");
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
//解决中文转换问题
public static String parseChinese(String inStr)
{
String s = null;
byte temp[];
if (inStr == null)
{
return new String("");
}
try
{
temp=inStr.getBytes("iso-8859-1");
s = new String(temp);
}
catch(UnsupportedEncodingException e)
{
System.out.println (e.toString());
}
return s;
}
}
8 对象流
8.1 ObjectInputStream类
ObjectInputStream(对象输入流)可读取使用对象输出流写入的原始数据和类型,与文件输入输出流一起可以实现对象的持久性存储。它的构造函数和一个读对象的方法如下:
public ObjectInputStream(InputStream in) throws IOException 从特定的输入流中读取并创建一个对象输入流。
Public Object readObject() 从对象输入流中读取对象。
8.2 ObjectOutputStream类
ObjectOutputStream(对象输出流)可将Java的原始数据类型和图形写入输出流,对象可以使用对象输入流读取,使用文件可以实现对象的持久存储。它的构造函数和一个写对象方法如下:
public ObjectOutputStream(OutputStream out) throws IOException 创建一个对象输出流,可以写入特定的输出流。
void writeObject(Object obj) 将对象obj写入对象输出流。
例:将日期对象和向量对象写入文件,然后从文件中读出并输出到屏幕上。要求向量对象含有三个值“语文”、“数学”和“物理”。
package inputOutput;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*; public class UseStream { public static void main(String[] args) {
// TODO 自动生成的方法存根
//构建Vector对象
Vector<String> v = new Vector<String>();
v.add("语文");
v.add("数学");
v.add("物理");
try
{
//文件处理对象
File f = new File("temp.txt");
FileOutputStream fOut = new FileOutputStream(f);
ObjectOutputStream objOut = new ObjectOutputStream(fOut);
//写入日期对象 objOut.writeObject(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
//写入Vector对象
objOut.writeObject(v);
objOut.close();
//构建readObj的实例
readObj rObj = new readObj();
//调用方法输出
rObj.readO();
}catch(IOException e)
{
System.out.println(e.getMessage());
}
}
};
//自定义类,实现读取对象并输出
class readObj extends Object
{
public void readO()
{
try
{
//文件处理对象
File f = new File("temp.txt");
FileInputStream fIn = new FileInputStream(f);
@SuppressWarnings("resource")
ObjectInputStream objIn = new ObjectInputStream(fIn);
//读取对象输出
Object ob1 = objIn.readObject();
System.out.println(ob1);
Object ob2 = objIn.readObject();
System.out.println(ob2);
}catch(IOException e){
System.out.println(e.getMessage());
}catch(ClassNotFoundException e){
System.out.println(e.getMessage());
}
}
}