流:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象。
流的本质:数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
作用:为数据源和目的地建立一个输送通道
Java IO所采用的模型 Java的IO模型设计非常优秀,它使用Decorator[ˈdekəreɪtə(r)](装饰者)模式,按功能划分Stream[striːm]英[striːm]美,您可以动态装配这些Stream,以便获得您需要的功能。
例如,您需要一个具有缓冲的文件输入流,则应当组合使用FileInputStream(字符流)和BufferedInputStream(字节流)。
- 输入流: 只能从中读取数据,而不能向其写入数据。
- 输出流:只能向其写入数据,而不能向其读取数据。
字节流和字符流的用法几乎完成全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的单元是数据单元是8位的字节,字符流操作的是数据单元为16位的字符。
在整个Java.io包中最重要的就是5个类和一个接口。
5个类指的是File、OutputStream、InputStream、Writer、Reader;
一个接口指的是Serializable(序列化)。掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了。
File是一个标准的文件类 File类对象对应于文件系统中的一个目录或文件 File类对象描述文件路径、名字、长度、可否读写等属性,可用来命名 文件、查询文件属性或处理目录,但不能读写文件。
file.separator;//为系统的目录符号/或\ pathSeparator;//为系统的分隔符; exists();//判断是否存在这个文件 isFile();//判断是文件 isDirectory();//判断是目录 getName();//文件名 getPath();//整个路径名/相对路径名 length();//文件长度(大小) canRead();//文件读的属性 canWrite();//文件写的属性 getAbsolutePath();//获得文件路径,如果是相对路径根据项目路径补充完整 lastModified();//最后一次修改时间
测试编码:
package IO_test; import java.io.File; /** * @author laoshifu * @date 2021年11月28日 */ public class Action { public static void main(String[] args) { File file=new File("E:/"); System.out.println(file.separator);//为系统的目录符号/或\ System.out.println(file.pathSeparator);//为系统的分隔符; System.out.println(file.exists());//判断是否存在这个文件 System.out.println(file.isFile());//判断是文件 System.out.println(file.isDirectory());//判断是目录 System.out.println(file.getName());//文件名 System.out.println(file.getPath());//整个路径名/相对路径名 System.out.println(file.length());//文件长度(大小) System.out.println(file.canRead());//文件读的属性 System.out.println(file.canWrite());//是否可写 //获得文件路径,如果是相对路径根据项目路径补充完整 System.out.println(file.getAbsolutePath()); System.out.println(file.lastModified());//最后一次修改时间 System.out.println(file.getPath());//整个路径名/相对路径名 } }
效果:
renameTo(new File);重命名 delete();删除目录 mkdir();创建目录 mkdirs();创建多层目录 createNewFile();创建新文件
测试编码:
package IO_test; import java.io.File; import java.io.IOException; /** * @author laoshifu * @date 2021年11月28日 */ public class Action { public static void main(String[] args) { //重命名 File file=new File("E:/test/demo.txt"); file.renameTo(new File("E:/test/demo1.txt")); //创建单层目录 File fileMk=new File("E:/test/demo"); fileMk.mkdir(); //创建多层目录 File fileMks=new File("E:/test/demo/a/b/c/d/e/f/g"); fileMks.mkdirs(); //删除目录 File delDir=new File("E:/test/demo/a/b/c/d/e/f/g"); delDir.delete(); //创建文件 File fileCreate=new File("E:/test/demo/file.txt"); try { fileCreate.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } }
效果:
1、字符流处理数据的基本单位是( A )。 A、2字节 B、1字节 C、1024字节 D、1024B 2、现有一篇中文的文章为.txt文件,我们应该使用哪种流操作( B ),因为( D )。 A、字节流 B、字符流 C、字节流每次都读取一个字节,任何文件都能操作 D、由于是中文,一个中文占2个字符,用字节流去读会出现乱码,所以采用字符流。每次去读2个字符,不会出现编码错误。 3、file.getPath()与file.getAbsolutePath()的说法正确的是(多选)( BD )。 A、getPath一定返回文件的绝对位置 B、getAbsolutePath一定返回文件的绝对位置 C、默认相对路径返回结果相同 D、默认绝对路径返回结果相同
//需要的包 import java.io.File; import java.util.Arrays; //编码 File f = new File("E:/"); String []s = f.list(); System.out.println(Arrays.toString(s)); //获得E盘下面所有文件的路径: File [] files = f.listFiles(); System.out.println(Arrays.toString(files)); //获取系统盘符 File [] files1 = File.listRoots(); System.out.println(Arrays.toString(files1));
为什么用字符流读取文本文件:
1、由于每个中文占用空间为2字节,故而使用字节流读取会产生乱码
2、每个中文占2字节,与char大小相同,所有的中文均与某个char值相对应
纯文本的读取,步骤:
1.建立联系 file对象
2.选择流: Reader FileReader
3.读取:char[] flush=new char[1024];//或逐一读取
4.关闭资源 fr.close()
字节流读取文件VS字符流读取纯文本
1.使用流不同,前者使用“stream”后者是“reader”
2.读取使用数组不同,前者是byte数组,后者是char数组
3.速度不同,后者速度要比前者快
编码示例:
package IO_test; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; /** * @author laoshifu * @date 2021年11月28日 */ public class Action { public static void main(String[] args) { FileReader fr = null; try { fr = new FileReader(new File("E:/test/demo1.txt")); int read=fr.read(); System.out.println((char)read); } catch (IOException e) { e.printStackTrace(); } } }
效果:
编码示例:
package IO_test; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; /** * @author laoshifu * @date 2021年11月28日 */ public class Action { public static void main(String[] args) { FileReader fr = null; try { fr = new FileReader(new File("E:/test/demo1.txt")); while (true) { int read = fr.read(); if (read == -1) { break; } System.out.print((char) read); } } catch (IOException e) { e.printStackTrace(); } } }
执行效果:
编码示例:
package IO_test; import java.io.*; /** * @author laoshifu * @date 2021年11月28日 */ public class Action { public static void main(String[] args) throws IOException { FileWriter fw= null; try { fw = new FileWriter(new File("E:/test/demo1.txt")); fw.write("I HAVE A GOOD IDEA!"); } catch (IOException e) { e.printStackTrace(); }finally { fw.flush();//刷新,写完必须刷一下 fw.close(); } //每次可以写入一个字符串, //统一写完之后需要刷新将数据写入到对应文件,并清空缓存区 //读完要关闭,fw.close();一般在finally中写 } }
1、FileReader fr读取的是一个文件还是一个字符串( A )。 A、文件 B、字符串 2、字符流的FileWriter在write某个字符串之后一定要执行哪个函数才能将数据写进对应的文件( B )。 A、writed() B、flush() C、wait() D、closes() 3、FileWriter中flush函数的作用是( B )。 A、刷新缓冲区的数据 B、清空缓冲区并完成文件写入操作 C、关闭写入流 D、重新开启缓冲区
将某文件夹下的文件单独复制一份,并在同一个文件夹内重新修改名称后粘贴一份。
1、读取源文件。
2、通过FileReader逐一读取。
3、通过FileWriter将逐一读取的字符流写入到预先给予的位置上。
4、关闭写入流、关闭读取流。
编码示例:
package IO_test; import java.io.*; /** * @author laoshifu * @date 2021年11月28日 */ public class Action { public static void main(String[] args) throws IOException { FileReader fr = new FileReader(new File("E:/test/demo1.txt")); FileWriter fw = new FileWriter(new File("E:/test/demo2.txt")); int i = 0; char[] geshu = new char[10]; while (true) { i = fr.read(geshu); if (i == -1) { break; } fw.write(geshu, 0, i);fw.write(i); } fw.flush();//里面慢,外面快 } }
效果如下:
1、使用Java IO流实现对文本文件的读写过程中,需要处理下列( B )异常。 A、ClassNotFoundException B、IOException C、SQLException D、RemoteException 2、在Java的IO操作中,( D )方法可以用来刷新流的缓冲。 A、void release() B、void close() C、void remove() D、void flush() 3、下列对于FileReader fr=new FileReader("url.txt")方法的返回值正确的( B )。 A、String str=fr.read(); B、int str=fr.read(); C、byte str=fr.read(); D、char str=fr.read();
IO:数据从硬盘流向内存(Input),或者从内存流向硬盘(Output)。
按操作数据单元分:
字节流、字符流
|-字节流:8位
|-字符流:16位
可以操作所有文件,包括文本文件、视频、音频、压缩文件等等都可以用字节流读写。
字节流 | 字符流 | |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
编码示例:
package IO_test; import java.io.*; /** * @author laoshifu * @date 2021年11月28日 */ public class Action { public static void main(String[] args) throws IOException { FileInputStream fis = null;FileOutputStream fos = null; try {//将文件复制一份到同一文件夹下,并更换名称 fis = new FileInputStream(new File("E:\\test\\DoodDB.sql")); fos = new FileOutputStream(new File("E:\\test\\DoodDB1.sql")); byte[] buf = new byte[1024];//每次读取1024的字节(1024b) while (true) { int i = fis.read(buf); if (i == -1) {break;}//当读取不到时,结束循环 fos.write(buf, 0, i);//每次将读取的1024b存储到写入的缓冲区 } fos.flush();//清空缓冲区,将内容写到新文件内 fos.close();fis.close();//关闭读取写入流 }catch (Exception e) { e.printStackTrace(); } } }
效果:
1、数据从硬盘流向内存( A ),或者从内存流向硬盘( D )。 A、Input B、Read C、Write D、Output 2、字节流不善于操作的文件是( B )。 A、图片 B、中文文本 C、视频 D、音乐 3、下列函数那些不是FileOutputStream的write函数的重载方法 ( D )。 A、write(byte[]b) B、write(int b) C、write(byte[]b,int off,int len) D、write(byte b,int len)
以上为【Java_IO】的常用所有内容,希望能对大家有所帮助,但是有一些【服务器】容易出现的异常,由于复现麻烦,故而并未汇总。
例如:【IO流文件的相对路径及获取系统路径方法_红目香薰-CSDN博客】
希望能大家有所帮助,可以收藏,价值较高。