IO流总结

目录

1、字符流FileReader和FileWriter

FileReader:

构造方法: FileWriter:

2、字节流FileInputStream和FileOutputStream

FileInputStream:

FileOutputStream:

3、字符缓冲流BufferedReader和BufferedWriter

BufferedReader:

BufferedWriter:

4、字节缓冲流BufferedInputStream和BufferedOutputStream

BufferedInputStream:

BufferedOutputStream:

 5、转换流:InputStreamReader和OutputStreamWriter

InputStreamReader:

OutputStreamWriter:

6、打印流PrintWriter和PrintStream

PrintWriter:

PrintStream:

7、对象操作流ObjectInputStream和ObjectOutputStream

8、合并流与切割流SequenceInputStream

9、RandomAccessFile

10、File类:

过滤器:


1、字符流FileReader和FileWriter

FileReader:

构造方法:

FileReader(File file) 
          在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(FileDescriptor fd) 
          在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。
FileReader(String fileName) 
          在给定从中读取数据的文件名的情况下创建一个新 FileReader。

常用方法:

 int read() 

          从此流中读取一个数据字符。

 int read(char[] b,int off,int len)
          从off开始将len个字符读入到byte数组中。





构造方法: FileWriter:

构造方法摘要
FileWriter(File file) 
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append) 
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(FileDescriptor fd) 
          构造与某个文件描述符相关联的 FileWriter 对象。
FileWriter(String fileName) 
          根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append) 
          根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

主要方法:

void write(int c)
                向输出流中写入单个字符。
void write(char [] c, int offset, int len)
                向输出流中写入字符数组中开始为offset长度为len的某一部分。
void write(String s, int offset, int len)
                向输出流中写入字符串中开始为offset长度为len的某一部分。

代码示例: 


        File file = new File("test.txt");
        // 创建文件
        file.createNewFile();
        // creates a FileWriter Object
        FileWriter writer = new FileWriter(file);
        // 向文件写入内容
        writer.write("This\n is\n an\n example\n");
        writer.flush();
        writer.close();
 
 
 
		// 读取文件的方式一:逐个字符来读取文本文件
        // 创建 FileReader 对象
		FileReader fr = null;
		try {
			fr = new FileReader(file);
 
			int ch = fr.read();
			while (ch != -1) {
				System.out.print((char) ch);
				ch = fr.read();
			}
			System.out.println();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (fr != null)
					fr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		//读取文件方式二:使用数组来读取文本文件
		FileReader fr1 = null;
		try {
			fr1 = new FileReader(file);
			char [] buf = new char[1024];
			int num = 0;
			while((num = fr1.read(buf))!=-1) {
				System.out.println(new String(buf,0,num));
			}
		}catch(IOException e) {
			e.printStackTrace();
		}finally {
			try {
			if(fr1!=null)
			    fr1.close();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
		
		//方法三:用缓冲区读取文本文件
		//内部实现时是使用数组形式来缓冲字符数据的
		FileReader fr2 = null;
		BufferedReader bufr = null;
		try {
			fr2 = new FileReader(file);
			bufr = new BufferedReader(fr2);
			String line = null;
			//BufferedReader提供了按行读取文本文件的方法readLine()
			//readLine()返回行有效数据,不包含换行符,未读取到数据返回null
			while((line = bufr.readLine())!=null) {
				System.out.println(line);	
			}
		}catch(IOException e) {
			e.printStackTrace();
		}finally {
			try {
			if(bufr!=null)
			    bufr.close();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}

2、字节流FileInputStream和FileOutputStream


FileInputStream:

构造方法:

构造方法摘要
FileInputStream(File file) 
          通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(FileDescriptor fdObj) 
          通过使用文件描述符 fdObj 创建一个 FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。
FileInputStream(String name) 
          通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

主要方法:

 int read() 

        从此流中读取一个数据字节。

 int read(byte[] b) 

        从此流中将b.length个字节的数据读入到一个byte数组中

int read(byte[] b,int off,int len)

        从off开始将len个字节读入到byte数组中

FileOutputStream:

构造方法摘要
FileOutputStream(File file) 
          创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append) 
          创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(FileDescriptor fdObj) 
          创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。
FileOutputStream(String name) 
          创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append) 
          创建一个向具有指定 name 的文件中写入数据的输出文件流。

主要方法:

public void write(int c)
        向输出流中写入一个字节。

 public void write(byte[] c)

        向输出流中写入一个字节数组。

public void write(byte[] b, int offset,int len)

        向输出流中写入字节串中开始为offset长度为len的某一部分。

 代码示例:

        File fileIn = new File("1.jpg");
        File fileOut = new File("2.jpg");
        FileInputStream fin=new FileInputStream(fileIn);
        FileOutputStream fout=new FileOutputStream(fileOut);
 
        int len=0;
        byte[] buff=new byte[1024];
        while((len=fin.read(buff)) != -1) {
            fout.write(buff, 0, len);
        }
 
        fin.close();
        fout.close();

3、字符缓冲流BufferedReader和BufferedWriter

BufferedReader:

构造:

        BufferedReader br = new BufferedReader(new FileReader(file));

常用方法:

int read()

        从该输入流中读取一个字符。

int read(char[] cbuf)

        从该输入流中读取一个字符数组。

String readLine()

        从该输入流中读取一个文本行。

BufferedWriter:

构造:

        BufferedWriter bw=new BufferedWriter(new FileWriter(file));

常用方法:

void write(int c)

        向输出流中输出一个字符。

void write(String str)

        向输出流中输出字符串。

void newLine()

        向输出流中输出一个行分隔符。

 代码示例:


          File fileIn = new File("1.txt");
          File fileOut = new File("2.txt");
          FileReader fr = new FileReader(fileIn);
          FileWriter fw = new FileWriter(fileOut);
          BufferedReader bfr = new BufferedReader(fr);  
          BufferedWriter bfw = new BufferedWriter(fw);
 
          //一行一行字的写  
          String line = null;
          while((line = bfr.readLine()) != null){  
                bfw.write(line);
                bfw.newLine();  
                bfw.flush();  
          }
 
          //一个字一个字的写
          /*int ch = 0; 
          while((ch = bfr.read()) != -1){ 
                bfw.write(ch); 
          }*/  
 
          bfr.close();  
          bfw.close(); 

4、字节缓冲流BufferedInputStream和BufferedOutputStream

BufferedInputStream:

构造:

    BufferedInputStream bfin=new BufferedInputStream(new FileInputStream(fileIn));

常用方法:

int read()

        从输入流中读取一个字节。

int read(byte[] b,int off,int len)

        给定偏移量处开始将各字节读取到指定的 byte 数组中。

BufferedOutputStream:

构造:

        BufferedOutputStream bfout=new BufferedOutputStream(new FileOutputStream(fileOut));

常用方法:

void write(int b)

       向输出流中输出一个字节。

void write(byte[] b,int off,int len)

        从 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。

复制图片代码示例:

    File fileIn = new File("1.jpg");
    File fileOut = new File("2.jpg");
    BufferedInputStream bfin=new BufferedInputStream(new FileInputStream(fileIn));
    BufferedOutputStream bfout=new BufferedOutputStream(new FileOutputStream(fileOut));
 
    int len=0;
    byte[] buff=new byte[1024];
 
    while((len=bfin.read(buff))!=-1) {
        bfout.write(buff, 0, len);
    }
 
    bfin.close();
    bfout.close();

 5、转换流:InputStreamReader和OutputStreamWriter

InputStreamReader:

将一个字节流中的字节解码成字符

构造方法
InputStreamReader(InputStream in) 
创建一个使用默认字符集(系统默认GBK)的InputStreamReader。
InputStreamReader(InputStream in, Charset cs) 
创建一个使用给定字符集的InputStreamReader。  
InputStreamReader(InputStream in, CharsetDecoder dec) 
创建一个使用给定字符集解码器的InputStreamReader。  
InputStreamReader(InputStream in, String charsetName) 
创建一个使用命名字符集的InputStreamReader。 

为了最大的效率,可以在BufferedReader中包装一个InputStreamReader。 例如: 

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

常用方法:

String getEncoding() 
  返回此流使用的字符编码的名称。  
int read() 
  读一个字符。 如果已经达到流的结尾,则为-1 
int read(char[] cbuf, int offset, int length) 
  将字符读入数组的一部分。  读取的字符数,如果已经达到流的结尾,则为-1

boolean ready() 
  告诉这个流是否准备好被读取。

  如果InputStreamReader的输入缓冲区不为空,或者字节可以从底层字节流读取,则InputStreamReader就绪。 

        返回false并不能保证下一次读取将被阻止。

OutputStreamWriter:

将写入的字符编码成字节后写入一个字节流

构造方法:

构造方法
OutputStreamWriter(OutputStream out) 
创建一个使用默认字符编码的OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs) 
创建一个使用给定字符集的OutputStreamWriter。  
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 
创建一个使用给定字符集编码器的OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName) 
创建一个使用命名字符集的OutputStreamWriter。 

为了最大的效率,可以在BufferedWriter中包装一个OutputStreamWriter。 例如: 

        BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileOut)));

常用方法:

void flush() 
   刷新流。
String getEncoding() 
   返回此流使用的字符编码的名称。
void write(char[] cbuf, int off, int len) 
   写入字符数组的一部分。 
void write(int c) 
   写一个字符。
void write(String str, int off, int len) 
   写一个字符串的一部分。  
    File fileIn = new File("1.txt");
    File fileOut = new File("2.txt");
    BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream(fileIn)));
    BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileOut)));

    //以字符串方式
    String line = null;
    while((line = bfr.readLine()) != null){  
        bfw.write(line);
        bfw.newLine();  
        bfw.flush();  
    }

    /*
    //以字符方式
    int ch = 0;
    while((ch = bfr.read()) != -1) {
    	bfw.write(ch); 
    }
    */
    
    bfr.close();
    bfw.close();

6、打印流PrintWriter和PrintStream

PrintWriter:

BufferedReader中的readline()方法,用于读取一行从对方传过来的数据。

而数据的输出需要用到PrintWriter的println()的方法,用于将本方的文本数据传给对方。

构造方法:

构造方法:
PrintWriter(File file)

        使用指定的文件创建一个新的PrintWriter,而不需要自动的线路刷新。

PrintWriter(File file, String csn)        

        使用指定的文件和字符集创建一个新的PrintWriter,而不需要自动进行线条刷新。

PrintWriter(OutputStream out)

        从现有的OutputStream创建一个新的PrintWriter,而不需要自动线路刷新。

PrintWriter(OutputStream out, boolean autoFlush)

        从现有的OutputStream创建一个新的PrintWriter。

PrintWriter(String fileName)

        使用指定的文件名创建一个新的PrintWriter,而不需要自动执行行刷新。

PrintWriter(String fileName, String csn)

        使用指定的文件名和字符集创建一个新的PrintWriter,而不需要自动线路刷新。

PrintWriter(Writer out)

        创建一个新的PrintWriter,没有自动线冲洗。

PrintWriter(Writer out, boolean autoFlush)

        创建一个新的PrintWriter。

常用方法:

void flush() 

  刷新流。

void println() 
       通过写入行分隔符字符串来终止当前行。  

代码示例:

    //从键盘读取数据
    BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
    PrintWriter out = new PrintWriter(System.out);

    String line = null;
	while((line = bufr.readLine())!= null){
        //设置结束标志
        if("over".equals(line))
            break;
        out.println(line);
        out.flush();
    }
	out.close();
	bufr.close();

PrintStream:

PrintStream流永远不会抛出异常,因为做了try{}catch(){}会将异常捕获,出现异常情况会在内部设置标识,通过checkError()获取此标识。

由印刷的所有字符PrintStream被转换成使用平台的默认字符编码字节。 在需要编写字符而不是字节的情况下,应使用PrintWriter类。 

构造方法
PrintStream(File file)

        使用指定的文件创建一个新的打印流,而不需要自动换行。

PrintStream(File file, String csn)

        使用指定的文件和字符集创建新的打印流,而不需要自动换行。

PrintStream(OutputStream out)

        创建一个新的打印流。

PrintStream(OutputStream out, boolean autoFlush)

        创建一个新的打印流。

PrintStream(OutputStream out, boolean autoFlush, String encoding)

        创建一个新的打印流。

PrintStream(String fileName)

        使用指定的文件名创建新的打印流,无需自动换行。

PrintStream(String fileName, String csn)

        创建一个新的打印流,不需要自动换行,具有指定的文件名和字符集。

7、对象操作流ObjectInputStream和ObjectOutputStream

还不会

8、合并流与切割流SequenceInputStream

案例:媒体文件切割与合并,传输大数据文件。

SequenceInputStream表示其他输入流的逻辑级联。 它从一个有序的输入流集合开始,从第一个读取到文件的结尾,然后从第二个文件读取,依此类推,直到最后一个输入流达到文件的结尾。 

构造方法:

构造方法

SequenceInputStream(Enumeration<? extends InputStream> e) 
        初始化新创建 SequenceInputStream通过记住参数,它必须是一个 Enumeration产生对象,它们的运行时类型是 InputStream。

        将所有InputStream类型添加到 Vector集合里,然后将集合放到构造方法。

      (Enumeration是迭代器的古老版本,在诸如Vector和Properties这些传统类所定义的方法中仍然存在)

SequenceInputStream(InputStream s1, InputStream s2) 
        通过记住两个 SequenceInputStream来初始化新创建的SequenceInputStream,这些参数将按顺序读取,首先是 s1 ,然后是 s2 ,以提供要从此 SequenceInputStream读取的字节。

方法摘要:

int available() 
        返回当前底层输入流可以读取(或跳过)的字节数,而不会被下一次调用当前底层输入流的方法阻塞。  
void close() 
        关闭此输入流并释放与流相关联的任何系统资源。
int read() 
        从该输入流读取下一个数据字节。  
int read(byte[] b, int off, int len) 
        从该输入流读取最多 len个字节的数据到字节数组。  

合并文件代码示例:

    File file1 = new File("1.txt");
    File file2 = new File("2.txt");

    //合并两个文件
    FileInputStream fis1 = new FileInputStream(file1);
    FileInputStream fis2 = new FileInputStream(file2));
    java.io.SequenceInputStream sequenceInputStream = new java.io.SequenceInputStream(fis1, fis2);
    /*合并多个文件
        Vector<FileInputStream> v = new Vector<>();
        v.add(fis1);
        v.add(fis2);
        v.add(fis3);
        Enumeration<FileInputStream> em = v.elements();
        SequenceInputStream sis = new SequenceInputStream(em);
    */

    FileOutputStream fileOutputStream = new FileOutputStream("3.txt");

    int data;
    while ((data = sequenceInputStream.read()) != -1) {
        fileOutputStream.write(data);
    }

9、RandomAccessFile

        RandomAccessFile可以自由访问文件的任意位置。如果需要访问文件的部分内容,而不是把文件从头读到尾,可以选择使用RandomAccessFile。同时RandomAccessFile可以向已存在的文件追加内容。

        RandomAccessFile对象包含一个记录指针,用以标识当前读写处的位置,当程序创建一个新的RandomAccessFile对象时,该对象的文件记录指针对于文件头(也就是0处),当读写n个字节后,文件记录指针将会向后移动n个字节。除此之外,RandomAccessFile可以自由移动该记录指针。

RandomAccessFile包含两个方法来操作文件记录指针:

  • long getFilePointer():返回文件记录指针的当前位置
  • void seek(long pos):将文件记录指针定位到pos位置

 构造方法:

构造方法
RandomAccessFile(File file, String mode) 
        创建一个随机访问文件流从File参数指定的文件中读取,并可选地写入文件。  
RandomAccessFile(String name, String mode) 
        创建随机访问文件流,以从中指定名称的文件读取,并可选择写入文件。  

插入步骤:
        1)创建临时文件,保存被插入文件的插入点后面的内容。
        2)再重新定位到插入点,将需要插入的内容添加到文件后面。
        3)最后将临时文件的内容添加到文件后面。

10、File类:

 构造方法:

构造方法
File(File parent, String child) 
  从父抽象路径名和子路径名字符串创建新的 File实例。
File(String pathname) 
  通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。  
File(String parent, String child) 
  从父路径名字符串和子路径名字符串创建新的 File实例。  
File(URI uri) 
  通过将给定的 file: URI转换为抽象路径名来创建新的 File实例。  

常用方法:

boolean isDirectory() 
        测试此抽象路径名表示的文件是否为目录。 

        当且仅当该抽象路径名表示的文件存在且为目录时true,否则false。

boolean isFile() 
        测试此抽象路径名表示的文件是否为普通文件。  

        当且仅当该抽象路径名表示的文件存在且为普通文件时true; 否则 false。

boolean exists() 
        测试此抽象路径名表示的文件或目录是否存在。 

        当且仅当存在由此抽象路径名表示的文件或目录时true; 否则 false。

boolean createNewFile() 
        当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。  

        如果命名文件不存在并被成功创建true; 如果命名文件已经存在 false。

boolean delete() 
        删除由此抽象路径名表示的文件或目录。

        当且仅当文件或目录被成功删除时true; 否则 false。

String getAbsolutePath() 
        返回此抽象路径名的绝对路径名字符串。  
String getName() 
        返回由此抽象路径名表示的文件或目录的名称。  
String getPath() 
        将此抽象路径名转换为路径名字符串。
String getParent() 
        返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null。  

String[] list() 
        返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。  

        一组字符串,命名由此抽象路径名表示的目录中的文件和目录。 如果目录为空,则该数组将为空。 如果此抽象路径名不表示目录,或返回I / O错误,则返回null 。 

String[] list(FilenameFilter filter) 
        返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。  

        一组字符串,命名由该抽象路径名表示的目录中由指定的filter接受的文件和filter 。 如果目录为空,或者过滤器没有接受名称,则该数组将为空。 如果此抽象路径名不表示目录,或返回I / O错误,则返回null 。 

File[] listFiles() 
        返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
File[] listFiles(FileFilter filter) 
        返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。  
File[] listFiles(FilenameFilter filter) 
        返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。  

boolean mkdir() 
        创建由此抽象路径名命名的目录。 

        当且仅当该目录被创建时true; 否则 false。

boolean mkdirs() 
        创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。  

        当且仅当该目录已创建true,以及所有必需的父目录; 否则 false。

boolean renameTo(File dest) 
        重命名由此抽象路径名表示的文件。  

过滤器:

        String[] list()
        String[] list(FilenameFilter)
        File[] listFiles()
        File[] listFiles(FileFilter filter)
        File[] listFiles(FilenameFilter filter)

        FilenameFilter--文件名过滤器        FileFilter--文件过滤器        都是接口

        一个方法

boolean accept(File pathname) 
        测试指定的抽象路径名是否应包含在路径名列表中。  

        使用案例:

        File[] listFiles(FileFilter filter)

    if(file.isDirectory()){
        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {//将.java结尾的文件存储到files中
                return pathname.isDirectory || pathname.getName().endsWith(".java");
            }
        });
        for (File file1 : files) {
            System.out.println(file1);
        }
    }

        File[] listFiles(FilenameFilter filter)

    if(file.isDirectory()){
        File[] files = file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir,name).isDirectory() || name.endsWith(".java");
            }
        });
        for (File file : files) {
            System.out.println(file);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值