【常用API】之IO流

IO(Input Output)输入输出操作。

包:import java.IO.*;

主要针对当前电脑的物理磁盘,进行目录或文件的创建,删除,读写等等操作。


流:Stream
数据在数据源与程序之间,所经历的一个路径。
以程序为主:
程序--->数据源: 输出流 OutputStream
数据源--->程序: 输入流 InputStream


重要的对象:

File类
针对路径和文件操作的


数据操作对象:
针对文件中数据内容读写操作的。(;流Stream)


分类:

基础流:按照单个字符进行操作,一个个操作。
高层流:会创建缓冲区域,可以一次性操作数据,
必须建立在 基础流之上。


字节:按照字节操作 --- 速度快,不支持特殊字符,比如中文
字符:按照独立字符操作 --- 速度慢,支持所有的特殊字符

输入:程序读取文件
输出:程序写文件


流 Stream:

基础:
FileInputStream 字节-输入流
FileOutputStream 字节-输出流
FileReader 字符-输入流
FileWriter 字符-输出流

高层:
BufferedInputStream 缓冲-字节-输入流
BufferedOutputStream 缓冲-字节-输出流
BufferedReader 缓冲-字符-输入流
BufferedWriter 缓冲-字符-输出流

所有的流对象 Stream,在文件操作完毕后,必须执行:close(),关闭。

输入流不关闭:文件挂起。

输出流不关闭:容易导致文件没有写入结尾,破损文件。


--File_路径与文档操作

package com.xzm.test;

//导入IO流操作的依赖包文件
import java.io.*;


public class _01_File_路径与文档操作 {

    public static void main(String[] args) {
        
        // File类:
        // 针对物理磁盘的目录(文件夹)和文件进行创建,删除,重命名等操作的
        
        
        
        //实例化创建文档对象
        //必须参数化构造方法,指定路径,文件,后缀
        
        //【目录】
        File f = new File("C:/aaa");
        
        //判断指定的对象,是否是一个目录(有没有)
        if( f.isDirectory() )
        {
            System.out.println("是的,存在的。");
        }
        else
        {
            System.out.println("不是,不存在。");
        }
        
        //如果不是目录,
        if(!f.isDirectory()) {
            //创建它
            if( f.mkdirs() ) {
                System.out.println("创建成功!");
            }
            else {
                System.out.println("无法操作或无权限,请联系管理员!");
            }
            
        }
        
        
        //判断目录或文件是否是存在
        if( f.exists() ) {
            System.out.println("存在的");
        }
        else {
            System.out.println("不存在");
        }
        
        //===============================================
        
        //【文件】
        // 默认只能读写操作记事本可以操作的文件类型
        // 特殊文件格式,需要下载导入特定的扩展包:word
        File ff = new File("C:/aaa/aaa.txt");
        
        
        //判断是否存在,是不是文件
        if( ff.exists() ) {
            System.out.println("存在");
        }
        else {
            System.out.println("不存在");
        }
        
        if( ff.isFile() ) {
            System.out.println("是-存在");
        }
        else {
            System.out.println("不是-不存在");
        }
        
        
        //没有就创建
        if(!ff.isFile()) {
            try {
                ff.createNewFile();
            } catch (IOException e) {
                //写文件失败:【无权限】
                e.printStackTrace();
            }
        }
        
        
        //针对文件:重命名+剪切。
        //第一步:创建新文档
        File newF = new File("C:/aaa/12345.txt");
        ff.renameTo(newF);
        
        
        //获取各种参数:【目录】【文件】
        System.out.println("名称:" + ff.getName());
        
        System.out.println("相对路径:" + ff.getPath());
        
        System.out.println("路径:" + ff.getAbsolutePath());
        
        System.out.println("大小:" + ff.length()+"kb");
        
        System.out.println("最后修改日期:" + ff.lastModified()+"时间戳");
        
        
        //=========================================================
        
        //删除目录
        // f:目录,  ff:文件
        
        //要删除目录,目录必须是空的
        if( f.delete() ) {
            System.out.println("删除成功!");
        }
        else {
            //没有对应的内容才可以删除
            System.out.println("失败,目录不是空的!");
        }
        
        
        if( ff.delete() ) {
            System.out.println("删除成功!");
        }
        else {
            System.out.println("失败 - 文件被挂起!");
        }
        
        
        

    }

}

----File遍历目录

package com.xzm.test;

import java.io.File;
import java.util.Scanner;

public class _03_File_遍历目录 {

    public static void main(String[] args) {
        
        //实例化对象,指定目标
        File f = new File("C:/aaa");
        
        //调用方法 .listFiles(),返回一个File对象的数组
        //就是当前指定目标下的内容
        File[] list = f.listFiles();
        
        //循环遍历
        for(File item : list) 
        {
            //目录
            if(item.isDirectory()) {
                System.out.print("目录---");
            }            
            //文件
            if(item.isFile()) {
                System.out.print("文件---");
            }    
            //名称
            System.out.println(item.getName());
        }
        
        //==================================================
        //自定义代码,递归遍历整个指定的目录下所有内容
        
        //跨越操作系统,直接操作物理磁盘的
        //因此,Windows系统设置的隐藏效果等,
        //只是Windows的一个标识,不显示而已,
        //对于这里的代码,无效的。
        
        
        
        //第一步:创建File对象,指定目标
        //          目标是一个字符串,可以由用户输入的
        System.out.print("请输入目标:");
        File dir = new File(new Scanner(System.in).next());
        
        //第二步:调用递归方法,传入目标源
        digui(dir);
    }

    
    //递归函数
    public static void digui(File dir) {
        
        //获取传入对象下的列表
        File[] list = dir.listFiles();
        
        //迭代循环
        // 里面的异常处理,是跨过受保护的文件,不允许读取预览的
        for(File item : list)
        {
//            try {
                //目录
                if(item.isDirectory()) {
                    //输出信息,
                    System.out.println("目录---"+item.getName());
                    //递归继续找下一级
                    digui(item);
                }            
                //文件
                if(item.isFile()) {
                    //输出信息,
                    System.out.println("文件---"+item.getName());
                }
//            }
//            catch(Exception ex) {
//                continue;
//            }
        }        
    }
    
    
    
    
    
    
    
    
    
}

----基础-字节流

package com.xzm.test;

//导入io需要的依赖包文件
import java.io.*;

public class _04_基础_字节流 {

    public static void main(String[] args) {
        
        //基础 - 字节流
        //    FileInputStream    输入
        //  FileOutputStream   输出

        //基础流是最基本的对象,按照 byte 字节的方式进行操作的
        //【不支持特殊字符:中文就是其中之一】
        
        //由于是字节操作:
        //    1、不能使用String,必须是一个个 独立的 char 去操作
        //    2、它可以操作任何文件:rar,jpg,mp3,mp4,.....
        
        //【读写速度快,不支持特殊字符,支持任何类型文件】
        
        
        try {
            inputFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        
    }
    
    //===============================================
    
    //自定义方法,实现 基础-字节流写文档
    //【禁止方法中处理异常的】
    public static void outputFile() throws IOException {
        
        //声明文档对象
        File f = new File("C:/aaa/myfile.txt");
        
        //判断:创建
//        if(!f.isFile()) {
//            f.createNewFile();
//        }
        
        //创建基础字节输出流对象
        //必须建立在一个指定的File对象上面。
        //如果有文件,打开文件
        //如果没有文件,自动创建,再打开文件
        FileOutputStream fos = new FileOutputStream(f);
        
        
        //定义写入内容:不支持中文
        //程序中,换行 

        //文档中:换行 
 
        String str = "abcd
ABCD-这里中文。";
        
        
        //只能使用char类型写入
        for(int i=0; i<str.length(); i++) 
        {
            //从字符串中提取指定字符
            char cr = str.charAt(i);
            
            //写入文件
            fos.write(cr);
        }
        
        
        //【重点】:关闭流
        fos.close();
        
    }
    
    
    
    
    //自定义方法,实现 基础-字节流读文档
    public static void inputFile() throws IOException {
        
        //创建File对象--数据源
        File f = new File("C:/aaa/myfile.txt");
        
        //声明基础字节输入流
        //【强制异常处理:属于检查异常checkedException】
        //【文件不存在】
        FileInputStream fis = new FileInputStream(f);
        
        
        //读取文件
        //按照字节方式去读取, f.length() 文件大小就是字节的
        //方法:.read(),每一次读取一个,
        //        返回ASCII码,没有:-1
        //        每当读取一个之后,自动移动到下一个
        while(true)
        {
            //读取,获取ascii
            //【强制异常:无权限】
            int ascii = fis.read();
            
            if(ascii == -1) {
                break;//读取完毕
            }
            else {
                //把ascii转换成char字符
                System.out.print( (char)ascii );
            }
            
        }
        
        
        //【重点】:关闭流
        fis.close();
        
        
        
        
        
        
        
    }
    
    
    
    
    
    

}

----基础字符流

package com.xzm.test;

import java.io.*;

public class _05_基础_字符流 {

    public static void main(String[] args) {
        
        //基础 - 字符流
        //    FileReader    输入
        //  FileWriter    输出

        //基础流是最基本的对象,按照 独立字符的方式操作的
        //【支持特殊字符,是一个个字去操作的】
        
        //由于是字符操作:
        //    1、不能使用String,必须是一个个 独立的 char 去操作
        //    2、只能用于文件中的文本内容
        
        //【读写速度慢,支持特殊字符】

        
        try {
            readerFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }

    //==========================================
    
    //基础字符输出流
    public static void writerFile() throws IOException {
        
        //数据源对象
        File f = new File("C:/aaa/myfile.txt");
        
        
        //可以单独判断然后创建,例子中不用了
        
        
        //创建字符输出流
        //【强制异常处理】
        //有:打开, 没有:创建再打开
        FileWriter fw = new FileWriter(f);
        
        
        //直接写入内容 - 替换原有的
        //支持String
        fw.write("今天已经是星期三咯,
今天学习IO内容!");
        
        
        //支持追加写入
        //【只能已char类型追加】        
        fw.append('
');
        fw.append('
');
        fw.append('好');
        fw.append('☺');
        
        
        //【关闭】
        fw.close();
        
        
    }
    
    
    
    //基础 字符输入
    public static void readerFile() throws IOException {
        
        //数据源对象
        File f = new File("C:/aaa/myfile.txt");
        
        //输入流对象
        FileReader fr = new FileReader(f);
        
        //也是一个个文字读取,获取ascii
        while(true)
        {
            //读取,得到ascii
            int ascii = fr.read();
            //判断
            if(ascii==-1) {
                break;//结束
            }
            else {
                System.out.print( (char)ascii );
            }
        }
        
        //关闭
        fr.close();
        
    }
    
    
    
    
    
    
    
    
    
}

----高层字节流

package com.xzm.test;

import java.io.*;

public class _06_高层_字节流 {

    public static void main(String[] args) {
        
        //高层流:Buffered:缓冲区域
        //默认操作的先至缓冲区,然后由缓冲区一次性操作。
        //有点:
        //    1、减少对物理磁盘的操作次数。

        try {
            bufferedout();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            
    }
    
    //=====================================================
    
    //高层-字节输出
    public static void bufferedout() throws IOException {
        
        //数据源对象
        File f = new File("C:/aaa/111.txt");
        
        //基础流
        FileOutputStream fos = new FileOutputStream(f);
        
        //创建高层流
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        
        
        //输出写内容:字节-不支持中文
        String str = "abcdABCD";
        for(int i=0; i<str.length(); i++) {
            bos.write( str.charAt(i) );
        }
        
        //上面的内容,先写入缓冲区域,
        //然后由缓冲区去操作文件
        //我们可以清空缓冲区,继续使用这个对象的
        //清空缓冲
        //【注意】:
        // 在低版本的JVM中,上面的操作不会写入物理文件。
        // 必须调用这个方法,清空缓冲,才会写入物理磁盘。
        bos.flush();
        
        
        
        //关闭:【有顺序的】
        bos.close();//高层
        fos.close();//基础
        
        
        
    }
    
    
    //高层 - 字节输入
    public static void bufferedinput() throws IOException {
        
        //数据源
        File f = new File("C:/aaa/111.txt");
        
        //基础流
        FileInputStream fis = new FileInputStream(f);
        
        //高层流
        BufferedInputStream bis = new BufferedInputStream(fis);
        
        //读取
        while(true) {
            //读取
            int ascii = bis.read();            
            //判断
            if(ascii==-1) {
                break;//结束
            }
            //输出
            System.out.print( (char)ascii );
        }
        
        //上面读取操作的内容,先记录到缓冲区
        //然后由缓冲区再呈现出来
        
        
        //关闭:【顺序】
        bis.close();//高层
        fis.close();//基础
        
        
    }
    
    
    
    
    

}

----高层字符流

package com.xzm.test;

import java.io.*;

public class _07_高层_字符流 {

    public static void main(String[] args) {
        
        //高层流:Buffered:缓冲区域
        //默认操作的先至缓冲区,然后由缓冲区一次性操作。
        //有点:
        //    1、减少对物理磁盘的操作次数。

        
        try {
            bufferedreader();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }

    //================================================
    
    //高层-字符,输出
    public static void bufferedwrite() throws IOException {
        
        //数据源
        File f = new File("C:/aaa/222.txt");
        
        //基础流
        FileWriter fw = new FileWriter(f);
        
        //高层流
        BufferedWriter bw = new BufferedWriter(fw);
        
        //直接创建
        //BufferedWriter bw2 = new BufferedWriter(new FileWriter(new File("C:/aaa/222.txt")));
        
        
        //写内容
        bw.write("这里是
高层字符输出流写的。");
        
        //追加:只能一个一个字符追加
        bw.append('☻');
        
        //清空缓冲区
        bw.flush();
        
        //关闭
        bw.close();
        fw.close();
        
    }
    
    
    //高层 - 字符,输入
    public static void bufferedreader() throws IOException {
        
        //一次性声明使用
        //就是上面三个独立声明的合并
        //减少变量操作
        BufferedReader br = new BufferedReader(new FileReader(new File("C:/aaa/222.txt")));
        
        
        //读取
        while(true) 
        {
            //支持一行一行读取的,没有了就是:null
            //默认是一个个读取,然后放入缓冲区
            //通过方法,从缓冲区拿出一行
            String str = br.readLine();
            
            //判断
            if(str==null) {
                break;//结束
            }
            
            //输出
            System.out.println(str);
            
        }
        
        //关闭
        // 由于没有基础流指定对象,
        // 当关闭高层流的时候,基础流也没有了
        br.close();
        
        
    }
    
    
    
}


java针对字符串操作,提供了两个对象:

StringBuilder:
单线程程序,非线程安全的,字符串操作对象。

StringBuffer:
多线程程序,线程安全的(锁),字符串操作对象。


创建一个内存对象,通过行为方法去操作内存中的数据。
始终只有这一个对象存在。

----StringBuilder类

package com.xzm.test;

public class _09_StringBuilder类 {

    public static void main(String[] args) {
        
        // StringBuilder:字符串操作对象
        // 单线程,非线程安全的
        
        //只创建一个对象,一个内存
        //都是通过方法去操作内存,不会产生多余的内存对象。
                
        //实例化对象
        StringBuilder sb1 = new StringBuilder();//空字符串
        StringBuilder sb2 = new StringBuilder("默认值");
        
        //组合内容:追加
        sb1.append("aaaaa");
        sb2.append("bbbbb");
        sb2.append('c');
        
        //String类有的方法,他全部都有。
        //多了新的方法
        
        //插入(索引,"内容")
        sb2.insert(3, "★★★★★");
        
        //删除指定索引的字符
        sb2.deleteCharAt(1);
        
        //删除一段:(开始索引,结束索引-1)
        sb2.delete(3, 6);
        
        //获取预览
        System.out.println(sb1);
        System.out.println(sb2);
        
        
        
        
        

    }

}

----StringBuffer类

package com.xzm.test;

public class _10_StringBuffer类 {

    public static void main(String[] args) {
        //与StringBuilder是一样的,只是里面的所有方法
        //都有锁机制,适合用于多线程
        
        
        //实例化对象
        StringBuffer sb1 = new StringBuffer();//空字符串
        StringBuffer sb2 = new StringBuffer("默认值");
        
        //组合内容:追加
        sb1.append("aaaaa");
        sb2.append("bbbbb");
        
        //String类有的方法,他全部都有。
        //多了新的方法
        
        //插入(索引,"内容")
        sb2.insert(3, "★★★★★");
        
        //删除指定索引的字符
        sb2.deleteCharAt(1);
        
        //删除一段:(开始索引,结束索引-1)
        sb2.delete(3, 6);
        
        //获取预览
        System.out.println(sb1);
        System.out.println(sb2);
        
        

    }

}
原文地址:https://www.cnblogs.com/jiarenanhao/p/14136845.html