15.1输入输出流
流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流两种。I/O(Input/Output,(输出)流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。虽然 I/O 流疆盘文件存取有关,但是程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口等。
Jaa 语言定义了许多类专门负责各种方式的输入/输出,这些类都被放在java.io 包中。其中输入流
类都是抽象类input stream(字节输入流)或抽象reader(字符输入流)的子类;而所有输出流都是抽象类output stream(字节输出流)或抽象类writer(字符输出流)的子类。
15.1.1输入流
ImputStream 类是字书输入流的抽象类,它是所有字节输入流的父类。IputStream 类的具体层构如图15.3所示。
该类中所有方法遇到错误时都会引发IOException 异常。下面是对该类中的一些方法的简要说明区: read0方法:从输入流中读取数据的下一个字节。返回025的 int 字节值。如果因为已经达流末尾而没有可用的字节,则返回值为-1。
read(bytell b):从输入流中读入一定长度的字节,并以整数的形式返回字节数。
mark(int readlimi)方法:在输入流的当前位置放置一个标记readlimit 参数告知此输入流在标记位置失效之前允许读取的字节数。reset0方法:将输入指针返回到当前所做的标记处。sipong )方法:跳过输入流上的 个字节并返回实际跳过的字节数
makSupported()方法:如果当前流支持 mark0/reset0操作就返回 true
close方法:关闭此输入流并释放与该流关联的所有系统资源。
Java中的字符是 Unicode 编码,是双字节的。InputStream 类是用来处理字节的,并不适合处理字文本Java为字符文本的输入专门提供了一套单独的类,即 Reader 类,但 Reader 类并不是 InputStream的替换者,只是在处理字符串时简化了编程。Reader 类是字符输入流的抽象类,所有字符输入流的变现都是它的子类。Reader 类的具体层次结构如图 15.4所示。
Reader类中的方法与InputStream类中的方法类似,读者在需要时可查看JDK文档
15.1.2输出流
OutputStream 类是字节输出流的抽象类,此抽象类是表示输出字节流的所有类的超类。OutputStream类的具体层次如图15.5所示。
OutputStream 类中的所有方法均返回 void,在遇wrte(intb)方法:将指定的宇节写入此输出流。回 wrle(byteDb)方法:将b个字节从指定的 byte 数组写入此输出流。
wrle(byteDb)方法:将b个字节从指定的 byte 数组写入此输出流。
writer(byte[]b,int off,int len)方法:将指定byte数组中从偏移量off开始的len个字节写入此输出流
fush0方法:彻底完成输出并清空缓存区
close()方法:关闭输出流
writer类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。Writer 类的层次结图15.6所示。
5.2 File类
File 类是javaio 包中唯一代表磁盘文件本身的类。File 类定义了一些与平台无关的方法来操作件,可以通过调用 File 类中的方法,实现创建、删除、重命名文件等操作。File 类的对象主要用来取文件本身的一些信息,如文件所在的目录、文件的长度、文件读写权限等。数据流可以将数据写入文件中,文件也是数据流最常用的数据媒体。
15.21 文件的创建与删除
1.File(String pathname)
import java.io.File;
public class FileTest {
public static void main(String[] args) {
File file=new File("D:\\word.txt");//创建文件对象
if(file.exists()) {//如果文件存在
file.delete();//将文件删除
System.out.println("文件已删除");
}else{//如果文件不存在
try {//try语句块捕捉可能出现的异常
file.createNewFile();//创建该文件
System.out.println("文件已创建");
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
import java.io.File;
public class FileTest {
public static void main(String[] args) {
File file=new File("D:\\word.txt");//创建文件对象
if(file.exists()) {//如果文件存在
String name=file.getName();//获取文件名称
long length=file.length();//获取文件长度
boolean hidden=file.isHidden();//判断文件是否为隐藏文件
System.out.println("文件名称:"+name);//输出信息
System.out.println("文件长度:"+length);
System.out.println("该文件是否隐藏文件吗?"+hidden);
}else {//如果文件不存在
System.out.println("该文件不存在");//输出信息
}
}
}
import java.io.File;
public class FileTest {//创建类
public static void main(String[] args) {//主方法
File file=new File("D:\\word.txt");//创建对象
printAllFile(file);
}
public static void printAllFile(File foldersPc) {
for(File fileEntry:foldersPc.listFiles()) {
if(fileEntry.isDirectory()) {
System.out.println("--------"+fileEntry.getName()+"--------");
printAllFile(fileEntry);
}else {
System.out.println(fileEntry.getName());
}
}
}
}
文件输入/输出流
程序运行期间,大部分数据都在内存中进行操作,当程序结束或关闭时,这些数据将消失。如果需要将数据永久保存,可使用文件输入/输出流与指定的文件建立连接,将需要的数据永久保存文件中。
FileInputStream 类与 FileOutputStream 类
FileInputStream 类与 FileOutputStream 类 都用来操磁盘文件。如果用户的文件读取要求比较简单,则可以使用 FileInputStream 类,该类继承自 InputStream 类。FileOutputStream 类是 OutputStream 类的子类。
FileInputStream 类常用的构造方法:
FileInputStream(String name)
FileInputStream(File file)
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
File file=new File("D:\\word.txt");
//输出的字符流
FileWriter writer=new FileWriter(file);//创建字符输出流
writer.write("门前大桥下 游过一群鸭");//将字符串写入文件中
writer.close();
//输入的字符流
FileReader reader=new FileReader(file);//创建字符输入流
char[] ch1=new char[1024];//缓存字符数组
int len=reader.read(ch1);//将文件中的字符读入缓存数组中
System.out.println(new String(ch1,0,len));//将字符转为字符串输出
reader.close();//关闭流
}
}
带缓存的输入/输入流
缓存时 I/O 的一种性能优化。缓存流为 I/O 流增加了内存缓存区,使得再流上执行 skip()、mark()、和 reset()方法成为可能。
BufferedReader 与 BufferedWriter 类
BufferedReader 类与 BufferedWriter 类分别继承 Reader 与 Writer 类。这两个类同时具有内部缓存机制,并能够以行单位进行输入/输出。
BufferedReader 类常用的方法如下:
read()方法:读取单个字符
readLine()方法:读取一个文本行,并将其返回为字符串。若无数据可读,返回null。
BufferedWriter 类中的方法都返回void。常用的方法如下:
write(String s,int off,int len)方法:写入字符串的某一部分
flush()方法:刷新该流的缓存
newLine()方法:写入一个行分隔符
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileTest {
public static void main(String[] args){
String content[]= {"好久不见","最近还好","常联系"};//写入的内容
File file=new File("D:\\word.txt");//创建文件对象
try {
FileWriter fw=new FileWriter(file);//文件字符输出流
BufferedWriter bw=new BufferedWriter(fw);//换成输出流
for(int k=0;k<content.length;k++) {//遍历要写入的内容
bw.write(content[k]);//写入字符串
bw.newLine();//写一个换行符
}
bw.close();//关闭缓冲输出流
fw.close();//关闭文件字符输出流
}catch(IOException e) {
e.printStackTrace();
}
try {
FileReader fr=new FileReader(file);//文件字符输入流
BufferedReader br=new BufferedReader(fr);//缓冲输入流
String tmp=null;//作为缓冲的临时字符串
int i=1;//行数
while((tmp=br.readLine())!=null) {
System.out.println("第"+i+"行"+tmp);//输出读取的内容
i++;//行数递增
}
br.close();//关闭缓冲输入流
fr.close();/关闭文件字符输入流
}catch(IOException e) {
e.printStackTrace();
}
}
}
数据输入/输出流
数据输入/输出流 (DataInputStream 类与 DataOutputStream 类)允许应用程序以与机器无关的方式从底层输入流中读取基本 Java 数据类型。也就是说,当读取一个数据时,不必关心这个数值应当是哪个字节。
DataInputStream 类提供了将字符串、double 数据、int 数据、Boolean 数据写入文件的方法;DataOutputStream 类只提供了一个readUTF()方法返回字符串。
DataInputStream 类与 DataOutputStream 类的构造方法:
DataInputStream(DataInputStream in):使用指定的基础 InputStream 对象创建一个 DataInputStream 对象。
DataOutputStream(DataOutputStream out):创建一个新的数据输出流,将数据写入一个指定基础输出流。
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataStreamDemo {
public static void main(String[] args) throws IOException {
File file=new File("D:\\word.txt");
//创建 FileOutputStream 对象,指定要向其中写入数据的文件
FileOutputStream fos=new FileOutputStream(file);
//创建 DataOutputStream 对象,用来向文件中写入数据
DataOutputStream dos=new DataOutputStream(fos);
dos.writeBoolean(false);//将boolean数据写入文件
dos.writeUTF("使用writeuTE() 方法写入数据");//将字符串写入文件
dos.writeDouble(19.8); //将double数据写入文件
dos.writeInt(298);//将int数据写入文件
dos.close();
fos.close();
//创建 FileInputStream 对象,指定要从中读取数据文件
FileInputStream fis=new FileInputStream(file);
//创建 DataInputStream 对象,用来从文件中读取
DataInputStream dis=new DataInputStream(fis);
System.out.println(dis.readBoolean());//读取boolean数据
System.out.println(dis.readUTF());//读取字符串
System.out.println(dis.readDouble());//读取double数据
System.out.println(dis.readInt());//读取int数据
dis.close();
fis.close();
}
}