第十三章 输入/输出
输入/输出就是程序与文件或内存或设备交换信息,即读取信息和输出信息.
在Java语言中,程序通过数据流来实现输入/输出。数据流是使用类创建的对象。
1.File类
文件操作主要包括三种形式:按照顺序读/写文件内容;以随机方式读/写文件内容;对文件属性进行操作。
数据流实现文件内容的读写,RandomAccessFile类实现文件的随机读写。
①File类的构造方法
File(String filename)
File(String directoryPath,String filename)
File(File f,String filename)
filename指文件名,directoryPath指文件所在的目录,f指文件所在的目录对象
②实用方法
获取文件属性的方法
public String getName()
public String getPath()
public String getAbsolutePath() 获取文件绝对路径
public long length() 获取文件的长度(单位是字节)
public String getParent() 获取文件的父目录
public File getParentFile() 获取文件的父目录
public long lastModified() 获取文件最后修改时间
public boolean canRead() 判断文件是否可读
public boolean canWrite()
public boolean exists() 判断文件是否存在
public boolean isFile() 判断是不是一个正常文件
public boolean isDirectory() 判断是不是一个目录
public boolean isHidden() 判断文件是不是隐藏文件
文件操作
public boolean renameTo(File dest) 将文件名改为dest)
public boolean delete() 删除文件
目录操作
public boolean mkdir() 创建目录
public String []list() 以字符形式列出目录
public File []listFiles() 以file对象形式列出目录
2.数据流概述
为了使程序与外部设备相对独立,需将外设封装为数据流。程序通过数据流对外设进行读/写。
数据流就是使用系统预定义的类创建的对象。
①数据流分类
从流动方向来看,数据流分为输入流和输出流。从程序的角度来看,当使用数据流中的方法读取数据节点中的数据时,则称该数据流为输入流,当使用数据流中的方法把数据写到数据节点时,则称该数据流为输出流。
3.字节流
字节流的两个抽象超类是字节输入流(InputStream)和字节输出流(OutputStream)。
①InputStream类
常用方法:
int read()从数据源中读取单个字节的数据
int read (byte b[]) 从数据源中试图读取b.length个字节到b中,返回实际读取的字节数目
int read(byte b[],int off ,int len)
void close() 关闭输入流
long skip(long numBytes) 跳过numBytes个字节,并返回实际跳过的字节数目。
OutputStream类:
常用方法
void write(int n) 向输出流写入单个字节
void write(byte b[]) 相输出流写入一个字节数组
void write(byte b[],int off,int len) 从给定字节数组中起始于偏移量off处,取len个字节写到输出流。
②FileInputStream类
FileInputStream类是InputStream类的子类,可以使用该类对象读取文件内容。
构造方法:
public FileInputStream(String name)throws FileNotFoundException
public FileInputStream (File file)throws FileNotFoundException
②FielOutputStream类
FileOutputStream类是OutputStream类的子类,可以使用该类对象将数据写入文件。
构造方法:
public FileOutputStream(String name) throws FileNotFoundException
public FileOutputStream(File file)throws FileNotFoundException
public FileOutPutStream(String name,boolean append) throws FileNotFoundException
name为文件名,file为File对象,append表示文件的写入方式。
4.字节缓存流
字节缓存流包括字节缓存输入流(BufferedInputStream)和字节缓存输出流(BufferedOutputStream)
①字节缓存输入流(BufferedInputStream)
构造方法:
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in ,int size)
构造字节缓存输入流的步骤:
FileInputStream in=new FileInputStream(A.txt); //构造文件字节输入流
BufferInputStream inbuffer=BufferedInputStream(in); //构造缓存输入流
②字节缓存输出流(BufferedOutputStream)
构造方法:
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out, int size)
构造字节缓存输出流的步骤:
FileOutputStream out=new FileOutputStream(B.txt)
BufferedOutputStream outbuffer=BufferedOutputStream(out)
5.字符流
字节流不能直接操作Unicode字符,因为汉字在文件中占用两个字节,如果使用字节流读取文件就会出现乱码的现象,此时采用Java提供的字符流就可解决这个问题。
字符流的两个抽象祖先类是字符输入流(Reader)和字符输出流(Writer)。
Reader类是所有字符输入流的父类,可使用其子类对象读数据。
Writer类是所有字符输出流的父类,可使用其子类对象输出数据。
①Reader类
int read() 输入流调用该方法从源中读取一个字符,返回一个参数。如果为读出字符,则返回-1
int read(char b[]) 输入流调用该方法从源中读取b.length个字符到字符数组b中,返回实际读取的字符数目
int read(char b[],int off ,int len) 输入流调用该方法从源中读取len个字符并存放到字符数组b中,返回实际读取的字符数目
void close() 关闭输入流
long skip(long numBytes) 跳过numBytes个字节,并返回实际跳过的字节数目。
②Writer类
void write(int n) 向输出流写入单个字节
void write(char b[]) 相输出流写入一个字符数组
void write(char b[],int off,int len) 从给定字节数组中起始于偏移量off处,取len个字符写到输出流。
void write(String str)向输出流写入一个字符串
void close() 关闭输出流
③FileReader类
FileReader类是Reader类的子类,可以使用该类对象从文件中读取数据。
public FileReader(File file) throws;
public FileReader(String name) throws;
④FileWriter类
FileWriter类是Write类的子类,可以使用该类对象将数据写入文件。
public FileWriter(File file) throws IOException
public FileWriter(String name)throws IOException
public FileWriter(File file,boolean append) throws IOException
public FileWriter(String name,boolean append)throws IOException
name为文件名,file为File对象,append表示文件写入的方式
6.字符缓存流
①字符缓存输入流BufferReader
BufferReader类的构造方法
BufferReader(Reader in) 以输入流in为参数,构造缓存输入流
BufferReader(Reader in int sz) 以输入流in,缓冲区大小size为参数,构造缓存输入流
构造字符缓存输入流的步骤:
FileReader in=new FileReader(A.txt) //构造文件字符输入流
BufferReader inbuffer=Bufferreader(in) //构造字符缓存输入流
②字符缓存输出流
BufferWriter类的构造方法
BufferedWriter(Writer out)
BufferedWriter(Writer out int size)
构造字符缓存输出流的步骤:
FileWriter out=new FileWriter(B.txt) //构造文件字符输出流
BufferWriter outbuffer=BufferedWriter(out) //构造字符缓存输出流
7.RandomAccessFile类
前面介绍的数据流只能按顺序读/写文件,不能使用同一个流对象读/写文件内容。RandomAccessFile类与此不同,使用该类的同一个对象可以随机读写文件
①构造方法
public RandomAccessFile(File file,String mode) throws FileNotFoundException;
public RandomAccessFile(String name,String mode)throws FileNotFoundExceptionl
name表示文件名,file表示文件对象,mode用于指定对文件的访问方式,。当文件不存在时,构造方法将抛出FileNotFoundException异常
②实用方法
|
close()关闭此随机访问文件流并释放与该流关联的所有系统资源。 |
|
length() 返回此文件的长度。 |
|
read() 从此文件中读取一个数据字节。 |
|
read(byte[] b) 将最多b.length个数据字节从此文件读入 byte 数组。 |
|
read(byte[] b, int off, int len) 将最多len个数据字节从此文件读入 byte 数组。 |
|
readBoolean() 从此文件读取一个boolean。 |
|
readByte() 从此文件读取一个有符号的八位值。 |
|
readChar() 从此文件读取一个字符。 |
|
readDouble() 从此文件读取一个double。 |
|
readFloat() 从此文件读取一个float。 |
|
readInt() 从此文件读取一个有符号的 32 位整数。 |
|
readLine() 从此文件读取文本的下一行。 |
|
readLong() 从此文件读取一个有符号的 64 位整数。 |
|
readShort() 从此文件读取一个有符号的 16 位数。 |
|
seek(long pos) 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作 |
|
readUTF() 从文件中读取一个UTF字符串 |
|
setLength(long newLength) 设置此文件的长度。 |
|
skipBytes(int n)尝试跳过输入的n个字节以丢弃跳过的字节。 |
|
write(byte[] b) 将b.length个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。 |
|
write(byte[] b, int off, int len) 将len个字节从指定 byte 数组写入到此文件,并从偏移量off处开始。 |
|
write(int b) 向此文件写入指定的字节。 |
|
writeBoolean(boolean v)按单字节值将boolean写入该文件。 |
|
writeByte(int v)按单字节值将byte写入该文件。 |
|
writeChar(int v) 按双字节值将char写入该文件,先写高字节。 |
|
writeChars(String s) 按字符序列将一个字符串写入该文件。 |
|
writeDouble(double v)使用Double类中的doubleToLongBits方法将双精度参数转换为一个long,然后按八字节数量将该long值写入该文件,先定高字节。 |
|
writeFloat(float v)使用Float类中的floatToIntBits方法将浮点参数转换为一个int,然后按四字节数量将该int值写入该文件,先写高字节。 |
|
writeInt(int v) 按四个字节将int写入该文件,先写高字节 |
|
writeLong(long v) 按八个字节将long写入该文件,先写高字节。 |
|
writeShort(int v) 按两个字节将short写入该文件,先写高字节。 |
|
WriteUTF(String s) 写入一个utf字符串 |
8.数据流
使用字符流对象只能以字符类型的数据对文件进行读写,使用字节流只能以字节类型的数据对文件进行读写,而使用数据流(本届所知的数据流是指用具体的类创建的对象对象)才能以各种数据类型对文件进行读写。数据流包括数据输入流DataInputStream和数据输出流 DataOutputStream
①数据输入流DataInputStream
构造方法:public DataInputStream(InputStream in) in代表输入流对象
实用方法:
close()
readBoolean()
readByte()
。。。。
②数据输出流DataOutputStream
构造方法:public DataOutputStream(OutputStream out) out代表输出流对象
实用方法:
close()
writeBoolean(boolean v)
…
③管道
在实际应用中,可以利用各种流的特点将多个流套接在一起构成一个管道。程序通过输入管道读取数据源点数据,通过输出管道向数据终点写数据。这里的数据源点和数据重点一般是指文件或内存。
输入管道:
下面由三种基本的输入管道(每种管道代表一种流):1号(FileInputStream)、2号(BufferedInputStream)、3号(DataInputStream)。

输出管道:
下面由三种基本的输出管道:1号(FileOutputStream)、2号(BufferedOutputStream)、3号(DataOutputStream)

9.对象流
适用对象流可以直接把对象写入文件,也可以直接从文件中读取一个对象。对象流分为对象输入流(ObjectInputStream)和对象输出流(ObjectOutputStream)
①对象输入流ObjectInputStream
构造方法:
public ObjectInputStream (InputStream in) throws IOException
实用方法:
public final Object readObject() throws OptionalDataException,ClassNotFoundException,IOException
②对象输出流(ObjectOutputStream
构造方法:
public ObjectOutputStream(OutputStream out) throws IOException
实用方法:
public final void writeObject(Object obj) throws IOException
可见要用对象流对文件进行读写,必须对文件进行两次封装。

浙公网安备 33010602011771号