首先看一下File类的常用方法
•File类的对象不但可以表示文件,还可以表示目录,在程序中一个File类对象可以代表一个文件或目录;
•当创建一个文件对象后,就可以利用它来对文件或目录的属性进行操作,如:文件名、最后修改日期、文件大小等等;
需要注意的是,File对象并不能直接对文件进行读/写操作,只能查看文件的属性;
方 法 原 型 | 说 明 |
boolean exists() | 判断文件是否存在,存在返回true,否则返回false |
boolean isFile() | 判断是否为文件,是文件返回true,否则返回false |
boolean isDirectory() | 判断是否为目录,是目录返回true,否则返回false |
String getName() | 获得文件的名称 |
String getAbsolutePath() | 获得文件的绝对路径 |
long length() | 获得文件的长度(字节数) |
boolean createNewFile() throws IOException | 创建新文件,创建成功返回true,否则返回false,有可能抛出IOException异常,必须捕捉 |
boolean delete() | 删除文件,删除成功返回true,否则返回false |
File[] listFiles() | 返回文件夹内的子文件与子文件夹的数组 |
File类示例
package file;
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
File file = new File(“test.txt”);
System.out.println(“文件或目录是否存在:”+file.exists());
System.out.println(“是文件吗:”+file.isFile());
System.out.println(“是目录吗:”+file.isDirectory());
System.out.println(“名称:”+file.getName());
System.out.println(“绝对路径:”+file.getAbsolutePath());
System.out.println(“文件大小:”+file.length());
System.out.println(“获取自由空间的大小”+file.getFreeSpace());
System.out.println(“有文件夹吗”+file.mkdirs());
System.out.println(“有父文件吗”+file.getParentFile());
System.out.println(“可以写吗”+file.canWrite());
System.out.println(“是可执行文件吗”+file.setExecutable(false));
}
}
•根据流动方同,流分为输入流向的不和输出流; •对于输入和输出流,由于传输格式的不同,又分为字节流和字符流: –字节流是指8位的通用字节流,以字节为基本单位,在java.io包中,对于字节流进行操作的类大部分继承于InputStream(输入字节流)类和OutputStream(输出字节流)类; –字符流是指16位的Unicode字符流,以字符(两个字节)为基本单位,非常适合处理字符串和文本,对于字符流进行操作的类大部分继承于Reader(读取流)类和Writer(写入流)类。
•FileInputStream类称为文件输入流,继承于InputStream类,是进行文件读操作的最基本类; •它的作用是将文件中的数据输入到内存中,我们可以利用它来读文件; •由于它属于字节流,因此在读取Unicode字符(如中文)的文件时可能会出现问题。
•FileInputStream类和FileOutputStream类是成对出现的,一个进行输入(读文件)操作,一个进行输出(写文件)操作; •由于采用字节方式进行数据传输,不必考虑数据的格式问题,这两个类对文件操作的效率较高; •可以使用这两个类完成复制文件的操作。
复制文件示例
publicclass CopyFileDemo {
public static void main(String[] args)throws IOException {
File srcFile =new File(“src.dat”); //源文件对象
File destFile =new File(“dest.dat”); //目标文件对象
if (!(destFile.exists())){ //判断目标文件是否存在
destFile.createNewFile(); //如果不存在则创建新文件
}
//使用源文件对象创建文件输入流对象
FileInputStreamfis =new FileInputStream(srcFile);
//使用目标文件对象创建文件输出流对象
FileOutputStreamfos =new FileOutputStream(destFile);
byte[] buf =new byte[1024]; //创建字节数组,作为临时缓冲
System.out.println(“开始复制文件…”);
while (fis.read(buf) !=-1) { //循环从文件输入流中读取数据
fos.write(buf); //写入到文件输出流中
}
System.out.println(“文件复制成功!”);
fis.close(); //关闭流
fos.close();
}
}
***************************************************************************************下面来看字符流***************************************************************************
•FileInputStream类和FileOutputStream类虽然可以高效率地读/写文件,但对于Unicode编码的文件,使用它们有可能出现乱码;
•考虑到Java是跨平台的语言,要经常操作Unicode编码的文件,使用字符流操作文件是有必要的;
•使用字符流将涉及到以下4个类:
–FileReader类和FileWriter类;
BufferedReader类和BufferedWriter类
FileReader类称为文件读取流,允许以字符流的形式对文件进行读操作
•该类将从文件中逐个地读取字符,效率比较低下,因此一般将该类对象包装到缓冲流中进行操作。BufferedReader类主要为字符流提供缓冲
FileReader配合BufferedReader读文件
public class RraderDemo
{
public static voidmain(String[] args)throws IOException
{
File file =new File(“test.txt”);
//通过文件对象创建文件读取流对象
FileReaderfr =new FileReader(file);
//将文件读取流包装成缓冲读取流
BufferedReaderbr =new BufferedReader(fr);
String str;
while ((str = br.readLine())!= null) //逐行读取数据
{
System.out.println(str);
}
br.close(); //关闭流
fr.close(); //关闭流
}
}
FileWriter类称为文件写入流,以字符流的形式对文件进行写操作
与FileReader类相似,FileWriter类同样需要使用缓冲流进行包装
FileWriter配合BufferedWriter写文件示例
public class WriterDemo
{
public static voidmain(String[] args)throws IOException
{
File file =new File(“test.txt”);
//通过文件对象创建文件输出字符流对象
FileWriterfw =new FileWriter(file);
//将文件输出字符流包装成缓冲流
BufferedWriterbw =new BufferedWriter(fw);
bw.write(“大家好!”);
bw.write(“我正在学习Java。”);
bw.newLine(); //换个新行
bw.write(“请多多指教。”);
bw.newLine(); //换新行
bw.write(“Luckybug@21cn.com”);
bw.close(); //关闭流
fw.close(); //关闭流
}
}
从控制台接受输入
•System.in的read方法可以从控制台接受输入;
•但由于in实际上是一个InputStream类的对象,它只能以字节形式接收数据,并且一次只能接受一个字节,这使输入操作很不便;
•必须将System.in进行处理,才可以顺利地从控制台接受输入,这将使用到:
–InputStreamReader类
–BufferedReader类
•InputStreamReader类用于将InputStream类型的字节输入流对象转换成Reader类型的字符读取流对象;
•可以使用它来转换System.in,如:
InputStreamReaderisr =new InputStreamReader(System.in);
•这样的字符流效率很低,再使用BufferedReader类来为其建立缓冲,如:
BufferedReaderbr =new BufferedReader(isr);
•这样,就可以从控制台接受输入了。
从控制台接受输入示例
publicclass ConsoleInputDemo
{
public static void main(String[] args)throws IOException
{
//将System.in转化成字符流对象
InputStreamReaderisr =new InputStreamReader(System.in);
//用缓冲流进行包装
BufferedReaderbr =new BufferedReader(isr);
System.out.println(“请输入您的姓名:”);
String name = br.readLine(); //接受输入
System.out.println(“请输入您的年龄:”);
int age= Integer.parseInt(br.readLine()); //接受输入
System.out.println(“您的姓名:”+ name);
System.out.println(“您的年龄:”+ age);
br.close(); //关闭流
isr.close(); //关闭流
}
}
从控制台输入并写入到文件示例
/*本例从控制台接受输入,然后写入到文件中,直到用户输入”!!!”为止*/
File file =new File(“input.txt”); //创建文件对象
if (!file.exists()) //判断该文件是否存在,如果不存在则创建新文件
{
file.createNewFile();
}
FileWriterfr =new FileWriter(file); //针对文件对象创建文件写入流对象
BufferedWriterbw =new BufferedWriter(fr); //为文件写入流建立缓冲流
//将控制台输入对象转化成字符流,并建立缓冲流
BufferedReader bin = new BufferedReader(new InputStreamReader(System.in));
String str = bin.readLine(); //接受从控制台输入的一行字符串
while (!(str.equals(“!!!”))) //如果输入”!!!”则代表输入结束
{
bw.write(str); //将从控制台输入的字符串写入到文件中
bw.newLine(); //换新行
str = bin.readLine(); //再从控制台接受输入
}
//关闭所有已经打开的流
bw.close();
fr.close();
bin.close();
基本数据类型的读/写
•FileInputStream和FileOutputStream在读写文件时不考虑数据的类型;
•FileWriter和FileReader在读写文件时,将所有的数据都看做字符;
但有时候,我们需要将各种类型的数据写入文件或是从文件中读取,DataInputStream类和DataOutputStream类可以满足需要
DataInputStream类
•DataInputStream类可以输入任何类型的数据,但它不可以单独
使用,需要要配合其它字节输入流一起使用;
//将文件输入流包装成数据输入流,以便从文件中读取各种类型的数据
FileInputStream fis = newFileInputStream(“data.dat”);
DataInputStreamdis = new DataInputStream(fis);
DataInputStream类的常用方法
方 法 原 型 | 说 明 |
final boolean readBoolean() throws IOException | 从数据输入流中读取一个boolean型数据 |
final char readChar() throws IOException | 从数据输入流中读取一个char型数据 |
final int readInt() throws IOException | 从数据输入流中读取一个int型数据 |
final long readLong() throws IOException | 从数据输入流中读取一个long型数据 |
final float readFloat() throws IOException | 从数据输入流中读取一个float型数据 |
final double readDouble() throws IOException | 从数据输入流中读取一个double型数据 |
•DataOutputStream类可以输出任何类型的数据,同样也需要配合其他字节输出流一起使用;
//将文件输出流包装成数据输出流,以便往文件中写入各种类型的数据
FileOutputStreamfos = new FileOutputStream(“data.dat”);
DataOutputStream dos = new DataOutputStream(fos);
DataOutputStream类的常用方法
方 法 原 型 | 说 明 |
final void writeBoolean(boolean v) throws IOException | 往数据输出流中写入一个boolean型数据 |
final void writeChar(char v) throws IOException | 往数据输出流中写入一个char型数据 |
final void writeInt(int v) throws IOException | 往数据输出流中写入一个int型数据 |
final void writeLong(long v) throws IOException | 往数据输出流中写入一个long型数据 |
final void writeFloat(float v) throws IOException | 往数据输出流中写入一个float型数据 |
final void writeDouble(double v) throws IOException | 往数据输出流中写入一个double型数据 |
总结:
•java.io包是Java内置的包,其中包含一系列对输入/输出进行操作的类;
•File类的对象可以访问文件(或目录)的属性,但不可以进行读/写操作;
•从方向上讲,流分为输入流和输出流,但从格式上区分的话,流分为字节流和字符流;
•使用FileInputStream类和FileOutputStream类以字节流方式对文件进行读/写操作,这是操作文件最基本的两个类;
•FileReader类和FileWriter类配合BufferedReader类和BufferedWriter类可以以字符流方式对文件进行读/写操作;
•从控制台接受输入要使用到InputStreamReader类和BufferedReader类;
•DataInputStream类和DataOutputStream类允许读/写各种基本数据类型;
绝大部分的IO操作都可能抛出IOException