05 Java中的输入、输出流

输入输出流

内容概括:

存在java.io包中

所有输入流都是抽象类InputStream(字节输入流)和抽象类Reader(字符输入流)的子类。

所有输出流都是抽象类OutputStream(字节输出流)和抽象类Writer(字符输出流)的子类。

File类

不涉及对文件的读写操作,只获取文件信息,如文件所在目录、文件长度、文件读写权限等。

创建一个File对象的构造方法有:

  • File(String filename);
  • File(String directoryPath, String filename);
  • File(File dir , String filename); //dir是一个目录

几个常用方法:

  • public String getName() //获取文件名
  • public boolean canRead() //是否可读
  • public boolean exists() //是否存在
  • public String getAbsolutePath() //获取文件绝对路径
  • public String getParent() //获得父目录
  • public boolean isFile() //判断是否是文件
package com.InOut;

import java.io.*;

public class Txt {
    public static void main(String[] args) {
        File f = new File("E:\\", "hello.txt");  //文件需事先创建
        System.out.println(f.getName() + "是可读的吗:" + f.canRead());
        System.out.println(f.getName() + "的长度:" + f.length());
        System.out.println(f.getName() + "的绝对路径:" + f.getAbsolutePath());

        File file = new File("new.txt");
        System.out.println("在当前目录下创建新文件" + file.getName());
        if (!file.exists()) {
            try {
                file.createNewFile();
                System.out.println("创建成功");
            } catch (IOException exp) {
            }
        }
    }
}
hello.txt是可读的吗:true
hello.txt的长度:24
hello.txt的绝对路径:E:\hello.txt
在当前目录下创建新文件new.txt
  • public boolean mkdir();

  • public String[] list(); //

  • public File [] listFiles(); //
  • public String[] list(FilenameFilter obj) //以字符串形式返回目录下指定类型的所有文件
  • public File [] listFiles(FilenameFilter obj) //用File对象形式返回 FilenameFilter是一个接口,该接口有一个方法: public boolean accept(File dir,String name);
package com.InOut;
import java.io.*;

class FileAccept implements FilenameFilter{
    private String extendName;
    public void setExtendName(String s){
        extendName = "."+s;
    }
    public boolean accept(File dir,String name){ //重写接口中的方法
        return name.endsWith(extendName);
    }
        }

public class Directory {
    public static void main(String[] args) {
        File dirFile = new File(".");  //参数点号表示当前目录
        FileAccept fileAccept = new FileAccept();
        fileAccept.setExtendName("txt");
        String fileName[] = dirFile.list(fileAccept);//以字符串形式返回,参数为接口回调
        for(String name:fileName){
            System.out.println(name);
        }
    }
}
new.txt

先创建对象:File file = new File(“E:\”,mary.txt);

如果没有名为mary.txt的文件,调用public bolean createNewFile();创建

file.delete();删除文件

可以用Runtime类,此时将使用静态方法创建对象:

Runtime ec = Runtime.getRuntime();

package com.InOut;
import java.io.*;

//打开记事本和Typora
public class Exe {
    public static void main(String[] args) {
        try {
            Runtime ce = Runtime.getRuntime();
            File file = new File("c:/windows", "Notepad.exe");
            ce.exec(file.getAbsolutePath());
            file = new File("E:\\User\\Soft\\Typora\\Typora.exe");
            ce.exec(file.getAbsolutePath());
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

文件字节输入流

如果需求简单,可使用InputStream的子类FileInputStream。

FileInputStream(String name);

FileInputStream(File file);

参数name和file指定的文件就称为输入流的源。通常要配合try catch使用

close();

package com.InOut;
import java.io.*;

//使用文件字节流读文件的内容
public class InStream {
    public static void main(String[] args) {
        int n=-1;
        byte [] a =new byte[100];
        try{
            File f = new File("hello.txt");
            System.out.println("is file exists:"+f.exists());
            InputStream in = new FileInputStream(f);
            while((n=in.read(a,0,100))!=-1){
                String s = new String(a,0,n);
                System.out.println(s);
            }
            in.close();
        }
        catch(IOException e){
            System.out.println("File read error"+e);
        }
    }
}
is file exists:true
Hello, this is my world.

你好,这是我的世界。

文件 字节 输出流

同文件字节输入流类似

文件字符输入、输出流

上面的文件字节输入流、输出流的read write方法不能很好操作Unicode字符,例如汉字可能会出现乱码现象。

FileReader 和 FileWriter分别是Reader 和 Writer的子类。

package com.InOut;
import java.io.*;

public class CharInOut {
    public static void main(String[] args) {
        File sourceFile = new File("hello.txt");
        File targetFile = new File("hello_1.txt"); //不必事先创建
        char c[] = new char[19];
        try{
            Writer out = new FileWriter(targetFile,true);
            Reader in = new FileReader(sourceFile);
            int n = -1;
            while((n=in.read(c))!=-1){
                out.write(c,0,n);
            }
            out.flush();
            out.close();
        }
        catch(IOException e){
            System.out.println("Error"+e);
        }
    }
}

缓冲流

核心语句:String strLine = inTwo.readLine();

//inTwo是一个BufferedReader对象,但是参数里是文件输入流的源。

随机流

RandomAccessFile类,既不是InputStream,也不是OutStream的子类。

由RandomAccessFile类创建的流称为随机流,既可作为流的源,也可作为流的目的地。

RandomAccessFile(String name, String mod)

RandomAccessFile(File file, String mod) //参数mod为 r 或 rw

seek(long a) 参数a确定读写位置距离文件开头的字节个数

getFilePointer() 获取流的当前读写位置

read Char( )

writeFloat( )

数组流

  • 字节数组流
  • 字符数组流

数据流

对象流

其他功能

ProgressMonitorInputStream(Component c, String s, InputStream);  //import java.swing.**
FileChannel channel = input.getChannel();  //获得信道
FileLock lock = channel.tryLock();   //加锁
lock.release();  //解锁

Original: https://www.cnblogs.com/allisonHunter/p/16315444.html
Author: allisonHunter
Title: 05 Java中的输入、输出流

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/592563/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python定时任务,三步实现自动化

    大家好,我是小一 今天的文章源自于工作中的一个小技巧,主要是涉及到日常工作的自动化处理。 如果说你每天都需要做一些重复的工作,比如出一份报告、统计一个数据、发一封邮件等等 那你完全…

    Java 2023年6月7日
    078
  • adobeacrobatXpro 十分好用得pdf编辑工具

    下载地址百度云 链接:https://pan.baidu.com/s/1Vfn6HiKdKmRKznaHX9-x1w提取码:6lay Original: https://www.c…

    Java 2023年6月13日
    070
  • 不扒瞎,这个程序让我从300s优化到了10s

    /*** RedisTemplate配置* @param lettuceConnectionFactory* @return*/ @Be…

    Java 2023年6月15日
    093
  • 关于IDEA中Tomcat中文乱码的解决方案

    进入Tomcat/config文件夹下,打开编辑logging.properties 然后查看该文件内是否存在 java.util.logging.ConsoleHandler.e…

    Java 2023年6月8日
    091
  • MybatisPlus属性自动填充

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    069
  • Spring Cloud Alibaba 使用Nacos作为服务注册中心

    为什么需要注册中心? 在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用;服务管理,核心是有个服务注册表,心跳机制动态维护 ; 服务注册 …

    Java 2023年6月5日
    097
  • SpringBoot启动源码解析(一)

    其中一部分代码 /** * Run the Spring application, creating and refreshing a new * {@link Applicati…

    Java 2023年6月15日
    072
  • 【笔试】1、强迫卖家

    小明是个强迫症卖家,有10000台设备,卖的均价要求最接近D元,输出卖出的台数N,总售价M 输入 0首先想得是暴力解答然后是二分查找,寻找卖出多少台才符合要求,但是一直找不到符合要…

    Java 2023年6月5日
    083
  • ORACLE错误码大全

    ORA-00001: 违反唯一约束条件 (.)错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。ORA-00017: 请求会话以设置跟踪事件ORA-00018: 超出最…

    Java 2023年6月8日
    096
  • 题目:完成网站的咨询聊天(UDP)

    题目:完成网站的咨询聊天(UDP) 学生端: package com.gao.Project.Pro6; import java.io.IOException; import ja…

    Java 2023年6月5日
    083
  • 深入浅出Spring MVC

    摘要 本文旨在详细分析SpringMVC工作原理以及作为开发者如何基于SpringMVC做扩展。因为SpringMVC分析的文章比较多,所以本文重点讲解如何利用SpringMVC的…

    Java 2023年6月8日
    0105
  • 常见的开源 License

    目录 什么是开源软件 什么是 license 商业许可证与开源许可证 对开发者的影响 开源许可证的类型 如何选择开源许可证 什么是开源软件 开放源代码的软件。假设有一天自我感觉代码…

    Java 2023年6月9日
    094
  • 大白话布隆过滤器

    本文是站在小白的角度去讨论布隆过滤器,如果你是科班出身,或者比较聪明,又或者真正想完全搞懂布隆过滤器的可以移步。 不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,仿佛…

    Java 2023年6月5日
    085
  • Java 8 并发性基础

    https://www.ibm.com/developerworks/cn/java/j-jvmc2/index.html http://www.nurkiewicz.com/20…

    Java 2023年5月29日
    095
  • Maven的生命周期

    生命周期的定义 Maven的生命周期( lifecycle)是对构建过程进行的抽象。 它包含了项目的 清理、初始化、 编译、 测试、 打包、集成测试、验证、 部署和 站点生成等几乎…

    Java 2023年6月6日
    099
  • Spring事务调用类自己方法失效解决办法和原因

    正常情况下,我们都是在controller里调用service里的方法,这个方法如果需要加事务,就在方法上加上@Transactional,这样是没问题的,事务会生效。 可是如果像…

    Java 2023年5月30日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球