File类的使用
-
java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关
-
想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
-
File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
-
常用构造器:
-
public File(String pathname) 以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
-
File file=new File("hello.txt"); //相对于module File file2=new File("F:hello.txt");//相对于根目录
- 绝对路径:是一个固定的路径,从盘符开始
- 相对路径:是相对于某个位置开始
-
public File(String parent,String child) 以parent为父路径,child为子路径创建File对象。
-
public File(File parent,String child) 根据一个父File对象和子文件路径创建File对象
-
-
常用方法:
- File类的获取功能:
- public String getAbsolutePath():获取绝对路径
- public String getPath() :获取路径
- public String getName() :获取名称
- public String getParent():获取上层文件目录路径。若无,返回null
- public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
- public long lastModified() :获取最后一次的修改时间,毫秒值
- public String[] list() :获取指定目录下的所有文件或者文件目录的名称数组
- public File[] listFiles() :获取指定目录下的所有文件或者文件目录的File数组
- File类重命名功能:
- public boolean renameTo(File dest):把文件重命名为指定的文件路径
- File类的判断功能:
- public boolean isDirectory():判断是否是文件目录
- public boolean isFile() :判断是否是文件
- public boolean exists() :判断是否存在
- public boolean canRead() :判断是否可读
- public boolean canWrite() :判断是否可写
- public boolean isHidden() :判断是否隐藏
- File的创建功能
- public boolean createNewFile() :创建文件。若文件存在,则不创建,返回false
- public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
- public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建
- File类的删除功能
- public boolean delete():删除文件或者文件夹
- File类的获取功能:
-
File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成
-
后续File类的对象长会作为参数传递到流的构造器中,指明读取或写入的“终点”。
IO流原理及流的分类
-
IO流原理:
- I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
- Java程序中,对于数据的输入/输出操作以**“流****(stream)****”** 的方式进行。
- java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据
-
流的分类
-
按操作数据单位不同分为:字节流 (8 bit),字符流(16 bit)
-
按数据流的流向**不同分为:**输入流,输出流
-
按流的角色的不同分为: 节点流,处理流
-
(抽象基本类) 字节流 字符流 输入流 InputStream Reader 输出流 OutputStream Writer
-
-
字符流:
-
读hello.txt文件下的内容
-
实例化File类的对象,指向要读取的文件
-
提供具体的流
-
数据的读入
-
关闭流
-
public static void main(String[] args) { //1. 实例化File的对象,指向需要读的文件的位置 File file=new File("IO\\hello.txt"); System.out.println(file.getAbsolutePath()); //2.实例化具体的流 try { FileReader read=new FileReader(file); //3.数据的读入 int data = read.read(); //read();返回一个读入的字符如果到达文件末尾返回-1; while(data!=-1){ System.out.print((char)data); data=read.read(); } read.close(); } catch (IOException e) { e.printStackTrace(); } }
-
-
从内存中写出数据到硬盘的文件里
-
实例化File类的对象,指向要读取的文件
-
提供具体的流
-
数据的写入
-
关闭流
-
public static void main(String[] args) { FileWriter fileWriter=null; //1.实例化File类,指明文件位置 File file=new File("IO\\hello1.txt"); //2.提供FileWrite的对象,用于数据的写入 try { fileWriter=new FileWriter(file); fileWriter.write("I have a dream\n"); fileWriter.write("I also have a dream"); } catch (IOException e) { e.printStackTrace(); }finally { if(fileWriter!=null){ try { fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } }
-
输出操作,对应的File可以不存在的。
-
如果不存在,在输出的过程中,会自动创建此文件
-
fileWriter=new FileWriter(file,false);//覆盖 fileWriter=new FileWriter(file,true);//追加
-
-
-
字节流
-
对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
-
对于非文本文件使用字节流处理
-
使用字节流处理文本文件可能出现乱码
-
读取文件
-
//1.建立一个流对象,将已存在的一个文件加载进流。 FileReader fr = new FileReader(new File(“Test.txt”)); //2.创建一个临时存放数据的数组。 char[] ch = new char[1024]; //3.调用流对象的读取方法将流中的数据读入到数组中。 fr.read(ch); //4. 关闭资源。 fr.close();
-
-
写入文件:
-
//1.创建流对象,建立数据存放文件 FileWriter fw = new FileWriter(new File(“Test.txt”)); //2.调用流对象的写入方法,将数据写入流 fw.write(“atguigu-songhongkang”); //3.关闭流资源,并将流中的数据清空到文件中。 fw.close();
-
缓冲流
- 缓冲流
- BufferedInputStream
- BufferedOutputStream
- BufferedReader
- BufferedWriter
- 作用:提供流的读取、写入的速度 提高读写速度的原因,内部包含一个缓冲区
- 当使用BufferedInputStream读取字节文件时,BufferedInputStream会一次性从文件中读取8192个(8Kb),存在缓冲区中,直到缓冲区装满了,才重新从文件中读取下一个8192个字节数组。
- 向流中写入字节时,不会直接写到文件,先写到缓冲区中直到缓冲区写满BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法flush()可以强制将缓冲区的内容全部写入输出流
- 如果是带缓冲区的流对象的close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区,关闭后不能再写出
转换流
-
转换流:
- InputStreamReader:将一个字节输入流转换为字符的输入流
- OutputStreamWriter:一个字符的输出流转换为字节的输出流
-
public static void main(String[] args) { FileInputStream file=null; InputStreamReader trans=null; try { file=new FileInputStream("IO\\hello.txt"); trans=new InputStreamReader(file,"UTF-8"); char[] chars=new char[5]; int len; while((len=trans.read(chars))!=-1){ String str=new String(chars,0,len); System.out.print(str); } } catch (IOException e) { e.printStackTrace(); }finally{ if(trans!=null){ try { trans.close(); } catch (IOException e) { e.printStackTrace(); } } if(file!=null){ try { file.close(); } catch (IOException e) { e.printStackTrace(); } } } }
标准输入输出流
- System.in和System.out分别代表了系统标准的输入和输出设备
- 默认输入设备是:键盘,输出设备是:显示器
- System.in的类型是InputStream
- System.out的类型是PrintStream,其是OutputStream的子类
- FilterOutputStream 的子类
- 重定向:通过System类的setIn,setOut方法对默认设备进行改变。
- public static void setIn(InputStream in)
- public static void setOut(PrintStream out)
- 重定向:通过System类的setIn,setOut方法对默认设备进行改变。
打印流
- 实现将基本数据类型的数据格式转化为字符串输出
- 打印流:PrintStream和PrintWriter
- 提供了一系列重载的print()和println()方法,用于多种数据类型的输出
- PrintStream和PrintWriter的输出不会抛出IOException异常
- PrintStream和PrintWriter有自动flush功能
- PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。
- 在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。
- System.out返回的是PrintStream的实例
数据流
- 为了方便地操作Java语言的基本数据类型和String的数据,可以使用数据流。
- 数据流有两个类:(用于读取和写出基本数据类型、String类的数据
- DataInputStream 和 DataOutputStream
- 分别“套接”在* InputStream 和 OutputStream 子类的流上
- DataInputStream****中的方法
- boolean readBoolean()
- byte readByte()
- char readChar()
- float readFloat()
- double readDouble()
- short readShort()
- long readLong()
- int readInt()
- String readUTF() void readFully(byte[] b)
- DataOutputStream****中的方法
- 将上述的方法的read改为相应的write即可。
- 注意点:读取不同类型的数据的顺序要与当初写入文件时,保存的数据的顺序一致
对象流
- 对象流:ObjectInputStream和ObjectOutputStream
- 作用:用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
- 序列化:
- 序列化:用ObjectOutputStream类保存基本类型数据或对象的机制
- 反序列化:用ObjectInputStream类读取基本类型数据或对象的机制
- ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
- 序列化的要求
- 需要实现接口:Serializable
- 当前类提供一个全局常量:serialVersionUID
- 除了当前类需要实现Serializable接口之外,还必须保证其内部所有属性也必须是可序列化的。(默认情况下,基本数据类型可序列化)
随机存取文件流
- RandomAccessFile 类
- 构造器
- public RandomAccessFile(File file, String mode)
- public RandomAccessFile(String name, String mode)
- 创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定 RandomAccessFile 的访问模式:
- r: 以只读方式打开
- rw:打开以便读取和写入
- rwd:打开以便读取和写入;同步文件内容的更新
- rws:打开以便读取和写入;同步文件内容和元数据的更新
- 如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。 如果模式为rw读写。如果文件不存在则会去创建文件,如果存在则不会创建。
- 构造器
- RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口
- RandomAccessFile既可以作为一个输入流,又可以作为一个输出流
- 如果RandomAccessFile作为输出流时,谢楚道的文件如果不存在,则在执行过程中自动创建,如果写出到文件存在,则会对原有文件进行覆盖。默认情况下,从头覆盖