文件操作与IO(下)

个人主页: 不漫游-CSDN博客

目录

前言

流对象 

InputStream

OutputStream

 运用

在控制台进行输入并写入文件

进行普通文件的复制


前言

之前的文章文件操作与IO(上)已经介绍了文件系统的相关操作,这次的主角是文件内容的相关操作----通过流对象来实现。

流对象 

在Java中,流对象用于处理输入和输出操作。流可以分为字节流和字符流两大类。

字节流适用于处理二进制数据,而字符流适用于处理文本数据。

而对文件内容的操作分为三大步:

1.打开文件。2.对文件进行操作。3.关闭文件。 

 

InputStream

因为InputStream是一个抽象类(父类),我们现在只关⼼从⽂件中读取,所以使⽤FileInputStream(子类)。

package IO;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class demo3 {
    public static void main(String[] args)  {
        try(InputStream inputStream=new FileInputStream("hello.txt")) {
            while(true){//一直读取
                int a=inputStream.read();//读取一个字节的数据
                if(a==-1){
                    break;
                }
                System.out.printf("%c",a);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 因为没有提供文件路径,所以运行之前要把文件放到项目的目录中去。

而且这里的try - catch模型可以实现自动关闭文件。

而这个a就相当于缓冲区,用于展示存储信息。

 

 

OutputStream

可以对文件进行写入,如图是相关的使用方法:

修饰符及返回值类型方法签名说明
​void​write(int b)写入一个字节的数据。参数 ​b​ 是一个整数,但实际上只使用其最低的 8 位(即一个字节)。
​void​write(byte[] b)​b​ 这个字节数组中的数据全部写入 ​OutputStream​ 中。
​int​write(byte[] b, int off, int len)​b​ 这个字节数组中从 ​off​ 开始的 ​len​ 个字节写入 ​OutputStream​ 中。返回实际写入的字节数。
​void​close()关闭字节流。释放与此流相关的所有系统资源。
package IO;

import java.io.*;

public class demo3 {
    public static void main(String[] args)  {
        try(OutputStream outputStream= new FileOutputStream("hello.txt")) {
            String data = "Hello!"; //要写入的数据
             byte[] bytes=data.getBytes();//将字符串转换为字节数组
         outputStream.write(bytes);//写入字节数组
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 转成字节数组可以加入更多数据,所以没有直接添加。

注意,一般的write 会把原来文件内容删除在进行添加。

try(OutputStream outputStream= new FileOutputStream("hello.txt", true)) 

所以如果是追加的话, 记得写入第二个参数为append为true。

 运用

在控制台进行输入并写入文件

这个和普通的输入很相似,只要把具体的数据用Scanner类对象代替即可~

package IO;

import java.io.*;
import java.util.Scanner;

public class demo3 {
    public static void main(String[] args)  {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入:");
        try(OutputStream outputStream= new FileOutputStream("hello.txt",true)) {
            String data = scanner.nextLine(); //要写入的数据
             byte[] bytes=data.getBytes();//将字符串转换为字节数组
         outputStream.write(bytes);//写入字节数组
        } catch (IOException e) {
            e.printStackTrace();
        }
        scanner.close();
    }
}

 

进行普通文件的复制

将源文件里的内容复制到目标文件中去:

可以采用之前InputStream进行读取源文件,

OutStream用来写入到目标文件。

package IO;

import java.io.*;

public class demo4 {
    public static void main(String[] args) {
        //源文件路径
        String sourcePath = "hello.txt";
        //目标文件路径
        String targetPath = "target.txt";

        try (InputStream f1 = new FileInputStream(sourcePath);
             OutputStream f2 = new FileOutputStream(targetPath)) {

            byte[] buffer = new byte[1024]; //采用字节流
            int bytesRead;

            while ((bytesRead = f1.read(buffer)) != -1) {
                f2.write(buffer, 0, bytesRead);
            }
            System.out.println("文件复制成功:" + targetPath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意:将 ​bytesRead​ 的初始化放在 ​while​ 循环的条件中,是为了确保在每次循环开始时都读取数据 。不然可能会造成读取空数据。

看到最后,如果觉得文章写得还不错,希望可以给我点个小小的赞,您的支持是我更新的最大动力

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值