学习要点
- File类操作文件和目录的属性
- 字节流读写文件
- 字符流读写文件
- 字节流读写二进制文件
文件操作
1 文件的定义
文件可认为是相关记录或放在一起的数据的集合。文件一般保存在硬盘、U盘、光盘、云盘的媒介中。
2 Java如何操作文件
JAVA API :java.io.File 类
3 File对象构建
File file = new File( String pathname ); //String pathname格式:"e:\test .txt"或"e:/test .txt"
4 File类常用方法
方法名称 |
说 明 |
boolean exists( ) |
判断文件或目录是否存在 |
boolean isFile( ) |
判断是否是文件 |
boolean isDirectory( ) |
判断是否是目录 |
String getPath( ) |
返回此对象表示的文件的相对路径名 |
String getAbsolutePath( ) |
返回此对象表示的文件的绝对路径名 |
String getName( ) |
返回此对象表示的文件或目录的名称 |
boolean delete( ) |
删除此对象指定的文件或目录 |
boolean createNewFile( ) |
创建名称的空文件,不创建文件夹 |
long length() |
返回文件的长度,单位为字节, 如果文件不存在,则返回 0L |
5 File操作文件示例
public static void main(String[] args) { FileOperation fm = new FileOperation(); File file = null; file = new File("e:\myDoc\test.txt"); fm.create(file); fm.showFileInfo(file); fm.delete(file); } /** 创建文件的方法 */ public void create(File file) { if (!file.exists()) { try { file.createNewFile(); System.out.println("文件已创建!"); } catch (IOException e) { e.printStackTrace(); } } } /** 删除文件 */ public void delete(File file) { if (file.exists()) { file.delete(); System.out.println("文件已删除!"); } } /** 显示文件信息 */ public void showFileInfo(File file) { if (file.exists()) { // 判断文件是否存在 if (file.isFile()) { // 如果是文件 System.out.println("名称:" + file.getName()); System.out.println("相对路径: " + file.getPath()); System.out.println("绝对路径: " + file.getAbsolutePath()); System.out.println("文件大小:" + file.length() + " 字节"); } if (file.isDirectory()) { System.out.println("此文文件是目录"); } } else System.out.println("文件不存在"); }
6 上机练习
查看文件属性,创建和删除文件。
流
1 定义
Flie类提供了访问文件和目录属性的方法,如何读写文件的内容?通过流来读写。
流的概念:流是指一连串流动的字符,是以先进先出方式发送信息的通道。
输入/输出流和数据源的关系:
2 Java流的分类
- 输入输出流是相对于计算机内存而言
- 字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流
- IO体系示意图
3 常用的文件读写类
文本文件的读写
字节流方式:FileInputStream、FileOutputStream
字符流方式:BufferedReader、BufferedWriter
二进制文件的读写
DataInputStream、DataOutputStream
字节流方式读写文本
1 FileInputStream 读文本文件
InputStream类常用方法
方法 |
说明 |
int read( ) |
从此输入流中读取一个数据字节。 |
int read(byte[] b) |
从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。 |
int read(byte[] b,int off,int len) |
从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。 |
void close( ) |
关闭此文件输入流并释放与此流有关的所有系统资源。 |
int available() |
返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。 |
子类FileInputStream常用的构造方法
构造方法 |
说明 |
FileInputStream(File file) |
通过文件对象创建FileInputStream对象。 |
FileInputStream(String name) |
通过name文件路径创建FileInputStream对象。 |
示例代码
package com.etc.io; //1.引入相关类 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class FISTest { public static void main(String[] args) { FileInputStream fis = null; try { // 2.构造文件输入流对象 fis = new FileInputStream("e:\mydoc.txt"); // 3.读取文本文件数据 byte[] words = new byte[1024];// 构建数组,一次读取1024个字节 while (fis.read() > 0) { fis.read(words); } // 4. 输出内容 String str = new String(words, "utf-8"); System.out.println(str); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 5. 关闭输入流 try { if (fis != null) { fis.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
2 FileOutputStream 写文本文件
OutputStream类常用方法
方法 |
说明 |
void write(int c) |
将指定字节写入此文件输出流。 |
void write(byte[] buf) |
将 b.length 个字节从指定 byte 数组写入此文件输出流中。 |
void write(byte[] b,int off,int len) |
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。 |
void close( ) |
关闭此文件输出流并释放与此流有关的所有系统资源。 |
子类FileOutputStream常用的构造方法
构造方法 |
说明 |
FileOutputStream (File file) |
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 |
FileOutputStream(String name) |
创建一个向具有指定名称的文件中写入数据的输出文件流。 |
FileOutputStream(String name, boolean append) |
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。 |
注意:
1、前两种构造方法在向文件写数据时将覆盖文件中原有的内容。
2、创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件。
3、FileInputStream和FileOutputStream创建的流属于节点流,直接操纵数据源。
示例代码
package com.etc.io; //1.引入IO相关类 import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class FOSTest { public static void main(String[] args) { FileOutputStream fos = null; try { // 2.构造FileOutputStream对象 fos = new FileOutputStream("e://fos.txt"); // 3.把数据写入文本文件 String text = "好好学习Java,天天向上!"; byte[] words = text.getBytes(); fos.write(words, 0, words.length); System.out.println("数据写入文件成功"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 4.关闭文件流 try { if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
3 上机练习:复制文本文件
需求描述
文件“我的介绍.txt”位于D盘根目录下,要求将此文件的内容复制到E:myFilemyInfo.txt中。
分析
使用FileInputStream实现读取文本文件。
使用FileOutputStream实现向文本文件中写数据
实现思路
1. 创建文件“D:我的介绍.txt”并自行输入内容
2. 创建C:myFile的目录。
3. 创建输入流FileInputStream对象,负责对D:我的结束.txt文件的读取。
4. 创建输出流FileOutputStream对象,负责将文件内容写入到C:myFilemyInfo.txt中。
5. 创建中转站数组words,存放每次读取的内容。
6. 通过循环实现文件读写。
7. 关闭输入流、输出流
字符流方式读写文本文件
1 BufferedReader读文本文件
使用字符流读取文本文件相关类
Reader
FileReader(节点流)
BufferedReader(处理流)
Reader类常用方法
int read( )
int read(char[] c)
int read(char[] c,int off,int len)
void close( )
子类BufferedReader常用的构造方法
public BufferedReader(Reader in) //in通常使用FlieReader对象
子类BufferedReader特有的方法
public String readLine() //读取一行信息
乱码问题
方案一:字节流到字符流的转换
文本保存为utf-8格式
FileInputStream fis=new FileInputStream("e:\mydoc.txt"); //使用InputStreamReader并设置编码格式 InputStreamReader fr=new InputStreamReader(fis,"UTF-8"); BufferedReader br=new BufferedReader(fr);
方案二:重构字符串
示例代码
package com.etc.io; //1.引入IO相关类 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class BrTest { public static void main(String[] args) { FileReader fr = null; BufferedReader br = null; try { // 2.创建一个FileReader对象 fr = new FileReader("E:\mydoc.txt"); // 3.创建一个BufferedReader 对象 br = new BufferedReader(fr); // 4.读取一行数据 String line = br.readLine(); while (line != null) { String str = new String(line.getBytes(), "UTF-8"); System.out.println(str); line = br.readLine(); } } catch (IOException e) { System.out.println("文件不存在!"); } finally { try { // 6. 关闭 流 if (br != null) br.close(); if (fr != null) fr.close(); } catch (IOException e) { e.printStackTrace(); } } } }
2 BufferedWriter写文本文件
使用字符流写文本文件相关类
Writer
FileWriter(节点流)
BufferedWriter(处理流)
Writer类常用方法
void write(String str)
void write(String str,int off,int len)
void close()
void flush()
子类BufferedWriter常用的构造方法
BufferedReader(Writer out) //in通常使用FlieWriter对象
示例代码
package com.etc.io; //1、引入IO相关类 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class BwTest { public static void main(String[] args) { FileWriter fw = null; BufferedWriter bw = null; try { // 2.创建一个FileWriter 对象 fw = new FileWriter("e:\hi.txt"); // 3.创建一个BufferedWriter 对象 bw = new BufferedWriter(fw); // 4.写入数据 bw.write("大家好!"); bw.write("我正在学习Java IO。"); bw.newLine(); bw.write("请多多指教!"); bw.newLine(); bw.flush();// 刷新缓冲区 System.out.println("写入文件信息成功!"); } catch (IOException e) { System.out.println("文件不存在!"); } finally { // 5.关闭流 try { if (bw != null) { bw.close(); } if (fw != null) fw.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }
3 上机练习:模板文件的替换
需求描述
1、格式模版保存在文本文件person.template中,内容如下:
您好!
我的名字是{name},我是{grade}学生。
我的专业是{speciality}。
2、其中{name}、{grade}、{speciality}是需要替换的内容,现在要求按照模板格式保存个人数据到文本文件,即把{name}、{grade}、{speciality}替换为具体的个人。
分析
1、使用Reader实现类读取文件
2、使用String的replace(char oldChar, char newChar)的方法替换内容
3、使用Writer实现类写文件
字节流方式读写二进制文件
1 DataInputStream类读取二进制文件(处理流)
FileInputStream的子类
与FileInputStream类结合使用读取二进制文件
2 DataOutputStream类写二进制文件(处理流)
FileOutputStream的子类
与FileOutputStream类结合使用写二进制文件
3 示例代码
/** * 二进制文件拷贝 * @param sFile 源文件 * @param dFile 目标文件 */ public static void copyBinFile(File sFile, File dFile) { FileInputStream fis = null;// 定义字节流输入节点流 DataInputStream dis = null;// 定义二进制输入处理流 FileOutputStream fos = null;// 定义字节流输出节点流 DataOutputStream dos = null;// 定义二进制输出处理流 try { fis = new FileInputStream(sFile); dis = new DataInputStream(fis);// 构建二进制输入处理流 fos = new FileOutputStream(dFile); dos = new DataOutputStream(fos);// 构建二进制输出处理流 int temp; while ((temp = dis.read()) != -1) {// 读取数据 dos.write(temp);// 写数据 } System.out.println("拷贝文件" + sFile.getName() + "成功!"); System.out.println("文件路径:" + sFile.getAbsolutePath()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭资源 try { if (dos != null) { dos.close(); } if (fos != null) { fos.close(); } if (dis != null) { dis.close(); } if (fis != null) { fis.close(); } } catch (IOException e) { e.printStackTrace(); } } }