该文总结了JavaIO流常用对象与方法的使用样例,可根据需要学习。
文件 意义 Java把电脑中的文件和文件夹封装成了File类,我们可以使用File类对文件和文件夹进行一些操作
操作
删除文件夹/文件
创建文件/文件夹
判断文件/文件夹是否存在
获取文件/文件夹的大小
注意点 File类是一个与系统无关的类,任何操作系统都可以使用这个类中的方法
分隔符 路径分隔符 :
windows系统的路径分隔符 - ;
Linux系统下的路径分隔符 - :
文件名称分隔符 :
window系统下 - \
Linux系统下 - /
相关函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 String pathseparator = File.pathSeparator; System.out.println("pathseparator = " + pathseparator); System.out.println("pathseparator = " + File.pathSeparatorChar); String separator = File.separator; System.out.println("separator = " + separator); System.out.println("separator = " + File.separatorChar);
路径 相对路径和绝对路径 :
绝对路径 :一个完整路径(从盘符开始的路径),如:D:\xxxx\xxx\xxx.java
它表示的是当前文件或者目录在当前操作系统中的真实路径,
缺点 :
相对路径 :一个简化的路径。
注意 :相对指的是什么?相对指的是对于当前项目的根路径,如果使用当前项目的根目录,路径可以简化书写
绝对路径 :D:\xxxx\xxx\xxx.java
相对路径 :xxx.java
注意 :使用File对象的时候只能做到对文件(目录)的属性进行访问
比如:名字,大小,是否为文件等,还可以做到对文件(目录)进行删除和创建的操作
注意 :
1 2 3 4 5 6 7 8 9 String pathname = "src/cn/egret/Demo01.java" ; File file = new File(pathname); System.out.println(file); System.out.println(file.getAbsolutePath());
File构造器
构造器
说明
优点
注意点
File(File parent, String child)
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
1. 父路径和子路径他们可以单独书写,使用起来比较灵活,并且父路径和子路径都可以变化 2. 路径可以随时变化,父类是File类型,可以使用File的方法对路径进行操作,在使用路径去创建对象
File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
1、路径可以是相对路径也可以是绝对路径<br/ >2、传入的路径它可以是存在的也可以是不存在 3、路径可以是以文件结尾,也可以是以文件夹结尾 4、创建File对象的时候只是把字符串路径封装成字符串对象,可以不用考虑路径的真假问题
File(String parent, String child)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(URI url)
通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 String pathName = "D:\\egret\\javase2101\\day20210318\\cn\\egret\\Demo04.java" ; File file = new File(pathName); System.out.println(file); String parent = "/Users/egret" ; String child = "javase2101.txt" ; File file2 = new File(parent, child); System.out.println(file2);
常用方法
方法
说明
getAbsolutePath()
返回此抽象路径名的绝对路径名字符串。
getPath()
将此抽象路径名转换为一个路径名字符串。
getName()
返回由此抽象路径名表示的文件或目录的名称。
length()
返回由此抽象路径名表示的文件的长度。
isDirectory()
测试此抽象路径名表示的文件是否是一个目录。
isFile()
测试此抽象路径名表示的文件是否是一个标准文件。
exists()
测试此抽象路径名表示的文件或目录是否存在。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 String pathname = "day20210318\\src\\cn\\egret" ; String pathname1 = "src/cn/egret/javase2101.txt" ; File file1 = new File(pathname); File file2 = new File(pathname1); System.out.println(file1.getAbsolutePath()); System.out.println(file2.getAbsolutePath()); String s1 = file1.getPath(); String s2 = file2.getPath(); System.out.println("s1 = " + s1); System.out.println("s2 = " + s2); String name1 = file1.getName(); String name2 = file2.getName(); System.out.println("name1 = " + name1); System.out.println("name2 = " + name2); String p1 = "/Users/egret/javase2101" ; String p2 = "C:\\Users\\86176\\eclipse-workspace\\day20210318\\src\\cn\\egret\\Demo01.java" ; String p3 = "D:\\egret\\javase2101\\day20210318\\src\\cn\\egret\\Demo01.java" ; File f1 = new File(p1); File f2 = new File(p2); File f3 = new File(p3); System.out.println("f1 =" + f1.length()); System.out.println("f2 =" + f2.length()); System.out.println("f3 =" + f3.length());
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 String p1 = "/Users/egret/javase2101/day20210318/src/cn/egret" ; String p2 = "D:/egret/javase2101/day20210318/src/cn/egret" ; File f1 = new File(p1); File f2 = new File(p2); boolean exists2 = f2.exists();boolean exists = f1.exists();System.out.println("文件夹/文件是否存在 :" + exists); System.out.println("文件夹/文件是否存在 :" + exists2); if (f1.exists()) { System.out.println("f1.isDirectory :" + f1.isDirectory()); System.out.println("f1.isFile :" + f1.isFile()); }else { System.out.println("文件/文件夹不存在" ); } System.out.println("f2.isDirectory :" + f2.isDirectory()); System.out.println("f2.isFile :" + f2.isFile());
文件方法 创建文件
方法
说明
createNewFile()
创建文件
mkdir()
创建单级文件夹
mkdirs()
既能创建单级文件夹,也能够创建多级文件夹
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 String p1 = "src/cn/egret/javase2101.txt" ; File f1 = new File(p1); if (!(f1.exists())) { boolean createNewFile = f1.createNewFile(); System.out.println("创建成功" ); }else { System.out.println("您要创建的文件已经存在,请不要重复创建" ); } String p2 = "src/cn/egret/aaa" ; String p3 = "src/bn/egret/aaa/bbb/ccc/ddd" ; File f2 = new File(p2); File f3 = new File(p3); if (!(f3.exists())) { boolean mkdir = f3.mkdirs(); System.out.println("创建成功" ); }else { System.out.println("文件夹已经存在" ); } String path1 = "src/cn/egret/aaa" ; String path2 = "src/cn/egret/aaa/bbb/ccc/ddd" ; File f1 = new File(path1); File f2 = new File(path2); boolean mkdir = f1.mkdir();boolean mkdirs = f2.mkdirs();System.out.println("一级目录创建 :" + mkdir); System.out.println("多级目录创建 :" + mkdirs);
删除文件delete() 删除有次级file的方法,他的返回值是boolean
true:文件、文件夹被删除
false:文件夹中有内容,不会删除,返回false。 构造方法中的路径是假路径也会删除失败
注意:delete直接在硬盘中删除文件或者文件夹,不放入回收站,删除需谨慎
1 2 3 4 String path = "src/cn/egret/aaa" ; File file = new File(path); boolean delete = file.delete();System.out.println("文件是否删除:" + delete);
目录遍历 list()和 listFiles() 1 2 3 4 5 String [] list(); File [] listFiles();
注意: 注意:list( )和listFiles()这两个方法遍历的是构造器中给的目录
如果构造函数中给出的目录路径不存在,会抛出空指针异常。
如果构造方法中给出的路径不是一个目录的话,它也会抛出空指针异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 String path1 = "src/cn/egret" ; File f1 = new File(path1); if (!f1.exists()){ f1.mkdirs(); System.out.println("创建成功" ); }else { System.out.printle("创建失败" ); } File f2 = new File(path1); if (f2.isDFirectory()){ String [] list = f2.list(); for (String name : list){ System.out.println("name" + name); } }else { System.out.println("非文件夹“); }
练习:删除多级文件夹
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public static void delete (String pathName) { File f1 = new File(pathName); if (f1.isDirectory()){ String [] list = f1.list(); for (int i = 0 ; i < list.length(); i++){ delete(pathname + "/" + list[i]); } } f1.delete(); } public static void main (String[] args) { String pathname = "src/cn/egret/aaa" ; File f1 = new File(pathname); if (f1.isDirectory()) { delete(pathname); System.out.println("删除成功" ); }else { System.out.println("你要删除的目录不存在" ); } }
文件过滤器 FileFilter 获取当前目录下所有满足条件的部分子类
FilenameFilter 接口: boolean accept(File dir, String name) ;其中dir表示的是当前目录,name是文件名
FileFilter 接口:boolean accept(File pathname) pathname 表示的是文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 String pathname = "src/cn/egret" ; File f1 = new File(pathname); FileFilter fileFilter = new FileFilter() { @Override public boolean accept (File pathname) { if (pathname.isDirectory()) { return true ; } String name = pathname.getName(); return name.endsWith(".txt" ); } }; if (f1.isDirectory()) { File[] listFiles = f1.listFiles(fileFilter); for (File filename : listFiles) { System.out.println("filename = " + filename); } } }
文件随机读写类 RandomAccessFile 文件随机读写类 RandomAccessFile
基于指针对文件数据的读写,是用于实现对文件内容的读写操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 String p1 = "src\\cn\\egret\\d.txt" ; File f1 = new File(p1); System.out.println(f1.getAbsolutePath()); RandomAccessFile randomAccessFile = new RandomAccessFile(p1, "rw" ); randomAccessFile.writeInt(16 ); randomAccessFile.close(); randomAccessFile.write(3 >>>24 ); randomAccessFile.write(3 >>>16 ); randomAccessFile.write(3 >>>8 ); randomAccessFile.write(3 ); long length1 = f1.length(); System.out.println("写入数据之前的文件大小 = " + length1); randomAccessFile.writeInt(16 ); System.out.println("写入成功" ); long length2 = f1.length(); System.out.println("写入数据之后的文件大小 = " + length2); randomAccessFile.close(); String p1 = "src/cn/egret/d.txt" ; File f1 = new File(p1); RandomAccessFile randomAccessFile = new RandomAccessFile(f1, "r" ); int read= randomAccessFile.readInt(); System.out.println("读取到的数据为 :" + read); ------------------------------------------------------------------------------------ File f1 = new File("src/cn/egret/e.txt" ); RandomAccessFile ra = new RandomAccessFile(f1, "rw" ); long filePointer1 = ra.getFilePointer(); System.out.println("filePointer1 = " + filePointer1); ra.write('a' ); System.out.println("写入成功" ); long filePointer2 = ra.getFilePointer(); System.out.println("filePointer2 = " + filePointer2); ra.write('b' ); long filePointer3 = ra.getFilePointer(); System.out.println("filePointer3 = " + filePointer3); ra.seek(1 ); ra.write('c' ); System.out.println("c写入成功当前指针位置为: " + ra.getFilePointer()); ----------------------------------------------------------------------------------- String str = "abcdefghijklmnopqrstuvwxyz" ; byte [] bytes = str.getBytes(); ra.write(bytes); System.out.println("写入成功" ); byte [] bytes = new byte [(int )randomAccessFile.length()]; randomAccessFile.read(bytes); System.out.println("读取到的数据为 :" + new String(bytes,"UTF-8" ));
IO 硬盘特点 :永久储存
输入流 :把硬盘中的数据读取到内存中使用
输出流 :把内存中的东西输出到硬盘
I : input 输入
o : output 输出
流 : 数据(字符,字节) 1个字符 = 2个字节, 1个字节 = 8个比特位
注意 :根据读数据不同有
根据数据的流向 分为:输入流和输出流
输入流:把数据从其他设备上读取到内存中使用的流
输出流:把数据从内存中写入到其他设备上的流
根据数据类型 可将流分为: 1、字符流 2、字节流
字节流:以字节为单位去读写数据的流
字符流:以字符为单位去读写数据的流
输入流
输出流
字节流
InputStream
OutputStream
字符流
Reader
Writer
字节流 字节流 : 一切皆为字节,一切文本数据在存储的时候,都是以二进制的形式进行保存,既都是一个个字节。 所以字节流是可以传输任意文件的数据。
字节输出流outputStream java.io.OutputStream :此抽象类是表示输出字节流的所有类的超类。将指定的字节信息写出到目的地。 它定义了字节输出流基本的共性方法。
方法
说明
void close()
关闭此输出流并释放与此流有关的所有系统资源。
void flush()
刷新此输出流并强制写出所有缓冲的输出字节。
void write(byte[] b)
将 b.length 个字节从指定的 byte 数组写入此输出流。
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
abstract void write(int b)
将指定的字节写入此输出流。
注意:当完成流操作时,必须调用close方法,释放资源
FileOutputStream FileOutputStream : 文件字节输出流,用于将数据写到文件当中去
构造方法:
方法
说明
FileOutputStream(File file)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(String name)
创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(File file, boolean append)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(String name, boolean append)
创建一个向具有指定 name 的文件中写入数据的输出文件流。
参数:写入数据的目的地
String name:目的是一个文件路径
File file:目的地是一个文件
构造方法的作用 :
创建FileOutputStream对象
根据构造方法传递的文件/文件路径,创建一个空文件
会把FileOutputStream对象指向创建好的文件
代码实例 :
1 2 3 4 5 6 File f1 = new File("src/cn/egret/pm/a.txt" ); FileOutputStream fos = new FileOutputStream(f1); 使用文件名称创建流对象 FileOutputStream fos1 = new FileOutputStream("b.txt" );
写入方法使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 1 、创建FileOutputStream对象,构造方法中写入数据传递的目的地FileOutputStream fos = new FileOutputStream("src/cn/egret/pm/a.txt" ); 2 、调用FileOutputStream对象中的write,将数据写入到文件当中 fos.write('a' ); 3 、释放资源 fos.close(); FileOutputStream fos2 = new FileOutputStream("b.txt" ); fos2.write(49 ); fos2.write(48 ); fos2.write(48 ); fos2.close(); String str = "ABCDEFG" ; byte [] bytes = str.getBytes();fos2.write(bytes); String str2 = "fileOutputStream" ; byte [] bytes2 = str2.getBytes();fos2.write(bytes2, 10 , 6 ); System.out.println("写入成功" );
追加写入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 FileOutputStream fos3 = new FileOutputStream("b.txt" ,true ); String str3 = "hello" ; byte [] bytes = str3.getBytes();fos3.write(bytes); System.out.println("fos3写入数据成功" ); String str4 = ",FileOutputStream" ; byte [] bytes2 = str4.getBytes();fos3.write(bytes2); FileOutputStream fos4 = new FileOutputStream("b.txt" ,true ); String str3 = "hello" ; byte [] bytes = str3.getBytes();for (int i = 0 ; i < 5 ; i++) { fos4.write(bytes); fos4.write("\r" .getBytes()); } fos4.close();
java.io.InputStream :所有字节输入流的父类,可以读取字节信息到内存中去,它定义了字节输入流基本的共性方法
方法
说明
void close()
关闭此输入流并释放与该流关联的所有系统资源。
abstract int read()
从输入流中读取数据的下一个字节。
int read(byte[] b)
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
int read(byte[] b, int off, int len)
将输入流中最多len 个数据字节读入 byte 数组。
FileInputStream :文件字节输入流
作用 :把硬盘文件中的数据,读取到内存中去使用
构造方法:
方法
说明
FileInputStream(File file)
通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String name)
通过打开一个到实际文件的连接来创建一个 * FileInputStream,该文件通过文件系统中的路径名 name 指定。
参数:读取文件的数据域
String name:文件路径
File file:文件
构造方法中的作用 :
创建FileInputStream对象
会把FileInputStream对象指定构造方法中要读取的文件
读取文件的原理(硬盘到内存)
java程序 - JVM — os操作系统 - os读取数据的方法
使用字节输入流的步骤
创建FileInputStream对象,构造方法中绑定要读取的数据
使用FileInputStream对象中提供read方法读取文件
释放资源
读入示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 FileInputStream fis = new FileInputStream("src/cn/egret/pm/a.txt" ); int read = fis.read();System.out.println("read :" + read); int read1 = fis.read();System.out.println("read1 :" + read1); int read2 = fis.read();System.out.println("read2 :" + read2); int read3 = fis.read();System.out.println("read3 :" + read3); int read4 = fis.read();System.out.println("read4 :" + read4); int len = 0 ;while ((len = fis.read()) != -1 ) { System.out.println((char )len); } FileInputStream fis = new FileInputStream("src/cn/egret/pm/a.txt" ); byte [] bytes = new byte [2 ];int len = fis.read(bytes);System.out.println("len :" + len); System.out.println("arrays.toString: " + Arrays.toString(bytes)); len = fis.read(bytes); System.out.println("len :" + len); System.out.println("arrays.toString: " + Arrays.toString(bytes)); len = fis.read(bytes); System.out.println("len :" + len); System.out.println("arrays.toString: " + Arrays.toString(bytes)); byte [] bytes = new byte [1024 ];int len = 0 ; while ((len = fis.read(bytes)) != -1 ) { String str = new String(bytes,0 ,len); System.out.println(str); } fis.close();
小练习:
字符流 使用字节流读取中文文件时,1个中文 :
字符输入流Reader 来自包 java.io.Reader ,所有字符输入流的父类
常用方法 :
方法
说明
close()
关闭此流并且释放资源
read()
从输入流中读取一个字符
read(char[] ch))
从输入流当中读取一些字符,并且将其存入字符数组中去
构造方法 :
方法
说明
FileReader(File file)
在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新 FileReader。
字符输入流使用步骤
创建FileReader对象,构造方法绑定要读取到数据源
调用read()读取文件
释放资源
读取字符:read() ,每次读取一个字符的数据,将其提升为int类型,当读取到文件末尾到时候返回-1。
代码示例 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 String fileName = "src/cn/egret/a.txt" ; FileReader fileReader = new FileReader(fileName); char [] ch = new char [1024 ];int len = 0 ;while ((len = fileReader.read(ch)) != -1 ) { String str = new String(ch,0 ,len); System.out.println(str); } fileReader.close();
字符输出流Writer 字符输出流:Writer 所有字符输出流的父类
直接已知子类 :
BufferedWriter
CharArrayWriter
FilterWriter
OutputStreamWriter
PipedWriter
PrintWriter
StringWriter
常用共性方法 :
方法
说明
void write(char[] cbuf)
写入字符数组。
abstract void write(char[] cbuf, int off, int len)
写入字符数组的某一部分。
void write(int c)
写入单个字符。
void write(String str)
写入字符串。
void write(String str, int off, int len)
写入字符串的某一部分。
flush()
刷新该流的缓冲。
close()
关闭此流,但要先刷新它。
FileWriter :用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
构造方法 :
方法
说明
FileWriter(File file)
根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(String fileName)
根据给定的文件名构造一个 FileWriter 对象。
作用 :把内存中的数据写入到文件中去
使用步骤 :
创建FileWriter对象,构造方法绑定要写出到资源路径
调用write()写出数据
释放资源
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 FileWriter fw = new FileWriter("src/cn/egret/a.txt" ,true ); char [] ch = {'2' ,'0' ,'2' ,'1' ,'j' ,'a' ,'v' ,'a' ,'s' ,'e' }; fw.write(ch); System.out.println("写入成功" ); fw.flush(); fw.write('刷' ); fw.flush(); fw.write('新' ); fw.flush(); String str = "javase进阶" ; fw.write(str); fw.flush(); fw.write(str, 0 , 6 ); fw.flush(); for (int i = 0 ; i < 5 ; i++) { fw.write("javase进阶" + (i + 1 ) + "\r" ); } fw.close(); fw.write('刷' ); fw.write('新' );
转换流 编码 :字符(能看的懂得) -> 字节(看不懂的)
解码 :字节(看不懂的) -> 字符(能看的懂得)
注意 :如果指定了编码。就相当于指定了字符集。所以编码才是我们要关心的内容
gbk 格式进行编码 要想让其显示正确 要用gbk对应字符集进行解码
gbk 格式进行编码 使用utf-8格式进行解码 乱码
字符集(charset) :编码表,是系统支持的所有字符的集合,其中包括国家文字,标点符号,图形符号,数字
常见的字符集 :
ASCII字符集
GBxxx字符集
GB(国标)
GB2312:简体中文码表
GBK:常见的中文码表
GB18030:最新的中文码表
Unicode字符集等
ISO-8859-1:字符集(拉丁码表)
FileReader :读取默认编码格式文件,读取系统默认的编码(gbk)会产生乱码的情况
注意 :gbk存储在电脑上的实际是4个字节,使用utf-8存储实际是6个字节,编码格式不同,占用的大小不同
注意 :FileReader只能查询系统的默认码表
思考:查询默认码表的目的? 将字节转化成字符(解码的过程)
使用InputStreamReader读取文件,它能够查询utf-8和指定的编码表
InputStreamReader()是字节通向字符的桥梁
FileWriter 同样只能使用系统默认码表将字符转成字节
OutputStreamWriter() 从字符流到字节流的桥梁
注意:转换流的强大之处在于我们可以指定编码表
构造方法 :
方法
说明
InputStreamReader(InputStream in)
创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader。
参数 :
InputStream in :字节输入流,用与读取文件中保存的字节
String charsetName : 设置表码表
使用步骤 :
创建InputStreamReader对象,构造方法中传入指定的字节输入流和表码格式
使用InputStreamReader对象中read()读取文件
释放资源
注意:构造方法中指定的编码表明要和文件编码相同,否则会乱码
代码示例:
1 2 3 4 5 6 7 8 9 10 11 FileInputStream fis = new FileInputStream("src/cn/egret/a.txt" ); InputStreamReader in = new InputStreamReader(fis,"gbk" ); int len = 0 ;while ((len = in.read()) != -1 ) { System.out.print((char )len); } in.close(); fis.close();
OutputStreamWriter OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset,将要写入流中的字符编码成字节。 它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
构造方法 :
方法
说明
OutputStreamWriter(OutputStream out)
创建使用默认字符编码的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName)
创建使用指定字符集的OutputStreamWriter。
使用步骤 :
创建OutputStreamWriter对象,构造方法中传递字节输出流和指定编码格式的名称
使用write()将数据写入到缓冲区
使用flush方法刷新缓冲区将数据写入文件中
释放资源
代码示例:
1 2 3 4 5 6 7 FileOutputStream fos = new FileOutputStream("src/cn/egret/a.txt" ); OutputStreamWriter os = new OutputStreamWriter(fos,"gbk" ); String str = "你好Javase2101" ; os.write(str); os.flush(); os.close(); fos.close();
字符缓冲流 字符缓冲流 :可以传递一个FileWriter/FileReader,缓冲会给FileWriter/FileReader增加一个缓冲区,便于提高读写效率
字符缓存输入流 BufferedReader构造方法 :
方法
说明
BufferedReader(Reader in)
创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz)
创建一个使用指定大小输入缓冲区的缓冲字符输入流。
参数 :
Reader in:字符输入流
int sz : 指定缓冲区大小,如果不写的话使用默认大小
字符缓存输出流 BufferedWriter构造方法:
方法
说明
BufferedWriter(Writer out)
创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz)
创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
参数 :
Writer out:字符输出流
int sz : 指定缓冲区大小,如果不写的话使用默认大小
特有方法 :
newLine():写入一个行分隔符,会根据不同的操作系统,获取到不同到行分隔符; :
使用步骤
创建字符缓冲输入/输出流,构造方法中传递对应的输入/输出流
使用write/read方法,读取指定文件的数据/将数据写入到指定到文件中
如果是写操作的话,调用flush方法刷新缓冲区,如过是读操作则忽略该步骤
释放资源
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ---------------------------------写------------------------------------------ FileOutputStream fos = new FileOutputStream("src/cn/egret/a.txt" ); OutputStreamWriter ow = new OutputStreamWriter(fos,"gbk" ); BufferedWriter bw = new BufferedWriter(ow); for (int i = 0 ; i < 5 ; i++) { String str = "这个是使用gbk格式写入的文件数据" ; bw.write(str + (i+1 )); bw.newLine(); } bw.flush(); bw.close(); ow.close(); fos.close(); --------------------------------读------------------------------------------ FileInputStream fis = new FileInputStream("src/cn/egret/a.txt" ); InputStreamReader ir = new InputStreamReader(fis,"gbk" ); BufferedReader br = new BufferedReader(ir); char [] ch = new char [1024 ]; String readLine = null ; while ((readLine = br.readLine()) != null ) { System.out.println(readLine + "\r" ); } br.close(); ir.close(); fis.close();
小练习:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 Map<String,String> map = new HashMap<String,String>(); FileInputStream fis = new FileInputStream("src/cn/egret/a.txt" ); InputStreamReader ir = new InputStreamReader(fis); BufferedReader br = new BufferedReader(ir); File0utputStream fos = new File0utputStream("src/cn/egret/b.txt" ); OutputStreamWriter ow = new 0utputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(ow); String readLine = null ; while ((readLine = br.readLine()) != null ) { String[] split = readLine.split("\\." ); map.put(split[0 ],split[1 ]); } for (String key : map.ketSet()) { String value = map.get(key); readLine = key + "." + value; . bw.write(readLine); bw.newLine(); } bw.close(); 0W.close(); fos.close( ); br.close(); ir.close(); fis.close();
对象流 对象序列化流
1 Person p = new Person("Egret",3);
把对象用流的形式存放文件当中进行保存,可以叫做写对象,也可以称之为对象的序列化
注意 :对象中可能不仅仅包含字符,还有字节。需要使用字节流进行对象的序列化
对象的序列化流:ObjectOutputStream
注意:硬盘中保存的对象都是字节
java.io.ObjectOutputStream :将Java对象的原始数据类型写入到文件当中去,实现对象持久存储
类别
方法
说明
构造方法
ObjectOutputStream(OutputStream out)
创建写入指定 OutputStream 的 ObjectOutputStream。
特有的成员方法
writeObject(Object obj)
将指定的对象写入 ObjectOutputStream。
使用步骤:
创建一个ObjectOutputStream对象,构造方法中传递字节输出流
使用ObjectOutputStream对象中特有的成员方法writeObject,将对象写入到文件当中
释放资源
注意 :java.io.NotSerializableException: cn.egret.am.Person
序列化和反序列化的时候如果对象没有实现Serializable接口,则会抛出该异常:没有序列化异常
对象序列化需要的条件
实现Serializable
该类的所有属性都必须是可序列化的,如果该类中有一个属性不需要被序列化,则需要表明这个属性是瞬态的,必须用transient关键字修饰
对象的反序列化流:ObjectInputStream
作用 :将文件中保存的对象,以流的形式读取出来
思考 :写的时候是可以写任意对象的,那么读取对象的时候我们要用什么类型来接受读取到的对象?
答 :Object类型
类别
方法
说明
构造方法
ObjectInputStream(InputStream in)
创建从指定 InputStream 读取的 ObjectInputStream。
特有的成员方法
readObject()
从 ObjectInputStream 读取对象。
使用步骤 :
创建ObjectInputStream对象,构造方法中传递字节输入流
使用ObjectInputStream对象中的方法readObject读取保存的对象文件
释放资源
使用读取出来的文件(打印)
注意 :
反序列的类必须实现Serializable
必须存在类对应的class文件
例子Person类 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class Person implements Serializable { private static final long serialVersionUID = -12312312312312L ; public String name; public String address; public Integer age; public Person (String name, String address, Integer age) { super (); this .name = name; this .address = address; this .age = age; }
使用例子 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 public static void write () throws IOException { FileOutputStream fos = new FileOutputStream("src/cn/egret/am/a.txt" ); ObjectOutputStream oos = new ObjectOutputStream(fos); Person person = new Person("张三" , "厦门" , 18 ); oos.writeObject(person); System.out.println("对象序列化成功" ); oos.close(); fos.close(); } public static void read () throws IOException, ClassNotFoundException { FileInputStream fis = new FileInputStream("src/cn/egret/am/a.txt" ); ObjectInputStream ois = new ObjectInputStream(fis); Object object = ois.readObject(); ois.close(); System.out.println(object); Person person = (Person) object; System.out.println(person.getName() + " " + person.getAddress() + " " + person.getAge()); } public static void main (String[] args) throws IOException, ClassNotFoundException { write(); read(); }
小练习 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 public static void method01 () throws I0Exception { List list = new ArrayList(); Person person1 = new Person("aa" ,"福州" ,18 ); Person person2 = new Person ("bbb" ,"福州" ,18 ); Person person3 = new Person("ccc" ,"福州" ,18 ); list.add(person1); list.add(person2); list.add(person3); File0utputStream fos = new File0utputStream("src/cn/egret/person. txt" ); 0bjectOutputStream out = new 0bject0utputStream(fos); out.writeObject(list); System.out.println("对象序列化成功" ); out.close(); fos.close(); } public static void method02 () throws IOException, Clas sNotFoundException { FileInputStream fis = new FileInputStream("src/cn/egret/person.txt" ); ObjectInputStream ois = new 0bjectInputStream(fis); 0bject person = ois.read0bject(); List<Person> list = (List<Person>)person; for (int i = 0 ; i < list.size(); i++) { 0bject object = list.get(i); System.out.println(object); } for (Person person2 : list) { System.out.println(person2); } ois.close(); fis.close(); }