1、File :
实现的接口:Serializable, Comparable. 是文件或目录的抽象表示。
构造方法:File(URI uri)
: URI 是统一资源标识符,具体分析详见 Java中URI,URL和URN的使用。
File(String pathname); File(String directoryPathname, String filename); File(File directory, String fileName)。
常用方法: getName(); getPath(); getAbsolutePath(); getParent(); length(); lastModified();
canRead(); canWrite(); exists(); isFile(); isDirectory(); createNewFile(); delete(); mkdir(); mkdirs().
String[] list(); File[] listFiles(); boolean renameTo( File dest ); boolean setReadOnly(); ....
// File 对象只是一个引用,并不表示硬盘上的一个存在的文件或目录。
2、Stream :
File类主要用来描述系统中的文件在磁盘上的存储情况。Steam类主要是对文件的内容进行操作,我们必须通过FileInputStream, FileOutputStream或者 RandomAccessFile流来存取文件。
流分为字节流(InputStream, OutPutStream)和字符流(Reader, Writer , 后来引入) 。
Java 中由于是面向对象的,所以对流操作时是同过不断的对象的“转换”(靠构造函数的参数和返回值的变化),也称“Wraps”。要在实际中正确转换,需要知道一下流的个子类的基本命名规则:比如 FileInputStream ,我们拆为两部分,A=File, B=InputStream. B表明这个类实现的是一个字节流(InputStream),A表明这个类的构造函数的参数跟File的构造函数的参数类型一致,可以为File对象,也可以为String对象。
理解了此规则,就很容易地知道要从InputStream流(如 System.in)转换到一个可以缓冲的字节流的代码为:BufferedReader br = new BufferedReader( new InputStreamReader(System.in) ).
四个基类都提供了相应的简单地读写函数read(); read(byte[]); read( byte[], int off, int len ); 这几个函数并不能满足我们的需要,所以我们会经常使用 BufferedReader (提供了readLine(),等)和 PrintWriter ( 可以格式化输出, println()等)。
下面是我的一个小练习:
实现从1》键盘读入一行并输出; 2》拷贝一个文件到另一个文件。 分别用ByByte(字节流操作)和ByChar(字符流操作)来实现。
import java.io.*;
import java.util.*;
public class Practice
{
public static void main( String[] args ) throws IOException
{
ByByte sb1 = new ByByte();
ByChar sc1 = new ByChar();
String str = "test.txt";
String str1 = "copy_by_char.txt";
String str2 = "copy_by_byte.txt";
System.out.println( "**************** Stream Operation by Byte : ******************" );
sb1.showOneLine(); System.out.println( '/n' + "Show File" + str + '/n');
sb1.showFile(str); System.out.println( '/n' + "Copy File to " + str1 +'/n' );
sb1.copyFile( str, str1);
System.out.println( "**************** Stream Operation by Char : ******************" );
sc1.showOneLine(); System.out.println( '/n' + "Show File " + str + '/n' );
sc1.showFile(str); System.out.println( '/n' + "Copy File to " + str2 +'/n');
sc1.copyFile( str, str2);
}
}
class ByByte
{
public ByByte(){}
public void showOneLine() throws IOException
{
System.out.println( "Input a line of , WHATEVER : " );
byte[] buffer = new byte[20000];
int count = System.in.read( buffer );
System.out.println( "Show by ASC|| code " );
for (int i=0;i System.out.print(" "+buffer[i]);
System.out.println();
System.out.println( "Show by char " );
for (int i=0;i System.out.print((char) buffer[i]);
}
public void showFile( String name) throws IOException
{
BufferedInputStream fis = new BufferedInputStream( new FileInputStream( name ) ) ;
int size = fis.available() ;
for(int i=0;i System.out.print( (char)fis.read() );
fis.close();
}
public void copyFile( String name1, String name2 ) throws IOException
{
BufferedInputStream fis = new BufferedInputStream( new FileInputStream( name1 ) ) ;
BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream( name2 ) ) ;
int size = fis.available() ;
for(int i=0;i bos.write( fis.read() );
fis.close(); bos.close();
}
}
class ByChar
{
public ByChar(){}
public void showOneLine() throws IOException
{
BufferedReader in = new BufferedReader( new InputStreamReader( System.in ));
System.out.println( "Input a line of , WHATEVER : " );
String str = in.readLine();
System.out.println( "Show by char " );
System.out.print( str );
}
public void showFile( String name) throws IOException
{
FileReader fr = new FileReader( name );
BufferedReader br = new BufferedReader( fr );
String read;
while((read = br.readLine())!= null)
System.out.println(read);
fr.close(); br.close(); // 先关里层流对象
}
public void copyFile( String name1, String name2 ) throws IOException
{
BufferedReader br = new BufferedReader( new FileReader( name1 ) );
BufferedWriter bw = new BufferedWriter( new FileWriter( name2 ) );
PrintWriter pw = new PrintWriter(bw);
String read;
while((read = br.readLine())!= null) // BufferedReader 的readLine()
pw.println(read); // PrintWriter 的格式化输出
br.close(); pw.close();
}
}