java IO流

java IO流 之 InputStream 和 OutputStream



一、File类

1、File类的使用

java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。

2、构造方法

这里是官方文档📕
构造方法
(1)File(String parent, String child)
以parent为父路径,child为子路径创建File对象。
(2)File(String pathname)
以pathname为路径创建File对象,可以是 绝对路径或者相对路径.
(3)File(File parent, String child)
根据一个父File对象和子文件路径创建File对象


用法示例:

public class Main1 {
    public static void main(String[] args) {
        {
            //File(String parent, String child)
            // 父结点,一般都是目录
            File file = new File("D:\\IO", "Lvvvvv.txt");
            System.out.println(file);
        }
        {
            //File(String pathname)
            //绝对路径
            File file = new File("D:\\IO\\Lvvvvv.txt");
            System.out.println(file);
            // 对象存在
            // 文件并不存在
        }

        {
            //File(File parent, String child)
            // 父结点,一般都是目录
            File parent = new File("D:\\IO");
            File file = new File(parent, "Lvvvvv.txt");
            System.out.println(file);
        }

    }
}

结果:
结果
但需要注意的是,文件路径存在,但文件不一定存在

3、常用方法

这里是官方文档📕

  • public String getAbsolutePath():获取绝对路径
  • public String getPath() :获取路径
  • public String getName() :获取名称
  • public String getParent():获取上层文件目录路径。若无,返回null
  • public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
  • public boolean canRead() :判断是否可读
  • public boolean canWrite() :判断是否可写
  • public boolean canExecute():判断是否可执行
  • public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
  • public boolean mkdirs() :创建文件目录。可以连同父目录一起创建。
  • public boolean isFile():判断是否是文件(前提:存在&&是文件)
  • public boolean isDirectory():判断是否是目录(前提:存在&&是目录)

还有很多,用的时候记得去官方文档查看。

4、绝对路径&&相对路径

(1)绝对路径

从一棵树的根节点出发,到达相对应节点的完整路径。
示例
如上图所示,Java1文件的绝对路径: D: -> Excaption -> Java1 。

Windows使用反斜杠 \ 作为分隔符,所以其绝对路径可以写为:D:\Excaption\Java1。

在代码中,由于反斜杠 \ 是转义字符,所以需要先用 \ 对 \ 进行转义,完整路径: “D:\Excaption\Java1”

(2)相对路径

相对于“当前位置”而言的路径,此时就不是从根目录出发了。

如上图所示,要去找Java2文件,我们是在D:\Excaption\Java1,所以此时需要:回到上一层->Excaption->Java2。

用…表示回到上一层,用 . 描述当前层

所以相对路径:“… \Excaption\Java2”。

二、IO

Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。
IO流
相对于内存来说,从文件或网络连接中读取数据到内存称为输入流(InputStream和Reader),从内存中读取数据往文件中写称为输出流(OutputStream和Writer)。今天就先学一下InputStream和OutputStream。

三、java.io.InputStream

将文件或网络中的数据读到内存(进程)中,就是 InputStream。
常用方法

public class file_read_1 {
    public static void main(String[] args) throws IOException {
        File file = new File("hello.txt");//创建文件对象
        System.out.println(file.createNewFile());
        System.out.println(file.exists());

        //这样写得手动关闭文件
//        InputStream is=new FileInputStream("hello.txt");
//        byte[] b=new byte[20];
//        int n= is.read(b);  //n:代表读了多少个
//        System.out.println(n);
//        System.out.println(Arrays.toString(b));
//        is.close();

        //这样写不用手动关闭文件
        try(InputStream is=new FileInputStream("hello.txt");){
            byte[] b=new byte[20];
            int n= is.read(b);//n:代表本次读了多少字节的数据
            System.out.println(n);
            System.out.println(Arrays.toString(b));
            n=is.read(b);//n:表示下一个字节的数据
            System.out.println(n);//此时会输出-1,因为文件里的数据已经读完了(EOS:End Of Stream)
        }
    }
}

细节问题: -1表示数据读完啦(EOS:End Of Stream)

四、java.io.OutputStream

从内存(进程)往文件或外部设备中写,就是 OutputStream。
方法
需要注意的是,输出是覆盖式的输出,会修改源文件内容
现在我有一个hello.txt文件,先读一下文件的内容:

public class file_read {
    public static void main(String[] args) throws IOException {
        try(InputStream is=new FileInputStream("hello.txt")){
            Scanner scanner = new Scanner(is,"UTF-8");
            while(scanner.hasNext()){
                System.out.println(scanner.next());
            }
        }
    }
}

结果
这是文件的内容,当我们使用OutputStream流向该文件写的时候,由于输出是覆盖式的,所以会修改源文件的内容:

public class file_write_1 {
    public static void main(String[] args) throws IOException {
        try(OutputStream os=new FileOutputStream("hello.txt")){
            byte[] b=new byte[]{'h','e','l','l','o','\r','\n','1','2'};
            os.write(b);
            os.flush();
        }
    }
}

在这段代码中,向hello.txt文件中写数据,然后我们再读数据,看源文件内容的变化情况:
结果
如图所示,源文件内容已经被改变。所以在使用OutputStream的时候需要注意它覆盖式输出这一点。


总结

IO这儿,会用就行,拜拜🙋‍♀️

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值