IO流

本文深入讲解Java中的IO流概念,包括File类的功能与使用方法,FileInputStream与FileOutputStream的读写操作,以及字符流和字节流的区别。通过实例演示了文件的读取、写入、复制和数据包装流的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*

  • File类是java.io包下代表与平台无关的文件和目录
  • */
    package com.imti.day0428;

import java.io.File;
import java.io.IOException;

/*

  • File类是java.io包下代表与平台无关的文件和目录

  • */
    public class FileDemo
    {
    public static void main(String[] args) {

     // 创建一个File对象
     String filePath = "D:/IO流/课件/输入与输出.doc";
     File mFile = new File(filePath);
    
     // 读取文件的信息
     System.out.println("可读:" + mFile.canRead());
     System.out.println("可写:" + mFile.canWrite());
     System.out.println("文件名称:" + mFile.getName());
     System.out.println("文件路径:" + mFile.getPath());
     System.out.println("文件绝对路径:" + mFile.getAbsolutePath());
     System.out.println("文件的父路径:" + mFile.getParent());
     System.out.println("文件大小:" + mFile.length());
     System.out.println("文件的修改日期:" + mFile.lastModified());
     System.out.println("文件是否存在:" + mFile.exists());
    
     System.out.println("=================================");
    
     /*
      * 1.创建一个文件对象, 判断此文件是否存在 2.如果存在,则判断此文件是文件还是目录,然后输出文件的名称和路径, 3.如果不存在则创建一个文件或目录
      */
    
     // 1.创建一个文件对象,
     File myFile = new File("D:/mytest");
    
     // 2.判断此文件是否存在
     if (myFile.exists()) {
     	// 则判断此文件是文件还是目录
     	if (myFile.isFile()) {
     		System.out.println("是一个文件!");
     		System.out.println("文件名称:" + myFile.getName());
     		System.out.println("文件路径:" + myFile.getPath());
     	} else {
     		System.out.println("是一个目录!");
     		System.out.println("文件名称:" + myFile.getName());
     		System.out.println("文件路径:" + myFile.getPath());
     	}
     } else {
    
     	try {
     		// 如果是文件,则创建文件
     		if (myFile.isFile()) {
     			myFile.createNewFile();
     			System.out.println("文件创建成功!");
     		} else {
     			// 如果是目录,则创建目录
     			// 创建一级目录
     			// myFile.mkdir();
     			// 创建多级目录
     			myFile.mkdirs();
     			System.out.println("目录创建成功!");
     		}
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    
     System.out.println("==========================");
    
     // 1.创建一个指定名称和后缀的文件
     // createTempFile(String prefix, String suffix) :
     // 在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。
    
     try {
     	File file = File.createTempFile("Car", ".java");
     	System.out.println("文件路径:" + file.getPath());
    
     	// static File createTempFile(String prefix, String suffix, File directory) :
     	// 在指定的目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
    
     	File file2 = File.createTempFile("myfile", null, new File("D:/"));
     	System.out.println("file2:" + file2.getPath());
    
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     }
    
     System.out.println("=====================");
     File file3 = new File("D:/");
    
     // 列出File对象的所有子文件名和目录名
     String[] fileNames = file3.list();
    
     for (String fileName : fileNames) {
     	System.out.println(fileName);
     }
    
     System.out.println("=================");
     //  File[] listFiles():列出File对象的所有子文件和目录对象。
    
     File file4 = new File("D:/JDBC");
     /*
      * File[] files = file4.listFiles(); for (File file : files) { if
      * (file.isFile()) System.out.println("文件:" + file.getName()); else {
      * System.out.println("一级目录:"); System.out.println("目录:" + file.getName());
      * 
      * // 获取目录下的所有文件 files = file.listFiles(); for (File file2 : files) { if
      * (file2.isFile()) System.out.println("文件:" + file2.getName()); else {
      * System.out.println("二级目录:"); System.out.println("目录:" + file2.getName()); } }
      * } }
      */
     showFileList(file4);
    

    }

    // 显示指定目录下所有的文件和目录
    public static void showFileList(File myFile) {
    if (myFile == null)
    return;

     if (myFile.isFile()) {
     	System.out.println("是一个文件:" + myFile.getName());
     	return;
     }
    
     // 列出File对象的所有子文件和目录对象。
     File[] files = myFile.listFiles();
    
     // 循环遍历
     for (File file : files) {
     	if (file.isFile()) {
     		System.out.println("文件:" + file.getName());
     	} else {
     		System.out.println("目录:" + file.getName());
     		// 递归
     		showFileList(file);
     	}
     }
    

    }
    }

1.读取一个.txt的文件
package com.imti.day0428;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/*

  • FileInputStream:文件字节流,常用于读取二进制文件,如图片,声音,影像等

  • 1.读取一个.txt的文件

  • */
    public class FileInputStreamDemo
    {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    FileInputStreamDemo isd = new FileInputStreamDemo();

     File mFile = new File("D:/test.txt");
     isd.readOneByOne(mFile);
    
     System.out.println("\n==========一次读取多个字节======");
     isd.readMultiple(mFile);
    

    }

    /**

    • 一次读取一个字节

    • @param file
      */
      public void readOneByOne(File file) {
      FileInputStream inputStream = null;
      try {
      // 创建FileInputStream对象
      inputStream = new FileInputStream(file);

       /**
        * 1.一次读取一个字节 该返回值是一个 0 到 255 范围内的 int
        * 字节值(将字节值转换为int值,低8位为有效值,高24位补0)。如果因已到达流末尾而没有可用的字节,则返回值 -1。
        */
       int num = 0;
      
       // 循环读取
       while ((num = inputStream.read()) != -1) {
       	System.out.print((char) num);
       }
      

      } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      } finally {
      // 关闭流,释放资源
      try {
      if (inputStream != null)
      inputStream.close();
      } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      }
      }

    /**

    • 一次读取1024个字节

    • @param file
      */
      public void readMultiple(File file) {
      FileInputStream fis = null;

      try {
      // 创建对象
      fis = new FileInputStream(file);

       // 定一个缓冲的字节数组
       byte[] b = new byte[1024];
      
       int num = 0;
      
       // 循环读取文件的数据,直到文件末尾
       // while ((num = fis.read(b)) != -1) {
       // System.out.write(b);
       // }
      
       while ((num = fis.read(b, 0, b.length)) != -1) {
       	System.out.write(b, 0, b.length);
       }
      

      } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      } finally {
      try {
      if (fis != null)
      fis.close();
      } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      }
      }
      }

文件过滤器
package com.imti.day0428;

import java.io.File;
import java.io.FilenameFilter;

/*

  • 文件过滤器

  • FileNameFilter

  • */
    public class FileNameFilterDemo
    {
    public static void main(String[] args) {

     FileNameFilterDemo ffd = new FileNameFilterDemo();
    
     File myFile = new File("D:/");
     ffd.filterFile(myFile);
    

    }

    // 过滤指定目录下的图片
    public void filterFile(File myFile) {
    if (myFile == null)
    return;

     // 过滤
     File[] files = myFile.listFiles(new FilenameFilter() {
    
     	@Override
     	public boolean accept(File dir, String name) {
     		// TODO Auto-generated method stub
     		return isPNG(name) || isJPG(name) || isGIF(name);
     	}
    
     	// 图片:.jpg(.JPG) .png(.PNG) .gif(.GIF)
     	public boolean isPNG(String name) {
     		return name.toLowerCase().endsWith(".png");
     	}
    
     	public boolean isJPG(String name) {
     		return name.toLowerCase().endsWith(".jpg");
     	}
    
     	public boolean isGIF(String name) {
     		return name.toLowerCase().endsWith(".gif");
     	}
     });
    
     // 输出:
     for (File file : files) {
     	System.out.println("文件:" + file.getName());
     }
    

    }

    // 显示指定目录下所有的文件和目录
    public static void showFileList(File myFile) {
    if (myFile == null)
    return;

     if (myFile.isFile()) {
     	System.out.println("是一个文件:" + myFile.getName());
     	return;
     }
    
     // 列出File对象的所有子文件和目录对象。
     File[] files = myFile.listFiles();
    
     // 循环遍历
     for (File file : files) {
     	if (file.isFile()) {
     		System.out.println("文件:" + file.getName());
     	} else {
     		System.out.println("目录:" + file.getName());
     		// 递归
     		showFileList(file);
     	}
     }
    

    }
    }

演示:将指定的内容,写入指定文件中
package com.imti.day0428;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*

  • FileOutputStream:文件字节输出流,以字节的方式向文件中写数据

  • 演示:将指定的内容,写入指定文件中

  • */
    public class FileOutputStreamDemo
    {
    public static void main(String[] args) {
    FileOutputStream fos = null;
    try {

     	// 创建文件字节输出流对象
     	/*
     	 * 注:1.指定的文件可以不存在,但是不能指定一个被其他程序打开的文件 2.如果指定的文件中有内容,则会覆盖内容
     	 */
     	fos = new FileOutputStream("D:/a.txt");
    
     	// 创建一个字节数组
     	// byte[] b = { 'I', 'L', 'O', 'V', 'E', 'C', 'H', 'I', 'N', 'A' };
     	// 写入数据
     	// fos.write(b);
    
     	// 定义一个字符串对象
     	String content = "I LOVE CHINA";
     	fos.write(content.getBytes());
    
     	System.out.println("写入成功!");
     } catch (FileNotFoundException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	try {
     		if (fos != null)
     			fos.close();
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    

    }
    }

FileReader是用于读取字符流
package com.imti.day0428;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/*

  • FileReader是用于读取字符流

  • */
    public class FileReaderDemo
    {
    public static void main(String[] args) {
    // TODO Auto-generated method stub

     // 创建一个FileReader对象
     FileReader fr = null;
     try {
     	fr = new FileReader("D:/a.txt");
    
     	int num = 0;
     	// 单个字符读取
     	// while ((num = fr.read()) != -1) {
     	// System.out.print((char) num);
     	// }
    
     	// 一次读取多个字符
     	char[] buff = new char[1024];
     	while ((num = fr.read(buff)) != -1) {
    
     		// 将字符数组转换成String对
     		String str = new String(buff, 0, buff.length);
     		System.out.print(str);
     	}
    
     } catch (FileNotFoundException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	try {
     		if (fr != null)
     			fr.close();
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    

    }
    }

演示:使用FileInputStream和FileOutputStream复制一张图片
package com.imti.day0428;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*

  • 演示:使用FileInputStream和FileOutputStream复制一张图片

  • 1.原图片

  • 2.字节输入和输出流对象

  • */
    public class FileCopyDemo
    {
    public static void main(String[] args) {
    // 创建需要复制的文件对象
    File imgFile = new File(“D:/one.jpg”);

     // 复制后的文件对象
     File copyFile = new File("D:/one_copy.jpg");
    
     FileInputStream fis = null;
     FileOutputStream fos = null;
     try {
     	// 创建输入流和输出对象
     	fis = new FileInputStream(imgFile);
     	fos = new FileOutputStream(copyFile);
    
     	// 创建字节数组,一次读取1024个字节
     	byte[] b = new byte[1024];
     	int num = 0;
    
     	// 循环读取文件,直到文件末尾
     	while ((num = fis.read(b)) != -1) {
     		// System.out.write(b);
     		// 向文件中写入数据
     		fos.write(b);
     	}
    
     	System.out.println("复制成功!");
    
     } catch (FileNotFoundException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	try {
     		if (fos != null)
     			fos.close();
    
     		if (fis != null)
     			fis.close();
    
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    

    }
    }

字节输入缓冲流:BufferedInputStream
package com.imti.day0429;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/*

  • 字节输入缓冲流:BufferedInputStream

  • 1.skip():跳过指定的字节数

  • 2.mark():标记读取的输入流的点

  • a.读取过的字节,在将要读取下一个字节时,才能做标记,如11,标记值为10

  • b.在读的过程中,读取的次数要小于字节数

  • 3.reset():读取最后一次mark操作后读取的数据

  • */
    public class BufferedInputStreamDemo
    {
    public static void main(String[] args) {
    // TODO Auto-generated method stub

     // 定义一个字节输入流对象
     FileInputStream fis = null;
     // 定义输入缓冲流对象
     BufferedInputStream bis = null;
    
     try {
     	fis = new FileInputStream(new File("src/file/FileReaderAndWriterDemo.java"));
     	bis = new BufferedInputStream(fis);
    
     	// 获取输入流最大的字节数
     	int avacount = bis.available();
     	System.out.println("输入流中最大的字节数:" + avacount); // 1823
    
     	// 统计字节数
     	int num = 0;
    
     	// 读取600个
     	for (int i = 0; i < 600; i++) {
     		System.out.print((char) bis.read());
     		num++;
     	}
    
     	// 标记读取的输入流的点
     	bis.mark(100);
     	bis.mark(200);
     	bis.mark(300);
    
     	// 读取自最后一次 mark 操作后读取的所有字节
     	bis.reset();
    
     	// 跳过600字节
     	bis.skip(600);
    
     	for (int i = 0; i < avacount - 600; i++) {
     		System.out.print((char) bis.read());
     		num++;
     	}
    
     	System.out.println("一共读取了num=" + num);
     } catch (FileNotFoundException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	try {
     		if (bis != null)
     			bis.close();
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    

    }
    }

BufferedOutputStream
package com.imti.day0429;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*

  • 字节缓冲输出流:BufferedOutputStream类先把数据写到缓冲区,在默认情况下,只有当缓冲区满的时候,才会把缓冲区的数据真正写到数据宿,这样能减少物理写数据的次数。

  • 为了保证BufferedOutputStream会把缓冲区的数据写到文件中,最好是在写操作完成后,调用flush()方法,该方法会立即执行一次把缓冲区中的数据写到文件的操作。

  • */
    public class BufferedOutputStreamDemo
    {

    public static void main(String[] args) {
    // TODO Auto-generated method stub

     // 创建BufferedOutputStream对象
     BufferedOutputStream bos = null;
    
     try {
     	bos = new BufferedOutputStream(new FileOutputStream(new File("D:/fr.txt")));
    
     	String str = "今天天气真好!";
     	bos.write(str.getBytes());
    
     	// 将缓冲区的数据一次写入到文件中
     	bos.flush();
    
     	System.out.println("写入成功!");
    
     } catch (FileNotFoundException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	try {
     		if (bos != null)
     			bos.close();
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    

    }
    }

使用字符缓冲流读写文件
package com.imti.day0429;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/*

  • 使用字符缓冲流读写文件

  • 1.readLine():一次读取一行的数据

  • 2.newLine():写入一个行分隔符

  • */
    public class BufferedReaderAndWriterDemo
    {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    BufferedReader br = null;
    BufferedWriter bw = null;
    try {
    // 创建字符缓冲流输入和输出对象
    br = new BufferedReader(new FileReader(new File(“src/file/FileReaderAndWriterDemo.java”)));
    bw = new BufferedWriter(new FileWriter(new File(“D:/FileReaderAndWriterDemo.java”)));

     	// 读写文件
     	String info = null;
     	while ((info = br.readLine()) != null) {
     		System.out.println(info);
    
     		// 将数据写入文件中
     		bw.write(info);
     		// 开辟一个新行
     		bw.newLine();
     	}
    
     	// 调用flush()方法, 把缓冲区中的数据写到文件
     	bw.flush();
    
     	System.out.println("文件复制成功!");
     } catch (FileNotFoundException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	try {
     		if (bw != null)
     			bw.close();
    
     		if (br != null)
     			br.close();
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    

    }
    }

.BufferedReader
package com.imti.day0429;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/*

  • 1.BufferedReader可以先把一批数据读到缓冲区中,接下来的读操作都从缓冲区内获取数据,避免每次都从数据源读取数据并进行字符编码转换,从而提高读操作的效率。

  • 2.BufferedReader的readLine()方法可以一次读入一行字符,以字符串形式返回

  • */
    public class BufferedReaderDemo
    {
    public static void main(String[] args) {
    // TODO Auto-generated method stub

     // 创建BufferedReader对象
     FileReader in = null;
     BufferedReader br = null;
     try {
     	in = new FileReader("src/file/a.txt");
     	br = new BufferedReader(in);
    
     	/*
     	 * // 创建字符数组缓冲区 char[] cbuf = new char[1024]; // 读取数据 int num = -1; while ((num
     	 * = br.read(cbuf)) != -1) {
     	 * 
     	 * String str = new String(cbuf); System.out.println(str); }
     	 */
    
     	// 一行一行的读取数据:readLine(),如果已达到流的末尾,则为null
     	String str = null;
     	while ((str = br.readLine()) != null) {
     		System.out.println(str);
     	}
    
     } catch (FileNotFoundException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	try {
     		if (br != null)
     			br.close();
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    

    }
    }

BufferedWriter
package com.imti.day0429;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/*

  • BufferedWriter也带有缓冲区,它可以先把一批数据写到缓冲区内,当缓冲区满的时候,再把缓冲区的数据写到字符输出流中。 这可以避免每次都执行物理写操作,从而提高IO操作的效率

  • */
    public class BufferedWriterDemo
    {
    public static void main(String[] args) {
    // 创建BufferedWriter对象
    BufferedWriter bw = null;

     try {
     	bw = new BufferedWriter(new FileWriter("src/file/w.txt"));
    
     	String info = "BufferedWriter也带有缓冲区,它可以先把一批数据写到缓冲区内,当缓冲区满的时候,再把缓冲区的数据写到字符输出流中";
     	bw.write(info);
    
     	System.out.println("数据写入成功!");
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	try {
     		if (bw != null)
     			bw.close();
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    

    }
    }

数据包装流(DataInputStream,DataOutputStream)
package com.imti.day0429;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*

  • 数据包装流(DataInputStream,DataOutputStream)

  • DataInputStream和DataOutputStream可提供一些对Java基本数据类型读/写的方法,像读/写int、double和boolean等的方法。

  • 由于Java的数据类型大小是规定好的,在读/写这些基本数据类型时,就不用担心不同平台间数据大小不同的问题。
    DataInputStream应该和DataOutputStream配套使用,这样才能保证获得正确的

    演示:1.将数据写入文件中
    2.读取指定文件的数据

  • */
    public class DataInputAndOutputStreamDemo
    {
    public static void main(String[] args) {

     // 创建DataOutputStream对象
     FileOutputStream fos = null;
     BufferedOutputStream bos = null;
     DataOutputStream dos = null;
    
     // 创建数据包装流的输入流
     FileInputStream fis = null;
     BufferedInputStream bis = null;
     DataInputStream dis = null;
    
     try {
     	// 输出流
     	fos = new FileOutputStream(new File("src/file/dos.txt"));
     	bos = new BufferedOutputStream(fos);
     	dos = new DataOutputStream(bos);
    
     	// 输入流
     	fis = new FileInputStream(new File("src/file/dos.txt"));
     	bis = new BufferedInputStream(fis);
     	dis = new DataInputStream(bis);
    
     	// 向文件中写数据整型数据
     	dos.writeByte(5);
     	dos.writeShort(6);
     	dos.writeInt(15);
     	dos.writeLong(56);
    
     	// 浮点型数据
     	dos.writeDouble(4.5);
     	dos.writeFloat(2.3f);
    
     	// 布尔型数据
     	dos.writeBoolean(true);
    
     	// 字符型
     	dos.writeChar(97);
    
     	// 字符串
     	dos.writeUTF("hello");
    
     	// 调用flush
     	dos.flush();
     	System.out.println("数据写入成功!");
    
     	// 从指定文件中读取数据
     	System.out.println("读取的数据:");
     	System.out.println(dis.readByte());
     	System.out.println(dis.readShort());
     	System.out.println(dis.readInt());
     	System.out.println(dis.readLong());
    
     	System.out.println(dis.readDouble());
     	System.out.println(dis.readFloat());
    
     	System.out.println(dis.readBoolean());
     	System.out.println(dis.readChar());
     	System.out.println(dis.readUTF());
    
     } catch (FileNotFoundException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	// 关闭资源
     	try {
     		if (dos != null)
     			dos.close();
    
     		if (dis != null)
     			dis.close();
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    

    }
    }

功能:读写一个文本文件
package com.imti.day0429;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/*

  • 字符流:读写文本文件

  • FileReader,FileWriter

  • 功能:读写一个文本文件

  • 注:1.使用FileInputStream和FileOutputStream读写中文的字符会出现乱码,而且字节流只提供对字节或字节数组的读取方法

  • 2.java中汉字在文件中占2个字节

  • 3.使用字符流解决读取中文出现乱码的情况

  • */
    public class FileReaderAndWriterDemo
    {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    FileReader fr = null;
    FileWriter fw = null;

     try {
     	// 创建字符流的输入和输出对象
     	fr = new FileReader(new File("src/file/a.txt"));
     	// fw = new FileWriter(new File("D:/a_bak.txt"));
    
     	// boolean类型的参数,如果为true表示将内容追加到文件的末尾,如果为false,则表示覆盖原文件的内容
     	fw = new FileWriter(new File("D:/a_bak.txt"), false);
    
     	// 定义一个字符数组缓存区
     	char[] cbuf = new char[1024];
    
     	int num = fr.read(cbuf);
    
     	// 如果没有到达文件末尾
     	while (num != -1) {
    
     		// 更新变量值
     		num = fr.read(cbuf);
    
     		// 将字符数组转换成字符串
     		String info = new String(cbuf);
    
     		// 将数据写入指定文件中
     		fw.write(info);
     		System.out.println(info);
     	}
    
     	// 清空缓存区:把缓存区的内容输出到文件中
     	fw.flush();
    
     } catch (FileNotFoundException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	try {
     		if (fw != null) {
     			fw.close();
     		}
    
     		if (fr != null) {
     			fr.close();
     		}
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    

    }
    }

打印流
package com.imti.day0429;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

/*

  • 打印流

  • 1.与其他输出流不同,PrintStream永远不会抛出IOException

  • 2.自带刷新功能,可以自动调用flush()

  • 3.使用PrintStream可自动进行字符转换的动作,默认会使用操作系统的变量来处理对应的字符转换动作

  • 演示:将数据打印到指定的文件中

  • */
    public class PrintStreamDemo
    {
    public static void main(String[] args) {
    // TODO Auto-generated method stub

     // 创建打印流对象
     PrintStream ps = null;
     FileOutputStream fos = null;
     try {
     	ps = new PrintStream(new File("src/file/ps.txt"));
     	fos = new FileOutputStream(new File("src/file/ps2.txt"));
    
     	// 整型数据
     	ps.print(5);
     	ps.print('5');
     	ps.println(true);
     	ps.println(1.5f);
     	ps.println("test");
    
     	// 向指定文件中写入数据
     	fos.write(5);
    
     } catch (FileNotFoundException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	if (ps != null)
     		ps.close();
    
     	try {
     		if (fos != null)
     			fos.close();
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    

    }
    }

字节流:读写二进制文件,如图片,视频,音频等
package com.imti.day0429;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/*

  • 字节流:读写二进制文件,如图片,视频,音频等

  • FileInputStream 和FileOutputStream

  • 功能:复制一张图片

  • */
    public class TestFileStreamDemo
    {
    public static void main(String[] args) {

     FileInputStream fis = null;
     FileOutputStream fos = null;
     try {
     	// 创建输入流和输出流对象
     	fis = new FileInputStream(new File("src/img/k.jpg"));
     	fos = new FileOutputStream(new File("D:/k_bak.jpg"));
     	/*
     	// 创建一个byte字节数组的缓存区
     	byte[] b = new byte[1024];
    
     	int num = -1;
     	// 读文件
     	while ((num = fis.read(b)) != -1) {
     		// 将输入写入文件中
     		fos.write(b);
     	}
     	 */
     	
     	// 使用available()方法获取流的最大字节数
     	int count = fis.available();
     	byte[] b = new byte[count];
     	System.out.println("可读字节数:" + count);
     	fis.read(b);
     	fos.write(b);
     	
     	System.out.println("文件复制成功!");
    
     } catch (FileNotFoundException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } catch (IOException e) {
     	// TODO Auto-generated catch block
     	e.printStackTrace();
     } finally {
     	// 关闭输入和输出流,释放资源
     	try {
     		if (fos != null)
     			fos.close();
    
     		if (fis != null)
     			fis.close();
     	} catch (IOException e) {
     		// TODO Auto-generated catch block
     		e.printStackTrace();
     	}
     }
    

    }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值