File类
• 一个File类的对象可以表示一个具体的文件或目录
• File对象可以对文件或目录的属性进行操作,如:文件名、最后修改日期、文件大小等.
• File对象无法操作文件的具体数据,即不能直接对文件进行读/写操作.
//指明详细的路径以及文件名,请注意双斜线或用反斜杠 File f1 = new File("E:/IO.txt");//表示IO.txt文件 //指明详细的路径以及目录名,请注意双斜线 File f2 = new File("E:\\Java");//表示Java目录 //创建多级目录(文件夹) File f =new File("E:\\package\\package1\\package2\\package3"); f.mkdirs();
○ File类的常用方法:
( delete删除一个文件夹时,文件夹中必须是空的 )
○ 代码展示:
● 我们首先在E盘中创建一个 IO.txt 文件
----(左下角显示文件为14字节)
● 接下来让我们对其进行测试
public static void main(String[] args) { File f1 = new File("E:/IO.txt"); //判断该文件是否存在 System.out.println(f1.canExecute());//true //是否可读 System.out.println(f1.canRead());//true //是否可写 System.out.println(f1.canWrite());//true //得到完整地址 System.out.println(f1.getAbsolutePath());//E:\IO.txt //得到文件名 System.out.println(f1.getName());//IO.txt //得到目录 System.out.println(f1.getParent());//E:\ //判断是否为目录 System.out.println(f1.isDirectory());//false //是否为隐藏文件 System.out.println(f1.isHidden());//false //文件创建时间 System.out.println(f1.lastModified());//1710659923057 System.out.println(new Date(1710639860957L));//[Sun Mar 17 09:41:02 CST 2024] //文件长度(字节) System.out.println(f1.length());//14 }
( 我们可以在文件属性中对其更改再测试 )
输入及输出的概念
• 输入和输出是一个相对概念,输入和输出是相对于我们的程序
○ 输入---Input
- 把电脑硬盘上的数据读到程序中,称为输入,即input,进行数据的read操作
○ 输出---Output
- 从程序往外部设备写数据,称为输出,即output,进行数据的write操作
输入流与输出流
- java中把用于对文件输入和输出的类称为流.
- 输入流:往程序中读叫输入流。
- 输出流:从程序中往外写叫输出流。
- InputStream和OutputStream的子类都是字节流, 可以读写二进制文件,主要处理音频、图片、歌曲;字节流处理单元为1个字节。
○ 首先们在D盘中创建一个ddd.docx文件(9.86KB),再在E盘中创建一个eee.docx文件(空)
○ 代码实现:
public static void main(String[] args) throws IOException { FileInputStream inputStream1 =new FileInputStream("D:/ddd.docx");//输入流 FileOutputStream outputStream1 =new FileOutputStream("E:/eee.docx");//输出流 int a =0 ; while((a=inputStream1.read())!=-1){//只要a!=-1说明还未读完 outputStream1.write(a);//写内容(以字节为单位) } //关闭通道,否则文件一直处于打开(占用)状态 inputStream1.close(); outputStream1.close(); }
○ 运行程序,可以发现我们成功将ddd.docx文件内容写到了eee.docx文件中 ( 0字节➝9.86KB )
○ 注意:
每次读写完后记得关闭通道,否则则文件一直处于打开(占用)状态.
○ 高效文件读写:
创建一个byte数组,一次读byte数组长度个字节,便于提高读写效率。
public static void main(String[] args) throws IOException { FileInputStream inputStream =new FileInputStream("D:/demo1.txt"); FileOutputStream outputStream=new FileOutputStream("E:/IO.txt"); byte[] bytes =new byte[10]; //read(bytes) 一次读byte数组长度个字节,文件内容读取完后返回-1 //size:每次实际往数组中装入的元素的个数 int size =0; while((size=inputStream.read(bytes))!=-1){ //一次向外写出一个byte数组长度个字节内容,从指定位置开始写,写size个 outputStream.write(bytes,0,size); } inputStream.close(); outputStream.close(); }
输入输出节点字节流
● InputStream的基本方法
- 读取一个字节并以整数的形式返回(0~255),如果返回-1已到输入流的末尾。
- int read() throws IOException
- 读取一系列字节并存储到一个数组buffer, 返回实际读取的字节数,如果读取前已到输入流的末尾返回-1
- int read(byte[] buffer) throws IOException
- 关闭流释放内存资源
- void close() throws IOException
OutputStream的基本方法
- 向输出流中写入一个字节数据,该字节数据为参数b的低8位
- void write(int b) throws IOException
- 将一个字节类型的数组中的从指定位置(off)开始的 len个字节写入到输出流
- void write(byte[] b, int off, int len) throws IOException
- 关闭流释放内存资源
- void close() throws IOException
我们把流按照数据的传输方向分为输入流和输出流;流也可以从数据编码格式上划分为字节流和字符流;根据封装类型不同流又分为节点流和处理流。
字节流与字符流
○ 字节流:读取时以字节为单位,可以读取任意文件
○ 字符流:读取时以字符为单位,只能读取文本文件
● 字节流中常用类:
字节输入流 FileInputStream
字节输出流 FileOutputStream
● 字符流中常用类:
字符输入流 FileReader
字符输出流 FileWriter
- InputStream和OutputStream的子类都是字节流 可以读写二进制文件,主要处理音频、图片、歌曲、字节流处理单元为1个字节。
- Reader和Writer的子类都是字符流, 主要处理字符或字符串,字符流处理单元为1个字符。
节点流与处理流
● 按封装类型,流又分为:
节点流:直接封装的是文件,数据.
处理流:封装的是其他节点流对象;可以提供缓冲功能,提高读写效率.
● 节点流中常用类:
字节输入流 FileInputStream
字节输出流 FileOutputStream
字符输入流 FileReader
字符输出流 FileWriter
● 处理流中常用类:
缓冲字节输出流 BufferedOutputStream
缓冲字节输入流 BufferedInputStream
缓冲字符输入流 BufferedReader
缓冲字符输出流 BufferedWriter
代码演示:
public static void main(String[] args) throws IOException { FileInputStream inputStream = new FileInputStream("D:/demo1.txt"); //封装的是一个节点流对象,可以提供缓冲功能,称为处理流/包装流 BufferedInputStream bufferedInputStream =new BufferedInputStream(inputStream,20); FileOutputStream outputStream =new FileOutputStream("E:/IO.txt"); BufferedOutputStream bufferedOutputStream =new BufferedOutputStream(outputStream,20); int size =0; byte[] bytes =new byte[10]; while ((size=bufferedInputStream.read(bytes))!=-1){ bufferedOutputStream.write(bytes,0,size); } bufferedInputStream.close(); bufferedOutputStream.close(); }
缓存区流底层代码:
对象输入输出流 会在(三)中讲到