程序运行期间可能需要从外部的存储媒介或其它程序读入所需要的数据,这就需要输入流。
输入流通过read()方法读入源中的数据
程序在处理之后可能需要将结果输出到其它媒介或其它应用程序
输出流通过write()方法把数据希尔它的目的地
这些都是在java.io包
10.1File类
File类的对象主要用来获取文件本身的一些信息,例如文件所在的目录、文件的长度或文件的读写权限等,不涉及对文件的读写操作
File类的构造方法:
- File(String filename)
- File(String directoryPath,String filename)
- File(File dir,String filename)
使用File(String filename)创建文件时,该文件被认为与当前应用程序在同一目录
10.1.1文件的属性
经常使用File类的下列方法发获取文件的一些信息
- public String getName()获取文件的名字
- public boolean canRead()判断文件是否可读
- public boolean canWrite()判断文件是否可读
- public boolean exist()判断文件是否存在
- public long length()获取文件的长度(单位是字节)
- public String getAbsolutePath()获取文件的绝对路径
- public boolean getParent()获取文件的父目录
- public boolean isFile()判断文件是否是一个普通文件,而不是目录
- public boolean isDirectory()判断文件是否是一个目录
- public boolean isHidden()判断文件是否是隐藏文件
- public long lastModified()获取文件的最后修改实际
10.1.2目录
1.创建目录
File对象调用方法public boolean mkdir()创建一个目录
如果创建成功返回true
2. 列出目录中的文件
如果File对象是一个目录,那么该对象调用下述方法列出该目录的文件和子目录
- public String[] list()用字符串形式放回目录下的全部文件
- public File[]listFiles()用File对象形式返回目录下的全部文件
- pubilc Stirng[] list(FilenameFilter obj)该方法用字符串的形式返回目录下的指定类型的所有文件
- public File[]listFiles(FilenamFilter obj)
10.1.3文件的创建与删除
应用File类创建一个文件对象
File file=new File("C:\\myletter","letter.txt");
如果C:/myletter目录中没有letter.txt的文件,文件对象调用方法
public boolean creatNewFile();
创建文件
10.2文件字节输入流
使用输入流的4个基本步骤
- 设定输入流的源
- 创建指向源的输入流
- 让输入流读取源中的数据
- 关闭输入流
如果文件读取需求较底,可以使用FileInputStream类
- 构造方法
FileInputStream(String name);
FileInputStream(File file);
第一个构造方法使用给定的文件名name创建FileInputStream流,第二个构造方法使用File对象创建FileInputStream流。参数name和file指定的文件称为输入流的源
FileInputStream输入流打开一个到达文件的通道(源就是这个文件,输入流指向这个文件)。当创建输入流时,可能会出现错误(也被称为异常)。I/O错误,使用IOException捕捉
2. 使用输入流读取字节
read()方法以字节为单位读取源中的数据
3. 关闭流
close()关闭
10.3文件字节输出流
- 构造方法
FileOutputStream(String name);
FileOutputStream(File file);
值得注意的是,如果输出流指向的文件不存在,Java就会创建该文件,如果指向的文件是已经存在的文件,输出流就会刷新该文件(使得文件的长度为0)
可以使用FileOutputStream类创建指向文件的输出流
FileOutputStream(String name,boolean append);
FileOutputStream(File file,boolean append);
当用构造方法创建一个指向文件的输出流时,如果append的取值为true,输出流不用刷新所指向的文件,输出流的write方法将从文件的末尾开始向文件写入数据,append的取值为false时,输出流将刷新所指向的文件
使用输出流写字节
字节输出流write以字节为单位向目的地写数据
3. 关闭流
使用void close()关闭输出流
并且close()保证操作系统把流缓冲区的内容写到它的目的地
10.4文件字符输入、输出
FileReader(String filename);FileReader(File filename);
FileWriter(String filename);FileWriter(File filename);
FileWriter(String filename,boolean append);FileWriter(File filename,boolean append);
对于输入流,write方法先将数据写入缓冲区,每当缓冲区溢出的时候,缓冲区内容被写入目的地,输入调用flush()方法可以直接冲洗缓冲区
10.5缓冲流
BufferedReader和BufferedWriter类创建的对象称为缓冲输入、输出流。
BufferedReader和BufferedWriter以文件字符输入,输出作为自己的源与目的地
这两个分别都能使用read(),write()
构造方法:
BufferedReader(Reader in);
BufferedWriter(Writer out);
BufferedReader流能够读取文本行,方法是readLine()
FileReader inOne=new FileReader("Student.txt");
BufferedReader inTwo=BufferedReader(inOne);
String strLine=inTwo.readLine();//
BufferedWriter流有一个特殊的向文件写入一个换行符的方法
newLine();
import java.io.*;
import java.util.*;
public class Example10_7 {
public static void main(String args[]) {
File fRead = new File("english.txt");
File fWrite = new File("englishCount.txt");
try{ Writer out = new FileWriter(fWrite);
BufferedWriter bufferWrite = new BufferedWriter(out);
Reader in = new FileReader(fRead);
BufferedReader bufferRead =new BufferedReader(in);
String str = null;
while((str=bufferRead.readLine())!=null) {
StringTokenizer fenxi = new StringTokenizer(str);
int count=fenxi.countTokens();
str = str+" 句子中单词个数:"+count;
bufferWrite.write(str);
bufferWrite.newLine();
}
bufferWrite.close();
out.close();
in = new FileReader(fWrite);
bufferRead =new BufferedReader(in);
String s=null;
System.out.println(fWrite.getName()+"内容:");
while((s=bufferRead.readLine())!=null) {
System.out.println(s);
}
bufferRead.close();
in.close();
}
catch(IOException e) {
System.out.println(e.toString());
}
}
}