流和文件( 2)
辽宁经济职业技术学院信息系
硕士、副教授 陈英
文本流
因为 java使用了 Unicode字符,而在 Windows上的字
符串以 ASCII格式保存。如果以 Unicode编码格式的
字符串被写到一个文件中,那么在主机环境下该文件
很可能不能读。
为此 java使用了一组流过滤器来桥接了 Unicode编码
文本和本地操作系统编码的隔阂。
所有的这些类都派生自抽象类 Reader和 Writer类,并
且名字都保留了二进制数据的类的名字特征。
例,下面代码创建了一个读取器,它可以读取控制台
的击键并且自动把它们转化为 Unicode。
InputStreamReader in = new
InputStreamReader(System.in);
文本流
以二进制格式写数据,使用一个
DataOutStream。
以文本格式写数据,使用一个 PrintWriter。
因为把一个读取器或者写入器连接到一个
文件上是常见的操作,所以 java引入了两个
方便的类,FileReader和 FileWriter。
例:
FileWriter out = new
FileWriter(“output.txt”)
文本流
对于文本输出,可以使用一个 PrintWriter。一
个打印写入器可以以文本格式打印字符串和数
字。一个 PrintWriter必须被结合一个目的写入
器。
PrintWriter out = new PrintWriter (new
FileWriter(“employee.txt”));
也可以把一个打印写入器同一个目的(输出)
流结合进来。构造器
PrintWriter(OutputStream)会自动添加一个
OutputStreamWriter来把流中的 Unicode字符
转化为字节。
PrintWriter out = new PrintWriter (new FileWriter
OutputStream(“employee.txt”));
java.io.PrintWriter(打印写入器 )
Println方法会自动添加正确的行尾符
( Windows上,\r\n”)得到的。
PrintWriter(Writer out,boolean autoFalush)
创建一个新的 PrintWriter。若 autoFalush为
true,那么 Println方法将清洗输出缓冲。
void print(object obj) 打印一个对象 (实际
上打印该对象得 toString结果字符串 )。
void println(String s)
打印 Unicode字符串并加上一个行结束符。如
果启用了自动清洗模式,那么清洗该流。
读文本输入
处理文本输入只有一个 BufferedReader类,
它有一个方法 readLine能够读取一行文本。
你需要把一个缓冲的读取器同一个输入源结
合进来。
BufferedReader in = new
BufferedReader(FileReader(,employee.txt”));
若要从文本输入中读取数字,你需要首先读
取一个字符串,然后把它转化为一个数字。
String s =in.readLine();
double x = Double.parseDouble(s)
文件的输入输出
文件对象的建立
File fp=new File(“tempfile.txt”);
文件对象的建立,对文件操作要定义文件流。
File对象表示的是通向你的硬盘上的一个实际文件
或者目录的路径,而不是一个流,你可以从一个表示
相应文件路径的 File对象生成与该文件对应的流对
象。
输出文件 输入文件 read
writ
e
文件的输入输出
增加缓冲区流,减少访问硬盘的次数,提高效率
文件
文件流 缓冲区流
file1.txt file2.txt
输入流 输出流
输入缓冲区 输出缓冲区
文件的输入输出
?FileInputStream类用来打开一个输入文件 。
?FileOutputStream类用来打开一个输出文件 。
FileInputStream fin=new FileInputStream
(“tempfile.txt”);
FileInputStream和
FileOutputStream用
于读写一个磁盘文件
文件的输入输出
文件流的建立
FileInputStream in=new
FileInputStream(fp);
FileOutputStream out=new
FileOutputStream(fp);
例,文件拷贝 (注意要捕获文件异常 )
输入流的参数是用于输入的文件名
输出流的参数是用于输出的文件名
FileInputStream和
FileOutputStream
这些类是结点流,而且正如这个名字
所暗示的那样,它们使用磁盘文件。
这些类的构造函数允许你指定它们所
连接的文件。要构造一个
FileInputStream,所关联的文件必须
存在而且是可读的。
如果你要构造一个 FileOutputStream
而输出文件已经存在,则它将被覆盖
BufferInputStream和
BufferOutputStream
一个过滤器输入流是用一个到已存在的输
入流的连接创建的。此后,当你试图从过
滤输入流对象读时,它向你提供来自另一
个输入流对象的字符。
BufferInputStream和 BufferOutputStream
这些是过滤器流, 它们可以提高 I/O操作的效
率 。
DataInputStream和 DataOutputStream
这些过滤器通过流来读写 Java基本类 。
文件的输入输出
缓冲区流,
BufferedInputStream和
BufferedOutputStream
将它们与文件流相接
FileInputStream in=new
FileInputStream(“file1.txt”);
BufferedInputStream bin=
new BufferedInputStream(in,256)
int len; byte bArray[]=new byte[256];
len=bin.read(bArray);
len中得到是长度,bArray中得到的是数据
import java.io.*;
class filestream
{ public static void main(String args[])
{ try{
File inFile=new File(”file1.txt");
File outFile=new File(”file2.txt");
FileInputStream fis=new FileInputStream(inFile);
FileOutputStream fos=new FileOutputStream(outFile);
int c; while((c=fis.read())!=-1) fos.write(c);
fis.close(); fos.close();
}catch(FileNotFoundException e) {
System.out.println("FileStreamsTest,"+e);
}catch(IOException e) {
System.err.println("FileStreamsTest,"+e);
}}}
数据输入输出流
什么时候需要数据输入输出流?
文件流和缓冲区流的处理对象是字节或字节
数组,利用数据输入输出流可以实现对文件
的不同数据类型的读写,
DataInputStream,DataOutputStream
一种较为高级的数据输入输出方式,除了字节
和字节数组,还可以处理 int,float,boolean等类
型,
还可以用 readLine方法读取一行信息
可使用的方法,
write,writeBoolean…,read,readByte… 等
数据输入输出流
数据流的建立
FileOutputStream fos=
new FileOutputStream(”file2.txt"));
DataInputStream dis=
new DataInputStream(fos)
数据输出流可以是一个已经建立好的输入数据
流对象,例如网络的连结,文件等,
下面的例子显示如何利用数据输入输出流往文
件中写不同类型的数据
输入输出方法import java.io.*;
public class ReadHello
{ public static void main(String args[])
{ char inChar;
System.out.println("Enter a character:");
try
{ inChar = (char)System.in.read();
System.out.println(" "+ inChar);
}
catch(IOException e)
{ System.out.println("Error reading from user");
}
}
输入输出方法
import java.io.*;
class IOTest
{ public statics void main(String args[])
{try { byte bArray[]=new byte[128];
System.out.println(“Enter something:”);
System.in.read(bArray);
System.out.print(“You entered:”);
System.out.println(bArray);
}catch(IOException ioe)
{ System.out.println(ioe.toString()); }
}
}
输入输出方法
为什么输入的是字符,输出是乱码?
原因,System.out.println(bArray)输出的是数
组的地址而不是字符
改进,将字符数组变换成字符串
原来是,System.out.println(bArray);
现在为,String s=new String(bArray,0);
System.out.println(s);
System.in是属于 BufferedInputStream类型
System.out是属于 PrintStream类型
System.err也是属于 PrintStream类型
文件的输入输出
FileInputStream( String name)
使用 name参数指定的文件路径来创建一个新
的文件输入流。
FileInputStream( File f)
使用封装进 File对象中的信息来创建一个新的
文件输入流。
FileOutputStream( String name)
根据 name字符串创建一个新的文件输出流。
路径名并不是绝对的,它相对于当前工作目录。
注:该方法会把已经存在的同名文件删除。
java.io.BufferedInputStream
BufferedInputStream(InputStream in)
使用默认的缓冲大小来创建一个新的缓冲流。
一个缓冲输入流从一个流中读取字符但不会
每次都导致设备访问。当缓冲为空时,一个
新的数据块就会被读取到缓冲中。
BufferedInputStream(InputStream in,int n)
使用用户定义的缓冲大小来创建一个新的缓
冲流。
java.io.BufferedOutputStream
BufferedOutputStream(OutputStream out)
使用默认的缓冲大小来创建一个新的缓冲流。
一个缓冲输出流会收集被写的字符而不会每
次都导致设备访问。当缓冲已满后,或者流
被清洗,那么数据就会被写访问。
BufferedInputStream(OutputStream out,int
n)
使用用户定义的缓冲大小来创建一个新的缓
冲流。
java.io.PushbackInputStream
PushbackInputStream(InputStream in)
构造一个具有一个字节预先量的流。
PushbackInputStream(InputStream in)
构造一个具有指定大小的预先缓冲的流。
Void unread(int b)
回退一个字节,它被用于下一次读取调
用。每次只能回退一个字符。其中参数
b 表示将要重新读取的字节。
随机访问文件流
RandomAccessFile流用于读写一个文件中任意位置
的数据。它实现了 DataInput和 DataOutput接口。
磁盘文件可以随机访问,但是来自网络连接的数据
则不可以这么做。
打开一个随机访问文件的方法或者是只读或者是读
写。这需要分别把字符串,r”(随机读)或者,rw”
(随机读写)作为构造器的第二个参数。
RandomAccessFile in = new
RandomAccessFile(“employee.dat”,”r”);
RandomAccessFile inOut = new
RandomAccessFile(“employee.dat”,”rw”);
java.io.RandomAccessFile
一个随机文件也具有一个文件指针。该文件指针总是
表明下一个需要读写记录的位置。 Seek方法用于把文
件指针设置到文件的任意字节位置。
getFilePointer方法返回文件指针的当前位置。
RandomAccessFile(String name,String mode)
其中参数 name表示文件名,mode为,r”用于只读;
,rw”用于读写。
long getFilePointer() 返回指针的当前位置。
void seek(long pos)
把文件指针设置为偏移文件开始的 pos字节处。 Pos值
介于 0到文件长度(单位字节)之间。
long length() 返回文件的长度(单位字节)。
ZIP文件流
ZIP文件是存储了一个或多个文件的存档文
件,它通常使用压缩格式。
每个 ZIP文件都有一个头部,它包含了文件
名和使用的压缩方法等信息。
Java使用 ZipInputStream来读取一个 ZIP文
件。其方法是在 ZipInputStream构造器中使
用一个 FileInputStream。接着你需要查看存
档中的每一项,
getNextEntry方法返回一个 ZipEntry类型的
对象。
Java.util.zip.ZipInputStream
zipInputStream(InputStream in)
该构造器使用一个给定的 InputStream来创建
一个 zipInputStream。其中 in表示底层的输
入流。
zipEntry getNextEntry()
返回一个表示下一项的 zipEntry对象。如果
没有更多的项则返回 null。
void closeEntrys()
关闭 ZIP文件中的当前打开项。你还可以继
续使用 getNextEntry()来读取下一项。
System类
System类管理标准输入输出流和错误流。
System.out:把输出送到缺省的显示 (通常是显
示器 )。
System.in:从标准输入获取输入 (通常是键
盘 )。
System.err:把错误信息送到缺省的显示。
每当 main方法被执行时,就自动生成上述三个
对象。
System.in是属于 BufferedInputStream类型
System.out是属于 PrintStream类型
System.err也是属于 PrintStream类型
PrintStream类
println()不属于 OutputStream类,它是
PrintStream类的子类,能提供复杂的输出
PrintStream类的方法有,
write,flush,checkError,print,println,close.
其中 println可以输出多种形式的数据,
例如,
println(String s),println(char c)等
辽宁经济职业技术学院信息系
硕士、副教授 陈英
文本流
因为 java使用了 Unicode字符,而在 Windows上的字
符串以 ASCII格式保存。如果以 Unicode编码格式的
字符串被写到一个文件中,那么在主机环境下该文件
很可能不能读。
为此 java使用了一组流过滤器来桥接了 Unicode编码
文本和本地操作系统编码的隔阂。
所有的这些类都派生自抽象类 Reader和 Writer类,并
且名字都保留了二进制数据的类的名字特征。
例,下面代码创建了一个读取器,它可以读取控制台
的击键并且自动把它们转化为 Unicode。
InputStreamReader in = new
InputStreamReader(System.in);
文本流
以二进制格式写数据,使用一个
DataOutStream。
以文本格式写数据,使用一个 PrintWriter。
因为把一个读取器或者写入器连接到一个
文件上是常见的操作,所以 java引入了两个
方便的类,FileReader和 FileWriter。
例:
FileWriter out = new
FileWriter(“output.txt”)
文本流
对于文本输出,可以使用一个 PrintWriter。一
个打印写入器可以以文本格式打印字符串和数
字。一个 PrintWriter必须被结合一个目的写入
器。
PrintWriter out = new PrintWriter (new
FileWriter(“employee.txt”));
也可以把一个打印写入器同一个目的(输出)
流结合进来。构造器
PrintWriter(OutputStream)会自动添加一个
OutputStreamWriter来把流中的 Unicode字符
转化为字节。
PrintWriter out = new PrintWriter (new FileWriter
OutputStream(“employee.txt”));
java.io.PrintWriter(打印写入器 )
Println方法会自动添加正确的行尾符
( Windows上,\r\n”)得到的。
PrintWriter(Writer out,boolean autoFalush)
创建一个新的 PrintWriter。若 autoFalush为
true,那么 Println方法将清洗输出缓冲。
void print(object obj) 打印一个对象 (实际
上打印该对象得 toString结果字符串 )。
void println(String s)
打印 Unicode字符串并加上一个行结束符。如
果启用了自动清洗模式,那么清洗该流。
读文本输入
处理文本输入只有一个 BufferedReader类,
它有一个方法 readLine能够读取一行文本。
你需要把一个缓冲的读取器同一个输入源结
合进来。
BufferedReader in = new
BufferedReader(FileReader(,employee.txt”));
若要从文本输入中读取数字,你需要首先读
取一个字符串,然后把它转化为一个数字。
String s =in.readLine();
double x = Double.parseDouble(s)
文件的输入输出
文件对象的建立
File fp=new File(“tempfile.txt”);
文件对象的建立,对文件操作要定义文件流。
File对象表示的是通向你的硬盘上的一个实际文件
或者目录的路径,而不是一个流,你可以从一个表示
相应文件路径的 File对象生成与该文件对应的流对
象。
输出文件 输入文件 read
writ
e
文件的输入输出
增加缓冲区流,减少访问硬盘的次数,提高效率
文件
文件流 缓冲区流
file1.txt file2.txt
输入流 输出流
输入缓冲区 输出缓冲区
文件的输入输出
?FileInputStream类用来打开一个输入文件 。
?FileOutputStream类用来打开一个输出文件 。
FileInputStream fin=new FileInputStream
(“tempfile.txt”);
FileInputStream和
FileOutputStream用
于读写一个磁盘文件
文件的输入输出
文件流的建立
FileInputStream in=new
FileInputStream(fp);
FileOutputStream out=new
FileOutputStream(fp);
例,文件拷贝 (注意要捕获文件异常 )
输入流的参数是用于输入的文件名
输出流的参数是用于输出的文件名
FileInputStream和
FileOutputStream
这些类是结点流,而且正如这个名字
所暗示的那样,它们使用磁盘文件。
这些类的构造函数允许你指定它们所
连接的文件。要构造一个
FileInputStream,所关联的文件必须
存在而且是可读的。
如果你要构造一个 FileOutputStream
而输出文件已经存在,则它将被覆盖
BufferInputStream和
BufferOutputStream
一个过滤器输入流是用一个到已存在的输
入流的连接创建的。此后,当你试图从过
滤输入流对象读时,它向你提供来自另一
个输入流对象的字符。
BufferInputStream和 BufferOutputStream
这些是过滤器流, 它们可以提高 I/O操作的效
率 。
DataInputStream和 DataOutputStream
这些过滤器通过流来读写 Java基本类 。
文件的输入输出
缓冲区流,
BufferedInputStream和
BufferedOutputStream
将它们与文件流相接
FileInputStream in=new
FileInputStream(“file1.txt”);
BufferedInputStream bin=
new BufferedInputStream(in,256)
int len; byte bArray[]=new byte[256];
len=bin.read(bArray);
len中得到是长度,bArray中得到的是数据
import java.io.*;
class filestream
{ public static void main(String args[])
{ try{
File inFile=new File(”file1.txt");
File outFile=new File(”file2.txt");
FileInputStream fis=new FileInputStream(inFile);
FileOutputStream fos=new FileOutputStream(outFile);
int c; while((c=fis.read())!=-1) fos.write(c);
fis.close(); fos.close();
}catch(FileNotFoundException e) {
System.out.println("FileStreamsTest,"+e);
}catch(IOException e) {
System.err.println("FileStreamsTest,"+e);
}}}
数据输入输出流
什么时候需要数据输入输出流?
文件流和缓冲区流的处理对象是字节或字节
数组,利用数据输入输出流可以实现对文件
的不同数据类型的读写,
DataInputStream,DataOutputStream
一种较为高级的数据输入输出方式,除了字节
和字节数组,还可以处理 int,float,boolean等类
型,
还可以用 readLine方法读取一行信息
可使用的方法,
write,writeBoolean…,read,readByte… 等
数据输入输出流
数据流的建立
FileOutputStream fos=
new FileOutputStream(”file2.txt"));
DataInputStream dis=
new DataInputStream(fos)
数据输出流可以是一个已经建立好的输入数据
流对象,例如网络的连结,文件等,
下面的例子显示如何利用数据输入输出流往文
件中写不同类型的数据
输入输出方法import java.io.*;
public class ReadHello
{ public static void main(String args[])
{ char inChar;
System.out.println("Enter a character:");
try
{ inChar = (char)System.in.read();
System.out.println(" "+ inChar);
}
catch(IOException e)
{ System.out.println("Error reading from user");
}
}
输入输出方法
import java.io.*;
class IOTest
{ public statics void main(String args[])
{try { byte bArray[]=new byte[128];
System.out.println(“Enter something:”);
System.in.read(bArray);
System.out.print(“You entered:”);
System.out.println(bArray);
}catch(IOException ioe)
{ System.out.println(ioe.toString()); }
}
}
输入输出方法
为什么输入的是字符,输出是乱码?
原因,System.out.println(bArray)输出的是数
组的地址而不是字符
改进,将字符数组变换成字符串
原来是,System.out.println(bArray);
现在为,String s=new String(bArray,0);
System.out.println(s);
System.in是属于 BufferedInputStream类型
System.out是属于 PrintStream类型
System.err也是属于 PrintStream类型
文件的输入输出
FileInputStream( String name)
使用 name参数指定的文件路径来创建一个新
的文件输入流。
FileInputStream( File f)
使用封装进 File对象中的信息来创建一个新的
文件输入流。
FileOutputStream( String name)
根据 name字符串创建一个新的文件输出流。
路径名并不是绝对的,它相对于当前工作目录。
注:该方法会把已经存在的同名文件删除。
java.io.BufferedInputStream
BufferedInputStream(InputStream in)
使用默认的缓冲大小来创建一个新的缓冲流。
一个缓冲输入流从一个流中读取字符但不会
每次都导致设备访问。当缓冲为空时,一个
新的数据块就会被读取到缓冲中。
BufferedInputStream(InputStream in,int n)
使用用户定义的缓冲大小来创建一个新的缓
冲流。
java.io.BufferedOutputStream
BufferedOutputStream(OutputStream out)
使用默认的缓冲大小来创建一个新的缓冲流。
一个缓冲输出流会收集被写的字符而不会每
次都导致设备访问。当缓冲已满后,或者流
被清洗,那么数据就会被写访问。
BufferedInputStream(OutputStream out,int
n)
使用用户定义的缓冲大小来创建一个新的缓
冲流。
java.io.PushbackInputStream
PushbackInputStream(InputStream in)
构造一个具有一个字节预先量的流。
PushbackInputStream(InputStream in)
构造一个具有指定大小的预先缓冲的流。
Void unread(int b)
回退一个字节,它被用于下一次读取调
用。每次只能回退一个字符。其中参数
b 表示将要重新读取的字节。
随机访问文件流
RandomAccessFile流用于读写一个文件中任意位置
的数据。它实现了 DataInput和 DataOutput接口。
磁盘文件可以随机访问,但是来自网络连接的数据
则不可以这么做。
打开一个随机访问文件的方法或者是只读或者是读
写。这需要分别把字符串,r”(随机读)或者,rw”
(随机读写)作为构造器的第二个参数。
RandomAccessFile in = new
RandomAccessFile(“employee.dat”,”r”);
RandomAccessFile inOut = new
RandomAccessFile(“employee.dat”,”rw”);
java.io.RandomAccessFile
一个随机文件也具有一个文件指针。该文件指针总是
表明下一个需要读写记录的位置。 Seek方法用于把文
件指针设置到文件的任意字节位置。
getFilePointer方法返回文件指针的当前位置。
RandomAccessFile(String name,String mode)
其中参数 name表示文件名,mode为,r”用于只读;
,rw”用于读写。
long getFilePointer() 返回指针的当前位置。
void seek(long pos)
把文件指针设置为偏移文件开始的 pos字节处。 Pos值
介于 0到文件长度(单位字节)之间。
long length() 返回文件的长度(单位字节)。
ZIP文件流
ZIP文件是存储了一个或多个文件的存档文
件,它通常使用压缩格式。
每个 ZIP文件都有一个头部,它包含了文件
名和使用的压缩方法等信息。
Java使用 ZipInputStream来读取一个 ZIP文
件。其方法是在 ZipInputStream构造器中使
用一个 FileInputStream。接着你需要查看存
档中的每一项,
getNextEntry方法返回一个 ZipEntry类型的
对象。
Java.util.zip.ZipInputStream
zipInputStream(InputStream in)
该构造器使用一个给定的 InputStream来创建
一个 zipInputStream。其中 in表示底层的输
入流。
zipEntry getNextEntry()
返回一个表示下一项的 zipEntry对象。如果
没有更多的项则返回 null。
void closeEntrys()
关闭 ZIP文件中的当前打开项。你还可以继
续使用 getNextEntry()来读取下一项。
System类
System类管理标准输入输出流和错误流。
System.out:把输出送到缺省的显示 (通常是显
示器 )。
System.in:从标准输入获取输入 (通常是键
盘 )。
System.err:把错误信息送到缺省的显示。
每当 main方法被执行时,就自动生成上述三个
对象。
System.in是属于 BufferedInputStream类型
System.out是属于 PrintStream类型
System.err也是属于 PrintStream类型
PrintStream类
println()不属于 OutputStream类,它是
PrintStream类的子类,能提供复杂的输出
PrintStream类的方法有,
write,flush,checkError,print,println,close.
其中 println可以输出多种形式的数据,
例如,
println(String s),println(char c)等