IO框架
什么是流
-
概念:内存与存储设备之间传输数据的通道。
按方向(重点)
-
输入流:将<存储设备>中的内容读取到<内存>中。
-
输出流:将<内存>中的内容写入到<存储设备>中。
按单位:
-
字节流:以字节为单位,可以读写所有数据。
-
字符流:以字符为单位,只能读写文本数据。
按功能
-
节点流:具有实际传输数据的读写功能。
-
过滤流:字节流的基础上增强的功能。
字节流
InputStream
OutputStream
文件字节流
FileInputStream
-
public int read(byte[] b) //从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数;如果达到文件的尾部,则返回-1。
/** * 演示FileInputStream的使用 * 文件字节输入流 */ public class FileInputStreamTest { public static void main(String[] args) throws Exception{ //1.创建FileInputStream,并指定文件路径 FileInputStream fis = new FileInputStream("e:\\aaa.txt"); //2.读取文件 // fis.read(); //2.1.单个字节读取 //int data = 0; // while ((data = fis.read())!=-1){ // System.out.print((char) data); // } //2.2一次读取多个字节 byte[] bytes = new byte[1024]; int count = 0; while ((count = fis.read(bytes))!=-1){ System.out.println(new String(bytes,0,count)); } fis.close(); System.out.println("读取结束"); } }
FileOutputStream
-
public void write(byte[] b) //-次写多个字节,将b数组中所有字节,写入输出流。
/** * 演示FileOutputStream的使用 * 文件字节输出流 */ public class FileOutputStreamTest { public static void main(String[] args) throws Exception { FileOutputStream outputStream = new FileOutputStream("e:\\bbb.txt", true); String s = "我爱你中国,亲爱的母亲,我为你流泪,也为你自豪。"; outputStream.write(s.getBytes()); //关闭 outputStream.close(); System.out.println("执行完毕"); } }
实现文件复制
/** * 使用文件字节流实现文件复制 */ public class Demo01 { public static void main(String[] args) throws Exception{ //创建文件输入流与输出流 FileInputStream fis = new FileInputStream("C:\\Users\\Lenovo\\Pictures\\壁纸\\4.jpg"); FileOutputStream fos = new FileOutputStream("C:\\Users\\Lenovo\\Pictures\\壁纸\\40.jpg"); //2.一边读,一边写 byte[] buf = new byte[1024]; int count = 0; while ((count = fis.read(buf))!=-1){ fos.write(buf,0,count); } //关闭 fis.close(); fos.close(); System.out.println("执行完毕"); } }
字节缓冲流
缓冲流: BufferedInputStream/ Buffered0utputStream
-
提高I0效率,减少访问磁盘的次数;
-
数据存储在缓冲区中,flush是将缓存区的内容写入文件中,也可以直接close.
/** * 使用字节缓冲流读取 * BufferedInputStream的使用 */ public class BufferedInputStreamTest { public static void main(String[] args) throws Exception{ //1.创建BufferedInputStream FileInputStream fis = new FileInputStream("e:\\aaa.txt"); BufferedInputStream bis = new BufferedInputStream(fis);//文件缓冲流 //2.读取,用缓冲流读取 //int data = 0; //while ((data = bis.read())!=-1) { // System.out.println((char) data); //} //自己创建缓冲区 byte[] buf = new byte[1024]; int count = 0; while ((count = bis.read(buf))!=-1){ System.out.println(new String(buf,0,count)); } //3.关闭 bis.close();//关闭bis就默认关闭了fis; } }
/** * 使用字节缓冲流写入文件 * BufferedOutputStream */ public class BufferedOutputStreamTest { public static void main(String[] args) throws Exception{ //1.创建缓冲区 FileOutputStream fos = new FileOutputStream("e:\\buffer.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos); //2.写入 int i= 0; while (i<10){ bos.write("helloBuffer!\r\n".getBytes());//写入8K缓冲区 bos.flush(); i++; } //3。关闭 bos.close(); } }
序列化
/** * 使用ObjectOutputstream实现对象的序列化 * 将对象写到硬盘上 * 要求:(1)实现Serializable接口 * (2)序列化中对象属性要求实现Serializable接口 * (3)序列化版本号ID,保证序列化和反序列化的类是同一个类。 * (4)使用transient(瞬间的)修饰属性,这个属性不能序列化 * (5)静态属性不能被序列化 * (6)序列化多个对象可以借助集合 */ public class ObjectOutputstreamTest { public static void main(String[] args) throws Exception{ //1.创建对象流 FileOutputStream fos = new FileOutputStream("e:\\ccc.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); //2.序列化,即写入操作 Student s1 = new Student("李白",19); oos.writeObject(s1); //3。关闭 oos.close(); System.out.println("序列化完毕!"); //NotSerializableException不能序列化,得实现接口 } }
反序列化
/** * 使用ObjectInputStream实现反序列化(读取) */ public class ObjectInputStreamTest { public static void main(String[] args) throws Exception{ //1.创建对象流 FileInputStream fis = new FileInputStream("e:\\ccc.txt"); ObjectInputStream ois = new ObjectInputStream(fis); //2.反序列化,即读取操作 Student s = (Student) ois.readObject(); //3.关闭 ois.close(); System.out.println("反序列化完毕!"); System.out.println(s.toString()); } }
字符流
文件字符流
-
FileReader:
-
public int read(char[] c)//从流中读取多个字符,将读到内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,则返回-1。
/** * 使用FileReader读取文件 */ public class FileReaderTest { public static void main(String[] args) throws Exception{ //1.创建FileReader 文件字符输入流 FileReader fr = new FileReader("e:\\hanzi.txt"); //2.读取 /*//2.1单个字符读取 int data = 0; while ((data = fr.read())!= -1){ System.out.print((char) data); }*/ //2.2 char[] buf = new char[1024]; int count = 0; while ((count = fr.read(buf))!=-1){ System.out.println(new String(buf,0,count)); } //3.关闭 fr.close(); } }
-
FileWriter:
-
public void write(String str)//一次写多个字符,将b数组中所有字符,写入输出流。
-
/** * 使用FileWriter写入文件 */ public class FileWriterTest { public static void main(String[] args) throws Exception{ //1.创建FileWriter对象 FileWriter fw = new FileWriter("e:\\hanzi.txt"); //2.写入 for (int i = 0; i < 10; i++) { fw.write("我爱你中国,亲爱的母亲,我为你流泪,也为你自豪!\r\n"); fw.flush(); } //3.关闭 fw.close(); System.out.println("执行完毕!"); } }
字符缓冲流
缓冲流:BufferedReader/BufferedWriter
-
高效读写
-
支持换行符
-
可一次写一行、读一行。
/** * 使用字符缓冲流BufferedReader读取文件 */ public class BufferedReaderTest { public static void main(String[] args) throws Exception{ //1.创建缓冲流 FileReader fr = new FileReader("e:\\wai.txt"); BufferedReader br = new BufferedReader(fr); //2.读取 //2.1第一种读取方式 //int count = 0; //char[] buf = new char[1024]; //while ((count = br.read(buf)) != -1){ // System.out.println(new String(buf,0,count)); //} //2.2第二种方式 String line = null; while ((line = br.readLine())!= null){ System.out.println(line); } //3.关闭 br.close(); } }
BufferedWriter
/** * 使用BufferedReader写入文件 */ public class BufferedWriterTest { public static void main(String[] args) throws Exception{ //1.创建BufferedReader对象 FileWriter fw = new FileWriter("e:\\wai.txt"); BufferedWriter bw = new BufferedWriter(fw); //2.写入 for (int i = 0; i < 10; i++) { bw.write("什么时候会有那么一天呢?"); bw.newLine(); bw.write("好难好难"); bw.flush(); } //3.关闭 bw.close(); System.out.println("执行完毕"); } }
PrintWriter
/** * 使用PrintWriter写入数据 */ public class PrintWriterTest { public static void main(String[] args) throws Exception{ //1.创建PrintWriter对象 PrintWriter pw = new PrintWriter("e:\\print.txt"); //2.写入数据 pw.println("我爱你中国"); pw.println(97); pw.println(true); pw.println(3.14); pw.println('a'); //3.关闭 pw.close(); System.out.println("执行完毕"); } }
转换流
桥转换流:InputStreamReader/OutputStreamWriter
-
可将字节流转换为字符流
-
可以设置字符的编码方式
/** * 使用InputStreamReader读取文件,指定使用的编码 */ public class InputStreamReaderTest { public static void main(String[] args) throws Exception{ //1.创建InputStreamReader对象 FileInputStream fis = new FileInputStream("e:\\writer.txt"); InputStreamReader isr = new InputStreamReader(fis, "utf-8"); //2.读取文件 int data = 0; while((data = isr.read())!= -1){ System.out.print((char) data); } //3.关闭 isr.close(); } }
/** * 使用OutputStreamWriter写入文件,并指定编码 */ public class OutputStreamWriterTest { public static void main(String[] args) throws Exception{ //1.创建OutputStreamWriter对象 FileOutputStream fos = new FileOutputStream("e:\\info.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos, "gbk"); //2.写入 for (int i = 0; i < 10; i++) { osw.write("埋骨何须桑梓地,人生何处不青山"); osw.flush(); } //3.关闭 osw.close(); System.out.println("执行完毕"); } }
file类
概念:代表物理磁盘上的一个文件或者文件夹。
方法:
-
createNewFile()//创建一个新文件
-
mkdir()//创建一个新目录
-
delete()//删除文件或空目录
-
exists()//判断File对象所对象所代表的对象是否存在
-
getAbsolutePath() //获取文件的绝对路径
-
getName ()//取得名字
-
getParent ()//获取文件/目录所在的目录
-
isDirectory()//是否是目录
-
isFile()//是否是文件
-
length()//获待文件的长度
-
listFiles()//列出目录中的所有内容
-
renameTo()//修改文件名为
/** * file类的使用 * (1)分隔符 * (2)文件操作 * (3)文件夹操作 */ public class FileTest { public static void main(String[] args) throws Exception{ //separator(); //fileope(); directoryOpe(); } public static void separator(){ System.out.println("路径分隔符"+ File.pathSeparator); System.out.println("名称分隔符"+File.separator); } //文件操作 public static void fileope() throws Exception{ //1.创建文件createNewFile() File file = new File("e:\\create.txt"); //System.out.println(file.toString()); if(!(file.exists())){ boolean newFile = file.createNewFile(); System.out.println("创建结果"+newFile); } //2.删除文件 //2.1直接删除 // System.out.println("删除结果"+file.delete()); //2.2使用jvm退出时删除 //file.deleteOnExit(); //Thread.sleep(5000); //3.获取文件信息 System.out.println("获取文件绝对路径"+file.getAbsolutePath()); System.out.println("获取路径"+file.getPath()); System.out.println("获取文件名"+file.getName()); System.out.println("获取父目录"+file.getParent()); System.out.println("获取创建时间"+new Date(file.lastModified()).toLocaleString()); //4.判断 System.out.println("是否可写"+file.canWrite()); System.out.println("是否是文件"+file.isFile()); System.out.println("是否隐藏"+file.isHidden()); } //文件夹操作 public static void directoryOpe()throws Exception{ //1.创建文件夹 File dir = new File("e:\\aa\\bb\\cc"); // System.out.println(dir.toString()); if(!dir.exists()){ //dir.mkdir();//只能创建单级目录 dir.mkdirs();//创建多级目录 } //2。删除文件 //2.1直接删除 // dir.delete();//只能删除空文件夹,而且只能删除最底层 //2.2使用jvm删除 //dir.deleteOnExit(); //Thread.sleep(5000); //3.获取文件夹信息 System.out.println("获取文件绝对路径"+dir.getAbsolutePath()); System.out.println("获取路径"+dir.getPath()); System.out.println("获取文件名"+dir.getName()); System.out.println("获取父目录"+dir.getParent()); System.out.println("获取创建时间"+new Date(dir.lastModified()).toLocaleString()); //4.判断 System.out.println("是否是文件夹"+dir.isDirectory()); System.out.println("是否隐藏"+dir.isHidden()); //5.遍历文件夹 File dir2 = new File("C:\\Users\\Lenovo\\Pictures\\壁纸"); String[] files = dir2.list(); System.out.println("===================="); for (String s : files) { System.out.println(s); } System.out.println("=========listFiles()的使用==============="); File[] files2 = dir2.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if(pathname.getName().endsWith(".jpg")){ return true; } return false; } }); for (File f : files2) { System.out.println(f.getName()); } } }
FileFilter接口
-
public interface FileFilter
-
boolean accept(File pathname)
-
当调用File类中的listFiles()方法时,支持传入FileFilter接口接口实现类,对获取文件进行过滤,只有满足条件的文件才可以出现在listFiles()的返回值中。
System.out.println("=========listFiles()的使用==============="); File[] files2 = dir2.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if(pathname.getName().endsWith(".jpg")){ return true; } return false; } }); for (File f : files2) { System.out.println(f.getName()); }