File IO

一、文件可认为是相关记录或放在一起的数据的集合

二、JAVA程序如何访问文件属性? {javaAPI:java.io.File 类}

       File可以创建,删除等操作对文件或目录,但是要访问文件内容,就必须用到输入/输出流)

  2.1 java文件类常用的方法:

     File IO_第1张图片

   

1.创建File类对象:
File file; File
file = new File("my.gif");
file = new File("E:\\pic\\","my.gif");

2.将目录也当作文件处理File类中提供了实现目录管理功能的方法:
File path = new File("E:\\music\\");
File file = new File(path, "Test.java");

案例案例1:创建文件和目录

import java.io.*;
public class TestFile{
    public static void main(String[] str){
        File f = new File("pet.txt");
        //判断是否存在该文件
        if (!f.exists()){
            System.out.println("file is not exist");
            try {
                f.createNewFile();//不存在就创建新的文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        File f1 = new File("E:\\music\\student");
        if (f1.mkdir()){ //创建目录
            System.out.println("yes");
        }
        else{
            System.out.println("errors ");
        }
    }
}
案例2:浏览当前目录下的所有文件和目录
import java.io.*;

//浏览当前目录下的所有文件和目录
class FileDirectory{
     public static void main( String[] args ) {
          try {
             File f1 = new File("");
             String ss = f1.getAbsolutePath();
             System.out.println("ss= " + ss);
             File f = new File(ss);
            //判断是否是目录
             if( f.isDirectory() ) {
                //获取目录下所有的文件列表
                File[] files = f.listFiles();
                for( int i=0; i<files.length; i++ ) {
                   if( files[ i ].isDirectory() ) {
                      System.out.println( "<dir> " + files[ i ].getName() );
                   }
                   else {
                      System.out.println( files[ i ].getName() );
                   }
                }
             }
          }
          catch( Exception e ) {
             e.printStackTrace();
          }       
      }    
}
案例3:在此 目录下的文件如果是java扩展名的显示
import java.io.*;

class SuperTest{
    public static void main(String args[]) {
        File dir = new File("E:\\Workspace\\Java\\my20160224"); // 用File 对象表示一个目录
        Filter filter = new Filter("java"); // 生成一个名为java的过滤器
        System.out.println("list java files in directory " + dir);
        
        String[] files = dir.list(filter); // 列出目录dir下,文件后缀名为txt的所有文件
                            
        for (int i = 0; i < files.length; i++) {
            File f = new File(dir, files[i]); // 为目录dir 下的文件或目录创建一个File 对象
            if (f.isFile()) // 如果该对象为后缀为java的文件,则打印文件名
                System.out.println("file: " + f);
            else
                System.out.println("sub directory " + f); // 如果是目录则打印目录名
        }        
    }
}

class Filter implements FilenameFilter {
    String extent;
    Filter(String extent) {
        this.extent = extent;
    }
    
    public boolean accept(File dir, String name) {        
        return name.endsWith("." + extent); //返回文件的后缀名
    }
}




三、JAVA流 

流是指一连串流动的字符,是以先进先出方式发送信息的通道


3.1 IO流向分类

       分为输入流(InputStream)输出流(OutputStream)两类

       

 3.2 按照处理数据分类

       可以分为字节流字符流(用于处理Unicode字符数据)两类

         File IO_第2张图片


  3.3  节点流(低级流) 和 处理流(高级流):
JAVA使用处理流来包装节点流式一种典型的装饰器设计模式,通过使用处理流来包装不同的节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出功能,这就允许Java应用程序采用相同的代码,透明的方式来访问不同输入\输出设备的数据流。所以处理流也叫做包装流

   File IO_第3张图片

File IO_第4张图片

File IO_第5张图片


  

  案例1:

把一个文件的所有内容写到另外一个文件中

</pre><br /><span style="background-color: rgb(255, 255, 255);"></span><pre name="code" class="java">private static void read_write() {
		// 如何复制一个文本文件
		try {
			// 1.输入流对象
			FileInputStream fis = new FileInputStream("book.xml");
			// 2.输出流对象
			FileOutputStream fos = new FileOutputStream("book/you.txt");

			// 3.指定存放变量
			int length = 0;

			// 4.遍历数据
			while ((length = fis.read()) != -1) {
				// 写入
				fos.write(length);
			}

			// 5.关闭流
			fis.close();
			fos.close();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
private static void read_write1() {
		// 如何复制一个文本文件
		try {
			// 1.输入流对象
			FileInputStream fis = new FileInputStream("book.xml");
			// 2.输出流对象
                     //  FileOutputStream fos = new FileOutputStream("book/you.txt"); //覆盖

			FileOutputStream fos = new FileOutputStream("book/you.txt",true); //追加

			//指定存放的变量
			int length=0;
			
			//字节中转站
           		 byte[] buf = new byte[4 * 1024];  // 4K buffer

			// 4.遍历数据
			while ((length = fis.read(buf)) != -1) {
				// 写入
				fos.write(buf,0,length);
			}

			// 5.关闭流
			fis.close();
			fos.close();

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
如果只是在尾部追加,而不是覆盖需要调用FileOutputStream(“file”,true)就Ok了,对于字符流文件就是FileWriter(“file”,true)就OK。
 
 

过滤流—>缓冲流

类BufferedInputStream和BufferedOutputStream继承FilterInputStream和FilterOutputStream,实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流“捆绑”到缓冲流上,可以提高该I/O流的读取效率,在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。在读写的同时对数据缓存,这样避免每次读写数据都要进行实际的物理读写操作,在用BufferdOutputStream输出时,数据先输入缓冲区,当缓冲区满的时再写入连接的输出流,可以调用flush()来清空缓冲区。

 
import java.io.*;

class SuperTest{
    public static void main(String args[]) {
        try {
            File inFile = new File("test1.txt");
            File outFile = new File("test2.txt");
            
            BufferedInputStream bufFis=new BufferedInputStream(new FileInputStream(inFile),256);            
            BufferedOutputStream bufFos=new BufferedOutputStream(new FileOutputStream(outFile),256);            
            
            int len;
            byte bArray[]=new byte[256];
            
            do{
                System.out.println("while");
                len = bufFis.read(bArray);
                bufFos.write(bArray,0,len);
                System.out.println("len: " +len);
            }while (len==256);    
                        
            bufFis.close();
            bufFos.close();
        } catch (FileNotFoundException e) {
            System.out.println("FileStreamsTest: " + e);
        } catch (IOException e) {
            System.err.println("FileStreamsTest: " + e);
        }
    }
}

过滤流—>数据流

DataInputStream和DataOutputStream, 继承FilterInputStream和FilterOutputStream,可以用来与计算机无关的格式读写JAVA的基本数据类型以及String对象。
readBoolean() 读一字节,非零为真
readByte() 以8位读字节
readChar() 读Unicode字符
readInt() 读整数值
writeChar(int v) 把字符写进输出流
writeLong(long v) 把长整写进输出流
writeInt(int v) 把整数写进输出流

import java.io.*;

class DataStreamIOTest{
    public static void main(String args[]) throws IOException 
    {
        FileOutputStream fos = new FileOutputStream("a.txt");
        DataOutputStream dos = new DataOutputStream(fos);
        try {
            dos.writeBoolean(true);
            dos.writeByte((byte) 10);
            dos.writeChar('M');
            dos.writeDouble(3.141592654);
            dos.writeFloat(2.7182f);
            dos.writeInt(1234567890);
            dos.writeLong(2998877665544332211L);
            dos.writeShort((short) 223);
        } finally {
            dos.close();
        }
        
        FileInputStream fis = new FileInputStream("a.txt");
        DataInputStream dis = new DataInputStream(fis);
        try {
            System.out.println("\t " + dis.readBoolean());
            System.out.println("\t " + dis.readByte());
            System.out.println("\t " + dis.readChar());
            System.out.println("\t " + dis.readDouble());
            System.out.println("\t " + dis.readFloat());
            System.out.println("\t " + dis.readInt());
            System.out.println("\t " + dis.readLong());
            System.out.println("\t " + dis.readShort());
        } finally {
            dis.close();
        }
    }
}//需要注意的是必须throws IOException才可以编译通过。

利用二进制流来读取音乐,并写入到另一个文件中!

private static void read_write_music() {
		//1.文件输入流对象-->图片路径
		FileInputStream fis;
		try {
			fis = new FileInputStream("F:/music/不怕不怕.Mp3");
			DataInputStream dis= new DataInputStream(fis);
			
			//2.文件输出流对象
			FileOutputStream fos= new FileOutputStream("不怕不怕.Mp3");
			DataOutputStream dos = new DataOutputStream(fos);
			
			
			//3.读写
			int length=0;
			while((length=dis.read())!=-1){
				//写入
				dos.write(length);
			}
			
			
			
			//4.关闭
			dos.close();
			dis.close();
			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

字符流

private static void write() {
		// 1.写入对象
		try {
			FileWriter writer = new FileWriter("book/you.txt");
			
			//缓存对象
			BufferedWriter bw=new BufferedWriter(writer);
			
			//写入数据
			bw.write("hahah...");

			// // 4.关闭
			 bw.flush();
			 bw.close();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
</pre>
例子:拷贝(BufferedRead and BufferedWriter )
try {
        FileReader input = new FileReader("my.txt");
        BufferedReader bufInput = new BufferedReader(input);
        FileWriter output = new FileWriter("you.txt");
        BufferedWriter bufOutput = new BufferedWriter(output);
        String line;
        
        line = bufInput.readLine();
        while ( line != null ) 
        {
            bufOutput.write(line, 0, line.length());
            bufOutput.newLine();
            line = bufInput.readLine();
        }
        
        bufInput.close();
        bufOutput.close();
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }

*****随机存取文件流--RandomAccessFile*******
1 RandomAccessFile是一种特殊的文件流,可以用它在文件的任何地方查找或者插入数据
2 RandomAccessFile同时实现了DataInput和DataOutput接口,所以可以用它来读/写文件
3构造器: 
RandomAccessFile(java.io.File f,String mode)
RandomAccessFile(String file,String mode)
4 mode可以为”r”或”rw”
  
import java.io.*;
import java.util.*;

class RandomAccessFileTest{
    public static void main(String args[])
    {
        try{
              File logfile=new File("mydata.txt");
              
              if(logfile.exists())
              {
    RandomAccessFile raf=new RandomAccessFile(logfile,"rw");
                  System.out.println("leghth = " + raf.length());
                  raf.seek(raf.length());
                  
                  for(int i=0;i<5;i++)
                  {
                      raf.writeBytes("Write "+new Date()+ "\r\n");
                  }
                    
                  raf.seek(0);
                  String x=raf.readLine();
                  
                  while(x!=null)
                  {
                    System.out.println(x);
                    x=raf.readLine();
                  }
                  
                  raf.close();
              }
           }catch(IOException e){
              e.printStackTrace();
            }
    }
}

总结:
1 在Java中有数据传输的地方都用到I/O流(通常是文件,网络,内存和标准输入输出等)。
2 InputStream 和OutputStream是所有字节流的祖先(只有RandomAccessFile类是一个例外),read和write是它们最基本的方法,读写单位是字节
3 Reader 和Writer是所有字符流的祖先,read和write是它们最基本的方法,读写单位是字符。
4 在众多的流对象中,并不是每一种都单独使用,其中过滤流的子类在数据送出去之前做必要的处理
5 File, File(Input/Output)Stream, RandomAccessFile是处理本地文件的类。
6 Data(Input/Output)Stream是一个过滤流的子类,借此可以读写各种基本数据,在文件和网络中经常使用。如: readByte, writeBoolean等。
7 Buffered(Input/Output)Stream的作用是在数据送到目的之前先缓存,达到一定数量时再送到目的,已减少阻塞次。
8 Piped(Input/Output)Stream适合与一个处理的输出作为另一个处理的输入的情况



 


你可能感兴趣的:(File IO)