java I/O 详解
流的概念
- 流就是由一组字节或字符组成的、有起点和终点的数据
- 流的特点是数据的发送和获取都是沿数据序列顺序进行的,每个数据必须等待他前面的数据发送或读入后才能被读写
- Java的输入与输出以字节流(二进制)或字符流(文本)的方式进行
使用流的一般过程
- 使用流的构造方法创建流,选择是输入流或输出流
- 使用流提供的方法,进行读写等操作
- 使用完流后,用close方法关闭流
File类
File类的对象主要用来获取文件本身的一些信息,例如文件所在的目录、文件的长度、文件读写权限等,不涉及对文件的读写操作
构造方法有3个:
- File(String filename)
File f1 = new File(”c:\\temp”);//创建目录对象
File f2 = new File(”c:\\temp\\abc.txt”); //创建文件对象
注:linux系统和windows系统的文件路径表示方法不一样
- File(String directoryPath, String filename)
- File(File f, String filename)
文件类的属性
- canRead(): 文件是否可读
- canWrite():文件是否可写
- delete(): 删除文件或目录
- exists: 文件或目录是否存在
- getName(): 获得文件或目录的名称(不包括路径)
- isFile(): 连接的是否是文件(isDirectory()是否是目录)
- length(): 文件的大小(byte)
- getAbsolutePath(): 获得文件的绝对路径
- lastModified(): 获取文件的最后修改时间
import java.io.*;
class FileDemo
{
public static void main( String[] args ) {
File file = new File( "test.txt" ); //step1:
if( file.exists() ){//判断是否存在
System.out.println( "文件 " + file.toString() + " 存在" );
}else {
System.out.println( "文件:" + file.toString() + " 不存在" );
}
if( file.isFile() ) { //判断是否是文件
System.out.println( file.toString() + " 是文件" );
}else {
System.out.println(file.toString() + " 不是文件" );
}
System.out.println( "文件名:" + file.getName());
System.out.println( "文件的绝对路径:" +
file.getAbsolutePath());
System.out.println( "文件大小(单位字节):" + file.length());
File[] roots = File.listRoots();//根目录下的文件
for (int i = 0; i < roots.length; i++) {
System.out.println(roots[i]);
System.out.println();
}
}
}
运行结果:
目 录
- mkdir(): 创建一个目录
- listFiles(): 返回目录下的全部File文件
- listFiles(FilenameFilter obj): 返回目录下指定类型的所有File文件
文件的创建与删除
- createNewFile(): 创建一个文件对象
File f = new File(“C:\\myletter”, “letter1.txt”);
f. createNewFile();
- delete(): 删除文件
File f = new File(“C:\\myletter”, “letter1.txt”);
f.delete();
InputStream类
它是一个抽象类,作为其它输入流类的基类,定义了读取字节流的基本方法
常用方法如下:
- int read():从输入流中读一个字节,返回0-255的整数(内容的unicode码)。如果已经到达流末尾而没有可用的字节,则返回值-1
- int read(byte b[]):读取多个字节到数组中
- int read(byte b[], int off, int len):从输入流中读取长度为len的数据,写入数组b中从索引off开始的位置,并返回读取到的字节数
- void close():关闭此输入流(重要)
常用子类:
- FileInputStream:从某个文件中获得字节
- DataInputStream:允许应用程序以与机器无关方式从底层输入流中读取基本数据类型
- ObjectInputStream:对对象进行反序列化
- ByteArrayInputStream:该类包含一个内部缓冲区,缓冲区中所存储的是从流中读取的字节
- SequenceInputStreamFilterInputStream
import java.io.*;
public class ReadFile
{ public static void main(String args[ ])
{ int b;
byte tom[ ]=new byte[25];
try
{ File f=new File(“test.txt");
FileInputStream in=new FileInputStream(f); //1. 创建输入流
while((b = in.read(tom, 0, 25))!=-1) //2. 使用输入流读
{ String s = new String(tom, 0, b);
System.out.print(s);
}
in.close(); //3. 关闭输入流
}
catch(IOException e)
{ System.out.println("File read Error"+e);
}
}
}
test.txt文本内容:
运行结果:
OutputStream类
它是其它输出流类的基类,定义了将数据流写到输出设备的基本方法
主要方法如下:
- void write(int b):将指定的字节写入此输出流
- void write(byte[] b):将b.length个字节从byte数组写入此输出流
- void write(byte[] b, int off, int len):将byte数组中从偏移量off开始的len个字节写入此输出流
- void flush():刷新此输出流并强制写出所有缓冲的输出字节。该方法对任何输出流都是适用的
- void close():关闭此输入流
OutputStream的常用子类有:
- FileOutputStream:用于将数据写入某个文件中的输出流
- DataOutputStream:允许应用程序将基本数据类型写入输出流中
- ObjectOutputStream:对象的序列化
- ByteArrayOutputStream:此类实现了一个输出流,其中的数据被写入一个byte数组,缓冲区会随着数据的不断写入而自动增长。可使用toByteArray和tostring方法获取数据
- FilterOutputStream
public class FileCopy {//该程序完成文件复制功能
public static void main(String [] args){
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try{
fileInputStream = new
FileInputStream("FileCopyIn.java ");
fileOutputStream = new
FileOutputStream("FileCopyOut.java");
int temp;
while((temp=fileInputStream.read())!=-1)
fileOutputStream.write(temp); //逐字节写入
}catch(IOException e){ } //自己添加内容,查看异常
finally{
try {
if(fileInputStream != null)
fileInputStream.close();
if(fileOutputStream != null)
fileOutputStream.close();
} catch (IOException e) { }
}
}
}
```java
import java.io.*; //System.in的使用
public class SaveTyping
{ public static void main(String args[])
{ int b;
byte buffer[ ]=new byte[100];
try
{ System.out.println("输入一行文本,并存入磁盘:");
b = System.in.read(buffer); //保存键盘敲入的字符
FileOutputStream writefile = new
FileOutputStream("line.txt");
writefile.write(buffer,0,b); // 把 buffer中的内容写入到文件
}
catch(IOException e)
{ System.out.println("Error "+e);
}
}
}