I/O流
一、什么是I/O流
I :Input
O:Output
通过I/O可以完成硬盘文件的读和写
二、I/O流的分类
1、按照流的方向进行分类:
以内存作为参照物: 。往内存中去: 叫做输入(lnput)。或者叫做读(Read)。 。从内存中出来: 叫做输出(Output)。或者叫做写(Write)。
2、按照 读取数据方式 不同进行分类: (1)按照 字节 的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位,文本文件,图片,声音文件,视频文件 等... 这种流是万能的,什么类型的文件都可以读取。包括:文本文件,图片,声音文件,视频文件 等...
例如: 假设文件file1.txt,采用字节流的话是这样读的! a中国bc张fe 第一次读: 一个字节,正好读到'a' 第二次读:一个字节,正好读到中”字符的一半。 第三次读:一个字节,正好读到中”字符的另外一半
(2)按照 字符 的方式读取数据的,一次读取一个字符 这种流是为了方便读取 普通文本文件 而存在的,这种流不能读取: 图片、声音、视频等文件。只能读取 纯文本文件,连word文件都无法读取。 注意: 纯文本文件,不单单是txt文件,还包括 .java、.ini、.py 。总之只要 能用记事本打开 的文件都是普通文本文件。
例如: 假设文件file1.txt,采用字符流的话是这样读的: a中国bc张=fe 第一次读:a字符 (a字符在windows系统中占用1个字节。) 第二次读:中字符(中字符在windows系统中占用2个字节。)
3、按照流的处理方式分类:
(1)直接处理流:
(2)间接处理流:
综上所述:流的分类:
输入流、输出流
字节流、字符流
直接处理流、间接处理流
三、File类的常用方法:
-
boolean exists() 判断文件或目录是否存在
-
boolean isFile() 判断是否是文件
-
boolean isDirectory() 判断是否是目录
-
String getPath() 返回此对象表示的文件的相对路径名
-
String getAbsolutePath() 返回此对象表示的文件的绝对路径名
-
String getName() 返回此对象表示的文件或目录的名称
-
boolean delete() 删除此对象指定的文件或目录
-
boolean createNewFile() 创建名称的空文件,不创建文件夹
-
long length() 返回文件的长度,单位为字节,如果文件不存在,则返回0
public class FileTest01 { public static void main(String[] args) { File f=new File("D:/123.txt"); System.out.println("文件绝对路径"+f.getAbsolutePath());//D:\123.txt System.out.println("文件是否存在"+f.exists());//true System.out.println("是否是文件"+f.isFile());//true System.out.println("是否是目录"+f.isDirectory());//false System.out.println("文件相对路径"+f.getPath());//D:\123.txt System.out.println("文件名"+f.getName());//123.txt try { if (f.createNewFile()){ System.out.println("创建成功"); }else{ System.out.println("文件已存在"); } } catch (IOException e) { e.printStackTrace(); } System.out.println("文件长度"+f.length());//45 } }
文件输出流
/**输出流,字节流,直接处理流 * @author Lx 写出 * @create 2024-03-05 21:19 */ public class FileOutputTest02 { public static void main(String[] args) throws IOException { File f=new File("D:/456.txt"); //输出流,true表示在f的基础上追加内容 OutputStream os=new FileOutputStream(f,true); //也可以写成以下形式,效果一样 //OutputStream os=new FileOutputStream("D:/456.txt",true);//直接对文件处理 for (int i = 1; i < 1000; i++) { //在文件中写入 os.write(i); } os.flush();//强制把半路的数据压入文件 os.close();//关闭流 } }
文件输入流
/**输入流,字节流,直接处理流 * @author Lx * @create 2024-03-06 14:53 */ public class FileInputTest03 { public static void main(String[] args) throws IOException { File f=new File("D:/456.txt"); //定义一个输入流接到文件中 InputStream is=new FileInputStream(f); //定义一个小桶用来装数据 byte [] b=new byte[1024]; //用read()方法把数据装入到小桶中,并计算出一桶里装多少个数据 int length=0; //System.out.println(length); //大于0则表示有数据 while((length=is.read(b))>0){ //把一桶数据存到str中 String str=new String(b,0,length); System.out.println(str); //再读下一桶数据 //length=is.read(b); System.out.println(length); } is.close(); } }
写出
/**输出流,字符流,直接处理流 * @author Lx * @create 2024-03-06 15:43 */ public class FileWriterTest0401 { public static void main(String[] args) throws IOException { Writer w = new FileWriter("D:/456.txt",true); /*for (int i = 1; i < 1000; i++) { w.write(i); }*/ char [] c="把这一段字符串放在数组中".toCharArray(); for (int i = 0; i < c.length; i++) { w.write(c[i]); } w.flush(); w.close(); } }
读入
/**输入流,字节流,直接处理流 * @author Lx * @create 2024-03-06 20:33 */ public class FileReaderTest05 { public static void main(String[] args) throws IOException { //定义一个输入流 Reader r=new FileReader("D:/456.txt"); //定义一只小桶 char[] c=new char[1024]; int length=r.read(c); while(length>0){ String str=new String(c,0,length); System.out.println(str); length=r.read(c); } r.close(); } }