常用的文件操作:
目录的操作和文件删除:
mkdir 创建一级目录:D:\demo
mkdirs 创建多级目录:D:\demo\a\b\c
delete 删除空目录或文件
public class Directory{ public static void main(String[] args) { //判断 d:\\news1.txt是否存在,如果存在就删除 public void m1(){ String filePath = "d:\\news1.txt"; File file = new File(filePath); if (file.exists()) { if (file.delete()) { System.out.print("删除成功!!"); } } else{ System.out.print("该文件不存在~~"); } } //判断 D:\\demo02是否存在,存在就删除,否则提示不存在 //在Java编程中,目录也被当成文件 public void m2(){ String filePath = "D:\\demo02"; File file = new File(filePath); if (file.exists()) { if (file.delete()) { System.out.print("删除成功!!"); } } else{ System.out.print("该目录不存在~~"); } } //判断 D:\\demo\\a\\b\\c 目录是否存在,如果存在就提示已经存在,否则就创建 public void m3(){ String directoryPath = "D:\\demo\\a\\b\\c"; File file = new File(directoryPath); if (file.exists()) { System.out.print("该目录已存在~~"); }else{ if(file.mkdirs()){ System.out.print(directoryPath + "创建成功"); }else{ System.out.print("创建失败~~"); } } } } }
IO 流原理及流的分类:
JavaIO 流原理:
- I/O 是 Input/Output 的缩写,I/O 技术是非常实用的技术,用于处理数据传输。如读 / 写文件,网络通讯等
- Java 程序中,对于数据的输入 / 输出操作以” 流 (stream)” 的方式进行
- java.io 包下提供了各种” 流” 类和接口,用以获取不同种类的数据,并通过方法输入或输出数据
- 输入 input:读取外部数据 (磁盘、光盘等存储设备的数据) 到程序 (中)
- 输出 output:将程序 (内存) 数据输出到磁盘、光盘等存储设备中
流的分类:
按操作数据单位不同分为:字节流 (8bit) 对二进制文件友好,字符流 (按字符) 对文本文件友好
按操作流的流向不同分为:输入流,输出流
按流的角色的不同分为:节点流,处理流 / 包装流
(抽象基类) | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
- Java 的 IO 流共涉及 40 多个类,实际上非常规则,都是从如上 4 个抽象基类派生的
- 由这 4 个类派生出来的子类名称都是以其父名作为子类名后缀
InputStream: 字节输入流
InputStream 抽象类是所有类字节输入流的超类
InputStream 常用的子类:
- FileInputStream: 文件输入流
- BufferedInputStream: 缓冲字节输入流
- ObjectInputStream: 对象字节输入流
例 1
使用 FileInputStream 读取 hello.txt 文件,并将文件内容显示到控制台
read () 方法单个字节读取,效率较低
public void readFile01(){ int readData = 0; String filePath = "e:\\hello.txt"; FileInputStream fileInputStream = null; //read()方法单个字节读取,效率较低 try{ //创建FileInputStream对象,用于读取文件 fileInputStream = new FileInputStream(filePath); //从该输入流读取一个字节的数据。如果没有输入可用,此方法将阻止 //如果返回-1,表示读取完毕 while((readData = fileInputStream.read()) != -1){ System.out.print((char)readData); //转成char显示 //如果有汉字,会出现乱码 } }catch(IOException e){ e.printStackTrace(); }finally{ try{ fileInputStream.close(); }catch (IOException e) { e.printStackTrace(); } } }
使用 read (byte [] b) 方法读取文件,提高效率
public void readFile02(){ //字节数组 byte[] buf = new byte[8];//一次读取8个字节 int readLen = 0; String filePath = "e:\\hello.txt"; FileInputStream fileInputStream = null; //read()方法单个字节读取,效率较低 try{ //创建FileInputStream对象,用于读取文件 fileInputStream = new FileInputStream(filePath); //从该输入流读取最多b.length字节的数据。此方法将阻塞,直到某些输入可用 //如果返回-1,表示读取完毕 //如果读取正常,返回实际读取的字节数 while((readLen = fileInputStream.read(buf)) != -1){ System.out.print(new String(buf,0,readLen)); //转成char显示 //如果有汉字,会出现乱码 } }catch(IOException e){ e.printStackTrace(); }finally{ try{ fileInputStream.close(); }catch (IOException e) { e.printStackTrace(); } } }
例 2
使用 FileOutputStream 将数据写到文件中,如果该文件不存在,则创建该文件
public void writerFile(){ //创建FileOutputStream对象 String filePath = "e:\\a.txt"; FileOutputStream fileOutputStream = null; try{ /* 1、new FileOutputStream(filePath)创建方式,当写入内容时,会覆盖原来的内容 2、new FileOutputStream(filePath,true)创建方式,当写入内容时,是追加到文件后面 */ //得到FileOutputStream对象 fileOutputStream = new FileOutputStream(filePath); //写入一个字节 fileOutputStream.writer("H"); //写入字符串 String str = "hello,world!" //str.getBytes() 可以把 字符串->字节数组 fileOutputStream.writer(str.getBytes()); //或者witle(byte[] b,int off, int len) }catch(IOException e){ e.printStackTrace }finally{ try{ fileInputStream.close(); }catch (IOException e) { e.printStackTrace(); } } }
完成文件拷贝:将 e:\Koala.jpg 拷贝到 c:\
/* 1、创建文件的输入流,将文件读入到程序 2、创建文件的输出流,将读取到的文件数据,写入到指定的文件 */ String srcFilePath = "e\\Koala.jpg" String destFilePath = "e\\Koala2.jpg" FileInputStream fileInputStream = null; FileOutputStream fileOutputStream = null; //try-catch fileInputStream = new FileInputStream(srcFilePath); fileOutputStream = new FileOutputStream(destFilePath); //定义一个字节数组,提高读取效果 byte[] buf = new byte[1024]; int readLen = 0; while ((readLen = fileInputStream.read(buf)) != -1 ) { //读取到后,就写入到文件,通过fileOutputStream //即是一边读一边写 fileOutputStream.writer(buf,0,readLen); } System.out.print("拷贝成功~~"); //try-catch finally{ //try-catch //关闭输入流和输出流 if(fileInputStream != null){ fileInputStream.close(); } if (fileOutputStream != null) { fileOutputStream.close(); } //try-catch }
FileReader 和 FileWriter:
FileReader 和 FileWriter 是字符流,即按照字符来操作 IO
FileReader 相关方法:
- new FileReader(File/String)
- read: 每次读单个字符,返回该字符,如果到文件末尾返回 - 1
- read (char []):批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回 - 1
相关 API:
- new String (char []):将 char [] 转换成 String
- new String (char [],off,len):将 char [] 的指定部分转换成 String
FileWriter 常用方法:
- new FileWriter (File/String):覆盖模式,相当于流的指针在首段
- new FileWriter (File/String,true):追加模式,相当于流的指针在尾端
- write (int):写入单个字符
- write (char []):写入指定数组
- write (char [],off,len):写入指定数组的指定部分
- write (string):写入整个字符串
- write (string,off,len):写入字符串的指定部分
相关 API:
String 类:toCharArray:将 String 转换成 char []
例 1 使用 FileReader 从 story.txt 读取内容,并显示
按单个字符读取文件
String filePath = "e:\\stroy.txt"; FileReader fileReader = null; char data = 0; //1、创建FileReader对象 //try-carch fileReader = new FileReader(filePath); //循环读取 使用read方法,单个字符读取 while ((data = fileReader.read()) != -1) { System.out.print(char() data); } //try-catch finally{ //try-catch if (fileReader != null) { fileReader.close(); } //try-catch }
使用字符数组读取文件
String filePath = "e:\\stroy.txt"; FileReader fileReader = null; int readLen = 0; char[] buf = new char[8]; //1、创建FileReader对象 //try-carch fileReader = new FileReader(filePath); //循环读取 使用read(buf)方法,返回的是实际读取到的字符数 //如果返回-1,说明到文件结束 while ((readLen = fileReader.read(buf)) != -1) { System.out.print(new String(buf), 0, readLen); } //try-catch finally{ //try-catch if (fileReader != null) { fileReader.close(); } //try-catch }
例 2 使用 FileWriter 将” 风雨之后,定见彩虹” 写入到 note.txt 文件中
public static void main(String[] args) { String filePath = "e:\\note.txt"; //创建FileWriter对象 FileWriter fileWriter = null; char[] chars = {'a','b','c'}; //try-catch fileWriter = new FileWriter(filePath); /* write(int):写入单个字符 write(char[]):写入指定数组 write(char[],off,len):写入指定数组的指定部分 write(string):写入整个字符串 write(string,off,len):写入字符串的指定部分 */ //write(int):写入单个字符 fileWriter.write("H"); //write(char[]):写入指定数组 fileWriter.write(chars); //write(char[],off,len):写入指定数组的指定部分 fileWriter.write("ABCDEF".toCharArray(), 0, 3); //write(string):写入整个字符串 fileWriter.write(" 你好北京~~"); //write(string,off,len):写入字符串的指定部分 fileWriter.write("上海天津", 0, 2); //写入 上海 ,天津没写进去 fileWriter.write("风雨之后,定见彩虹"); //在数据量大的情况下,可以使用循环操作 //try-catch finally{ //对于FileWriter,一定要关闭流,或者flush才能真正的把数据写入到文件 //try-catch //fileWriter.flush(); //关闭文件流,等价于flush() + 关闭 fileWriter.close(); //try-catch } System.out.print("程序结束~~"); }