JavaIO流 文件的读写

简介: JavaIO流 文件的读写

1. 文件的写入

package my;
import java.io.*;
public class TestWrite {
    public static void main(String[] args) throws IOException {
        byte[] data = {0, 2, 4, 6, 8, 10, 12, 14};
        // 写入文件
        File file = new File("example.123");  // 指定保存的路径
        OutputStream outputStream = new FileOutputStream(file);   // 创建文件
        outputStream.write(data, 0, 8); // 8个字节 data[0] - data[7]
        outputStream.close();
        System.out.println("exit.");
    }
}

可以发现多了个123文件, 可以用UltraEdit这个工具打开,切换到十六进制查看

这几个数就是刚刚写入的

2. 文件的读取

package my;
import java.io.*;
public class TestRead {
    public static void main(String[] args) throws IOException {
        // 用于接收数据的缓存区, 需要足够大
        byte[] buffer = new byte[1000];
        // 这里可以使用绝对路径或者相对路径来定义文件
        File file = new File("example.123");
        // 从文件中读取数据,加载到缓存区
        InputStream inputStream = new FileInputStream(file);
        //buffer表示缓存区, 0表示从第一个字节开始读取, 1000表示一共读取1000个字节
        // 返回值res表示读取了多少个字节
        int res = inputStream.read(buffer, 0, 1000);
        inputStream.close();
        System.out.printf("读取了%d个字节\n", res);
        System.out.println("exit..");
    }
}

与文件的写入基本步骤差不多, 只不过这次是用一个buffer缓冲区来接收读取的文件里的字节数

3. 文本的写入

如何将一个字符串写入到文件, 我们需要先把字符串转换为字节数据, 文件的写入只能接收字节数据,我们要把string类型转换为byte[]类型

package my;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class WriteFile {
    public static void main(String[] args) throws IOException {
        String s = "你好世界";
        byte[] buffer = s.getBytes(StandardCharsets.UTF_8);
        File file = new File("test.txt");
        OutputStream outputStream = new FileOutputStream(file);
        outputStream.write(buffer);
        outputStream.close();
        System.out.println("Exit..");
    }
}

与前边的字节读入基本无异, 就是把string类型转了一下byte类型,以UTF-8的格式转

4. 文本的读取

文本的读取就是和文本的写入反过来, 文本读取先读取到字符数据,然后再把字符数据转换为String类型即可

package my;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class TextRead {
    public static void main(String[] args) throws IOException {
        byte[] buffer = new byte[1000];
        // 定义文本路径
        File file = new File("test.txt");
        // 从文本中读取并加载到缓冲区
        InputStream inputStream = new FileInputStream(file);
        int res = inputStream.read(buffer, 0, 1000);
        /**
         * 这里吧读取的byte字节类型转换为字符串类型
         */
        String s = new String(buffer, StandardCharsets.UTF_8);
        System.out.println(s);
    }
}

5. 二进制编码

对于基本类型,比如int, double ,float如何存入文件

对于Java, 他有一个ByteBuffer ,一个基于字节得二进制编码器, 可以对这些类型进行编码

package my;
import java.nio.ByteBuffer;
public class OtherType {
    public static void main(String[] args) {
        // 创建一个100个字节得二进制编码器
        ByteBuffer bf = ByteBuffer.allocate(100); // allicate 既是申请的意思,表示静态申请空间
        // 把 一个整数和小数放进去
        bf.putInt(1234);
        bf.putDouble(56.78);
        // 查看实际占用了多少字节,实际是一个指针, 指向第一个空闲的字节,所以可以用来表示总字节个数
        int size = bf.position();
        // 利用array方法来获取它内部得数据
        byte[] data = bf.array();
        // 获取内部数据的容量
        int capacity = bf.capacity();
        System.out.printf("实际占用的字节数为 %d \n", size);
        System.out.printf("总共的字节的容量 %d \n", capacity);
        for (int i = 0; i < size; i++) {
            System.out.printf("%02x ",data[i]);
        }
    }
}

当然写进去的都是乱码

用编码工具即可看到二进制结果

6. 二进制解码

编码: Encode

解码: Decode

将字节数据byte[]再恢复为原始数据int, double

解码过程还是用ByteBuffer来实现

package my;
import java.io.*;
import java.nio.ByteBuffer;
public class OtherRead {
    public static void main(String[] args) throws IOException {
        // 读取二进制文件中的字符
        File file = new File("number.txt");
        InputStream inputStream = new FileInputStream(file);
        byte[] buffer = new byte[100];
        int res = inputStream.read(buffer, 0, 100);
        // 二进制解码, 这里利用wrap
        ByteBuffer bf = ByteBuffer.wrap(buffer, 0, res);
        bf.position(0); // 这一步, 有点意思, 就是把指针移动到最前边的位置, 来从头读取
        int a = bf.getInt();
        float b = bf.getFloat();
        System.out.printf("a = %d, b = %f\n",a,b);
        System.out.println("exit..");
    }
}

二进制编码的时候我们用的allocate来申请空间, 这里区分wrap

allocate() 是再内存中,自己创建了 byte[]空间

wrap()则是利用外部读取进来的现成的byte[]空间,而不用自己创建


另外我们可以利用 getInt(). getFloat(), getDouble()等这些函数来提取相应的字符数目来解码

getInt()会依次读取4个字节来组成int类型数, getFloat() 也是读取四个字节, 而getDouble() 则是读取8个字节


相关文章
|
2天前
|
弹性计算 运维 搜索推荐
三翼鸟携手阿里云ECS g9i:智慧家庭场景的效能革命与未来生活新范式
三翼鸟是海尔智家旗下全球首个智慧家庭场景品牌,致力于提供覆盖衣、食、住、娱的一站式全场景解决方案。截至2025年,服务近1亿家庭,连接设备超5000万台。面对高并发、低延迟与稳定性挑战,全面升级为阿里云ECS g9i实例,实现连接能力提升40%、故障率下降90%、响应速度提升至120ms以内,成本降低20%,推动智慧家庭体验全面跃迁。
|
3天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
351 91
|
10天前
|
人工智能 自然语言处理 前端开发
Qoder全栈开发实战指南:开启AI驱动的下一代编程范式
Qoder是阿里巴巴于2025年发布的AI编程平台,首创“智能代理式编程”,支持自然语言驱动的全栈开发。通过仓库级理解、多智能体协同与云端沙箱执行,实现从需求到上线的端到端自动化,大幅提升研发效率,重塑程序员角色,引领AI原生开发新范式。
854 156
|
3天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
258 156
|
4天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
11天前
|
机器人 API 调度
基于 DMS Dify+Notebook+Airflow 实现 Agent 的一站式开发
本文提出“DMS Dify + Notebook + Airflow”三位一体架构,解决 Dify 在代码执行与定时调度上的局限。通过 Notebook 扩展 Python 环境,Airflow实现任务调度,构建可扩展、可运维的企业级智能 Agent 系统,提升大模型应用的工程化能力。
|
人工智能 前端开发 API
前端接入通义千问(Qwen)API:5 分钟实现你的 AI 问答助手
本文介绍如何在5分钟内通过前端接入通义千问(Qwen)API,快速打造一个AI问答助手。涵盖API配置、界面设计、流式响应、历史管理、错误重试等核心功能,并提供安全与性能优化建议,助你轻松集成智能对话能力到前端应用中。
816 154