Java笔记-10 IO流

输入输出流

  • 外部系统的输入输出操作

  • 字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流,如FileInputStream、FileOutputStream。

  • 字符流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流,如FileReader、FileWriter。

序号 分类 功能
1. InputStream/OutputStream 字节流 抽象类。
2. Reader/Writer 字符流 抽象类
3. FileInputStream/FileOutputStream 节点流 以字节为单位直接操作“文件”。
4. ByteArrayInputStream/ByteArrayOutputStream 节点流 以字节为单位直接操作“字节数组对象”。
5. ObjectInputStream/ObjectOutputStream 处理流 以字节为单位直接操作“对象”。
6. DataInputStream/DataOutputStream 处理流 以字节为单位直接操作“基本数据类型与字符串类型”。
7. FileReader/FileWriter 节点流 以字符为单位直接操作“文本文件”(注意:只能读写文本文件)。
8. BufferedReader/BufferedWriter 处理流 将Reader/Writer对象进行包装,增加缓存功能,提高读写效率。
9. BufferedInputStream/BufferedOutputStream 处理流 将InputStream/OutputStream对象进行包装,增加缓存功能,提高 读写效率。
10. InputStreamReader/OutputStreamWriter 处理流 将字节流对象转化成字符流对象。
11. PrintStream 处理流 将OutputStream进行包装,可以方便地输出字符,更加灵活v

File的关于文件的操作

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

public class Test {
   
    public static void main(String[] args) throws IOException {
   
        //分隔符
        System.out.println(File.separator); // 文件夹的分隔符字符串的\
        System.out.println(File.separatorChar); // char的\
        System.out.println(File.pathSeparator); //;
        String userDir = System.getProperty("user.dir"); //相对路径的路径
        System.out.println(userDir);

        File f = new java.io.File("src/images/ball.png");
        //基本信息
        System.out.println(f.exists());
        System.out.println(f.getName()); // ball.png
        System.out.println(f.getPath()); // src\images\ball.png
        System.out.println(f.getAbsolutePath());// D:\data\idea\testjava\src\images\ball.png
        System.out.println(f.getParent()); //父路径 src\images,如果没有则为null
        System.out.println(f.getParentFile());//父路径的File对象
        //状态
        System.out.println(f.isDirectory());
        System.out.println(f.isFile());
        System.out.println(f.isAbsolute());
        System.out.println(f.isHidden());
        //信息
        if(f.isFile()){
   
            //目录的length是0,没有存在的文件长度也是0
            System.out.println("文件长度:"+f.length()+" B");
        }
        //创建文件,路径默认是项目下的路径
        File nf = new File("aa.txt");
        boolean isCreateSuccess = nf.createNewFile();
        System.out.println(isCreateSuccess);
        //删除文件
        boolean isDeleteSuccess = nf.delete();
        System.out.println(isDeleteSuccess);
    }
}

File关于文件夹的操作

import java.io.File;

/**
 * File目录的相关操作,
 * 遍历打印文件
 */
public class TestFileFolder {
   
    public static void main(String[] args) {
   

        File[] roots = File.listRoots(); //盘符的File对象数组
        for(File f:roots) {
   
            System.out.println(f);
        }
        //创建目录,需要前一层目录存在
        File file = new File("abc");
        file.mkdir();
        //多层创建,可以创建多层目录
        new File("ddd/eee/fff").mkdirs();
        new File("abc").deleteOnExit();
        //列出下一级
        File f1 = new File(".");
        String[] fsting = f1.list(); //只列出名称
        System.out.println(fsting);
        File[] fs = f1.listFiles();//列出File对象
        for(File f:fs){
   
            System.out.println(f+":"+f.isDirectory());
            //System.out.println(f.getAbsolutePath());
        }
        System.out.println("--------------");
        leng = 0;
        getFiles(new File("D:\\fvc"),0);
        System.out.println(leng);

    }
    static long leng = 0;
    //递归打印所有文件,顺便获取文件夹所有文件的大小
    public static void getFiles(File file,int deep){
   
        for(int i = 0;i<deep;i++){
   
            System.out.print("-");
        }
        if(file.isDirectory()){
   
            File[] fs = file.listFiles();
            for(File f:fs){
   
                getFiles(f,deep+1);
            }
        }else {
   
            System.out.println(file.getAbsolutePath());
            leng+=file.length();
        }
    }
}

字符集,字符串与字节数组的转换

import java.io.UnsupportedEncodingException;

public class TestEncode {
   
    public static void main(String[] args) throws UnsupportedEncodingException {
   
        String msg = "编程java";
        //转换为字节数组
        byte[] bytes = msg.getBytes();
        System.out.println(bytes);
        printByte(bytes);

        byte[] bytesgbk = msg.getBytes("GBK");
        printByte(bytesgbk);

        byte[] bytesutf16 = msg.getBytes("UTF-16LE");
        printByte(bytesutf16);

        //字节数组转换为字符串
        msg = new String(bytes,0,bytes.length,"utf8");
        System.out.println(msg);

        msg = new String(bytesgbk,0,bytesgbk.length,"GBK");
        System.out.println(msg);

        msg = new String(bytesutf16,0,bytesutf16.length,"UTF-16LE");
        System.out.println(msg);
    }
    static void printByte(byte[] bytes){
   
        /**
         * 将字节数组打印成一行
         */
        StringBuilder sb = new StringBuilder("[");
        for(byte b:bytes){
   
            sb.append(b+",");
        }
        sb.setCharAt(sb.length()-1,']');
        System.out.println(sb);
    }
}

四大抽象类

  • InputStream/OutputStream和Reader/writer类是所有IO流类的抽象父类,前两个是字节的输入输出流,后面两个是字符的输入输出流。读和输入常用read和close方法,写和输出常用write,flush,close方法。

文件字节流

FileInputStream

  • 按字节读取文件
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class TestIO {
   
    public static void main(String[] args) throws IOException {
   
        //FileInpuStream可以传入File或字符串路径,word里存abc三个字母
        InputStream fis = new FileInputStream("testdata/word.txt");

        System.out.println((char)fis.read()); //第一个字母a
        System.out.println((char)fis.read()); //第二个字母b
        System.out.println((char)fis.read()); //第三个字母c
        System.out.println(fis.read()); //第4个返回-1,不是数据了
        //关闭
        fis.close();


        //使用while来读,一直到最后,一次读取一个字符
        InputStream fis1 = new FileInputStream("testdata/word.txt");
        int temp;
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独孤尚亮dugushangliang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值