1.1、概念

开发中经常要进行输入输出操作,掌握Java中的IO流显得非常必要。

流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。

一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。

流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。

实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。

形象的比喻——水流 ,文件======程序,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出。便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序

Java流操作有关的类或接口:

JavaSE学习总结(十七)—— IO流

Java IO流的结构图:

JavaSE学习总结(十七)—— IO流

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

 

1.2、IO流的分类

根据处理数据类型的不同分为:字符流和字节流

根据数据流向不同分为:输入流和输出流

1.2.1、字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别:

读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。

1.2.2、输入流和输出流

对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

 JavaSE学习总结(十七)—— IO流

二、File类

2.1、简介

File类是io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建、删除、重命名文件等。File类的对象主要用来获取文件本身的一些信息,如文件所在目录、文件的长度、文件读写权限等。数据流可以将数据写入到文件中,而文件也是数据流最常用的数据媒体。

提供定位本地文件系统、描述文件和目录的功能

是 java.io 包中引用实际磁盘文件的唯一对象

File类对象描述文件路径、名字、长度、可否读写等属性,可用来命名文件、查询文件属性和处理目录,但不读写文件。

解决程序与文件系统的沟通

各种文件系统提供的基本服务一样,但实现细节互不兼容

JavaSE学习总结(十七)—— IO流

 

构造函数

File(String pathname);
File(String dir, String subpath);
File(File dir, String subpath);

File(String path)  
文件(相对路径),移植性较好: File  f1 = new  File(“mydir\\myfile.txt”);
目录(绝对路径): File  f2 = new  File(“d:\\mydir\\dir1”);
File(String parent, String child )
文件路径以及文件名: File f3 = new File(“d:\\d1” , “a.java”)
File(File dir, String name)
文件对象与文件名:File  f4 = new  File(f2 , “myfile.txt”);

常用方法
canRead()、canWrite()、delete()、equals(object)、exists() getAbsolutePath() 和 length()

方法 描述
String   getName() 获取文件的名称
boolean  canRead() 判断文件是否是可读的
boolean  canWrite() 品判断文件是否可被写入
boolean  exits() 判断文件长度是否存在
int  length() 获取文件的长度(以字节为单位)
String  getAbsolutePath() 获取文件的绝对路径
String  getParent() 获取文件的父路径
boolean  isFile() 判断此抽象路径名表示的文件是否为普通文件
boolean  isDirectory() 判断此抽象路径名表示的是否是一个目录
boolean  isHidden 判断文件是否是隐藏文件
long  lastModified() 获取文件最后修改时间
Boolean  canExecute()
测试应用程序是否可以执行此抽象路径名表示的文件。 
boolean  createNewFile() 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。
boolean  delete() 删除由此抽象路径名表示的文件或目录。
File[]  listFiles()  返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
String[]  list() 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
boolean  mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。可创建多层文件包
boolean  mkdir() 创建由此抽象路径名命名的目录。只能创建一层文件包
boolean  reNameTo(File dest) 重命名由此抽象路径名表示的文件。
boolean  setReadOnly()
标记由此抽象路径名命名的文件或目录,以便只允许读取操作。 
boolean  setWritable(boolean  writable)
一种方便的方法来设置所有者对此抽象路径名的写入权限。

2.2、文件操作示例

 创建与删除文件:

package com.io;

import java.io.File;
import java.io.IOException;

public class IODemo1 {

    public static void main(String[] args) throws IOException {
        File file=new File("d:"+File.separator, "file1.txt");
        if(file.exists()){
            file.delete();
            System.out.println("删除成功!");
        }else{
            file.createNewFile();
            System.out.println("创建成功!");
        }
    }
}

 常见文件操作:

package com.file;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class IODemo1 {

    public static void main(String[] args) throws IOException {
        //创建方法
/*        @SuppressWarnings("unused")
        File file = new File("F:\\a.txt");
        //System.out.println("创建成功了吗?"+file.createNewFile());
        //System.out.println("单级文件夹创建成功了吗?"+file.mkdir());
        //System.out.println("多级文件夹创建成功了吗?"+file.mkdirs());
        //File dest = new File("F:\\电影\\c.txt");
        //System.out.println("重命名成功了吗?"+file.renameTo(dest));
*/
        
/*      //删除方法
        File file = new File("F:\\电影");
        System.out.println("删除成功了吗?"+file.delete());
        file.deleteOnExit();
*/
        
        //判断方法
/*        File file = new File("F:\\a.txt");
        System.out.println("文件或者文件夹存在吗?"+file.exists());
        System.out.println("是一个文件吗?"+file.isFile());
        System.out.println("是一个文件夹吗?"+file.isDirectory());
        System.out.println("是隐藏文件吗?"+file.isHidden());
        System.out.println("此路径是绝对路径名?"+file.isAbsolute());
*/
        
        //获取方法
/*
         File file = new File("f:\\a.txt");
        System.out.println("文件或者文件夹得名称是:"+file.getName());
        System.out.println("绝对路径是:"+file.getPath());
        System.out.println("绝对路径是:"+file.getAbsolutePath());
        System.out.println("文件大小是(以字节为单位):"+file.length());
        System.out.println("父路径是"+file.getParent());
        //使用日期类与日期格式化类进行获取规定的时间
        long  lastmodified= file.lastModified();
        Date data = new Date(lastmodified);
        SimpleDateFormat simpledataformat = new SimpleDateFormat("YY年MM月DD日 HH:mm:ss");
        System.out.println("最后一次修改的时间是:"+simpledataformat.format(data));
*/
        
        //文件或者文件夹的方法

        File[] file = File.listRoots();
        System.out.println("所有的盘符是:");
        for(File item : file){
            System.out.println("\t"+item);
        }
        File filename =new File("F:\\Java workspace\\Java");
        String[] name = filename.list();
        System.out.println("指定文件夹下的文件或者文件夹有:");
        for(String item : name){
            System.out.println("\t"+item);
        }
        File[] f = filename.listFiles();
        System.out.println("获得该路径下的文件或文件夹是:");
        for(File item : f){
            System.out.println("\t"+item.getName());
            }

        }
}
View Code

相关文章: