文件是来源或者目的地,而输入流和输出流是一个通道;
文件像是沟渠,而输入输出流像是水管,用来抽水和输送水。
计算机的功能是处理数据,IO功能让计算机把未处理的数据流入程序,让已处理的数据流出;
Java的IO方式的复杂性也带来了灵活性,程序员可以控制整个IO流程,设计出好的IO方式。
File类
创建一个File类对象:
有3个构造方法:
File(String filename);
File(String directoryPath,String filename);
File(File dir,String filename);
File file = new File("javafile");
File file = new File("F:\\java","javafile");
File file = new File("java","javafile");
获取文件名和绝对路径:
System.out.println(file.getName()+"的绝对路径"+file.getAbsolutePath());
判断不存在名字为letter.txt文件后创建文件再删除:
File file = new File("F:\\java\\javafile","letter.txt");
if(!file.exists()){
try{
file.createNewFile();
// file调用方法 public boolean createNewFile() 有返回值为boolean型,所以需要try-catch语句防止异常;
}
catch(IOException e) { }
}
file.delete();
返回文件:
参数FilenameFilter是一个接口,该接口有一个方法:
public boolean accept(File dir,String name);
使用时需用新类实现接口并重写这个方法;
public String [] list() //用字符串形式返回目录下的全部文件
public File [] listFiles() //用File对象形式返回目录下的全部文件
public String [] list(FilenameFilter obj) //用字符串形式返回目录下的指定类型的所有文件
public File [] listFiles(FilenameFilter obj) //用File对象形式返回目录下的指定类型的所有文件
运行可执行文件:
使用java.lang包中的Runtime类的exec(String command)方法
需声明并创建对象:Runtime ec = Runtime.getRuntime();
try{
Runtime ce = Runtime.getRuntime();
File file = new File("c:\\windows","Notepad.exe");
ce.exec(file.getAbsolutePath());
file = new File("C:\\Program Files\\Internet Explorer","IEXPLORE www.baidu.com");
ce.exec(file.getAbsolutePath());
}
catch(Exception e) {
System.out.println(e);
}
文件字节输入流
使用输入流通常包括4个基本步骤:
1.设定输入的源;
2.创建指向源的输入流;
3.让输入流读取源中的数据;
4.关闭输入流。
FileInputStream类(文件字节输入流)是InputStream类的子类(以字节为单位读取文件)
字节输入流的read()方法:
int read()
int read(byte b[])
int read(byte b[],int off,int len)
import java.io.*;
public class example{
public static void main(String args[]){
int n=-1;
byte [] a = new byte[100];
try{
File f = new File("example.java"); //设定输入流的源
InputStream in = new FileInputStream(f); //创建输入流并指向源
//还可以直接创建输入流并指向源:InputStream in = new FileInputStream(example.java);
while((n=in.read(a,0,100))!=-1) { //用read()方法读取
String s = new String (a,0,n); //把读入的字节转化为字符串,注意要写成“n”
System.out.print(s);
}
in.close();
}
catch(IOException e) {
System.out.println("File read Error"+e);
}
}
}
注意:文件输入流和输出流都是用来打开一个到大文件的通道,所以在创建的时候,可能会出现异常,所以程序必须放在try-catch语句中。
文件字节输出流
同样有4个基本步骤:
1.给出输出流的目的地;
2.创建指向目的地的输出流;
3.让输出流把数据写入到目的地;
4.关闭输出流。
FileOutputStream类(文件字节输出流)是OutputStream类的子类
构造方法:
FileOutputStream(String name);
FileOutputStream(File file);
FileOutputStream(String name,boolean append);
FileOutputStream(File file,boolean append);
字节输出流的write()方法:
void write(int n)
void write(byte b[])
void write(byte b[],int off,int len)
import java.io.*;
public class example{
public static void main(String args[]){
byte [] a = "你好世界".getBytes(); //转化为字节形式
byte [] b = "Hello World".getBytes();
File file = new File("a.txt"); //输出目的地
try{
FileOutputStream out = new FileOutputStream(file); //指向目的地的输出流
out.write(a);
out.close();
out = new FileOutputStream(file,true); //append为true时重新开通上一个目的地的输入流
out.write(b,0,b.length);
out.close();
}
catch(IOException e) {
System.out.println("Error:"+e);
}
}
}
文件字符输入,输出流
一个汉字在文件中占用两个字节,,如果使用字节流,以字节为单位处理数据,读取不当会出现错误。
与字节流FileInputStream,FileOutputStream字节流相对应的是字符流FileReader,FileWriter
分别是Reader和Writer的子类, 其构造方法分别是:
FileReader(String filename);
FileReader(File filename);
FileWriter(String filename);
FileWriter(File filename);
FileWriter(String filename,boolean append);
FileWriter(File filename,boolean append);
import java.io.*;
public class example_Cup{
public static void main(String args[]){
File sourceFile = new File("a.txt");
File targetFile = new File("b.txt");
char c[] = new char[20];
try{
Writer out = new FileWriter(targetFile,true);
Reader in = new FileReader(sourceFile);
int n = -1;
while((n=in.read(c))!=-1){
out.write(c,0,n);
}
out.flush(); //在关闭流前冲洗当前缓冲区,将当前缓冲区的内容写入到目的地
out.close();
}
catch(IOException e) {
System.out.println("Error "+e);
}
}
}