文件传输基础——Java IO流

news2024/11/16 1:35:19

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、文件的编码
  • 二、File类的使用
  • 三、RandomAccessFile类的使用


前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述


一、文件的编码

package com.study.io;


/**
 * 测试文件编码
 */
public class EncodeDemo {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        String s="好好学习ABC";
        byte[] bytes1=s.getBytes();//这是把字符串转换成字符数组,转换成的字节序列用的是项目默认的编码(这里为UTF-8)
        for (byte b : bytes1) {
            //把字节(转换成了int)以16进制的方式显示
            System.out.print(Integer.toHexString(b & 0xff)+" ");//& 0xff是为了把前面的24个0去掉只留下后八位
        }
        System.out.println();
        /*utf-8编码中中文占用3个字节,英文占用1个字节*/
        byte[] bytes2 = s.getBytes("utf-8");//这里会有异常展示,我们就throw这个异常
        for (byte b : bytes2) {
            System.out.print(Integer.toHexString(b & 0xff)+" ");
        }
        System.out.println();
        /*gbk编码中文占用2个字节,英文占用1个字节*/
        byte[] bytes3 = s.getBytes("gbk");//这里会有异常展示,我们就throw这个异常
        for (byte b : bytes3) {
            System.out.print(Integer.toHexString(b & 0xff)+" ");
        }

        System.out.println();
        /*utf-16be编码中文占用2个字节,英文占用2个字节*/
        byte[] bytes4 = s.getBytes("utf-16be");//这里会有异常展示,我们就throw这个异常
        for (byte b : bytes4) {
            System.out.print(Integer.toHexString(b & 0xff)+" ");
        }

        System.out.println();
        /*当你的字节序列是某种编码时,这个时候想把字节序列变成字符串,也需要用这种编码方式,否则会出现乱码*/
        String str1=new String(bytes4);//这时会使用项目默认的编码来转换,可能出现乱码
        System.out.println(str1);
        //要使用字节序列的编码来进行转换
        String str2=new String(bytes4,"utf-16be");
        System.out.println(str2);
    }
}

分析:

    1. “& 0xff”的解释:
  • 0xFF表示的是16进制(十进制是255),表示为二进制就是“11111111”。

  • 那么&符表示的是按位数进行与(同为1的时候返回1,否则返回0)

  • 2.字节byte与int类型转换:

  • Integer.toHexString(b & 0xff)这里先把byte类型的b和0xff进行了运算,然后Integer.toHexString取得了十六进制字符串

  • 可以看出b & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b);,将byte强转为int不行吗?答案是不行的.

  • 其原因在于:1.byte的大小为8bits而int的大小为32bits;2.java的二进制采用的是补码形式

  • Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位。。。。。。

  • 所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。

  • 3.utf-8编码:中文占用3个字节,英文占用1个字节

  • gbk编码:中文占用2个字节,英文占用1个字节

  • Java采用双字节编码(就是Java中的一个字符占两个字节)是utf-16be编码。中文占用2个字节,英文占用2个字节

  • 4.当你的字节序列是某种编码时,这个时候想把字节序列变成字符串,也需要用这种编码方式,否则会出现乱码

  • 5.文本文件 就是字节序列。可以是任意编码的字节序列。

  • 如果我们在中文机器上直接创建文本文件,那么该文件只认识ANSI编码(例如直接在电脑中创建文本文件)

  • 在这里插入图片描述

二、File类的使用

package com.study.io;

import java.io.File;

/**
 * File类的使用
 */
public class FileDemo {
    /*java.iO.File类表示文件或目录
    File类只用于表示文件或目录的信息(名称,大小等),不能用于文件内容的访问。*/
    public static void main(String[] args) {
        File file=new File("D:\\111");//创建文件对象时指定目录需要用双斜杠,因为“\”是转义字符
        /*目录的中间的分隔符可以用双斜杠,也可以用反斜杠,也可以用File.separator设置分隔符*/
//        File file1=new File("d:"+File.separator);
//        System.out.println(file.exists());//exists()判断文件或文件夹是否存在
        if(!file.exists()){//如果文件不存在
            file.mkdir();//创建文件夹mkdir(),还有mkdirs()创建多级目录
        }else{
            file.delete();//删除文件或文件夹
        }
        //判断是否是一个目录isDirectory,如果是目录返回true,如果不是目录或者目录不存在返回false
        System.out.println(file.isDirectory());
        //判断是否是一个文件isFile
        System.out.println(file.isFile());

        File file2=new File("D:\\222","123.txt");
        //常用API:
        System.out.println(file);//打印的是file.toString()的内容
        System.out.println(file.getAbsolutePath());//获取绝对路径
        System.out.println(file.getName());//获取文件名称
        System.out.println(file2.getName());
        System.out.println(file.getParent());//获取父级绝对路径
        System.out.println(file2.getParentFile().getAbsolutePath());
    }
}

运行结果:

在这里插入图片描述
说明:

java.iO.File类表示文件或目录
File类只用于表示文件或目录的信息(名称,大小等),不能用于文件内容的访问。
常用的API:
1.创建File对象:File file=new File(String path);注意:File.seperater();获取系统分隔符,如:“\”.
2.boolean file.exists();是否存在.
3.file.mkdir();或者file.mkdirs();创建目录或多级目录。
4.file.isDirectory()判断是否是目录
file.isFile()判断是否是文件。
5.file.delete();删除文件或目录。
6.file.createNewFile();创建新文件。
7.file.getName()获取文件名称或目录绝对路径。
8.file.getAbsolutePath()获取绝对路径。
9.file.getParent();获取父级绝对路径。

❤❤1、遍历目录

package com.study.io;

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

/**
 * File工具类
 * 列出File类的常用操作,比如:过滤、遍历等操作
 */
public class FileUtils {
    /**
     * 列出指定目录下(包括其子目录)的所有文件
     * @param dir
     * @throws IOException
     */
    public static void listDirectory(File dir) throws IOException{
        if(!dir.exists()){//exists()方法用于判断文件或目录是否存在
            throw new IllegalArgumentException("目录:"+dir+"不存在");
        }
        if(!dir.isDirectory()){//isDirectory()方法用于判断File类的对象是否是目录
            throw new IllegalArgumentException(dir+"不是目录");
        }
        /*String[] fileNames = dir.list();//list()方法用于列出当前目录下的子目录和文件(直接是子目录的名称,不包含子目录下的内容),返回的是字符串数组
        for (String string : fileNames) {
            System.out.println(string);
        }*/

        //如果要遍历子目录下的内容就需要构造成File对象做递归操作,File提供了直接返回File对象的API
        File[] listFiles = dir.listFiles();//返回的是直接子目录(文件)的抽象
        if(listFiles !=null && listFiles.length >0){
            for (File file : listFiles) {
                /*System.out.println(file);*/
                if(file.isDirectory()){
                    //递归
                    listDirectory(file);
                }else{
                    System.out.println(file);
                }
            }
        }
    }
}

测试类:
1 public class FileUtilsTest1 {
2 public static void main(String[] args) throws IOException {
3 FileUtils.listDirectory(new File(“D:\ioStudy”));
4 }
5 }
运行结果:
在这里插入图片描述

三、RandomAccessFile类的使用

RandomAccessFile:java提供的对文件内容的访问,既可以读文件,也可以写文件。
RandomAccessFile支持随机访问文件,可以访问文件的任意位置。

注意 Java文件的模型:
在这里插入图片描述
示例代码:

package com.study.io;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;


/**
 * RandomAccessFile
 */
public class RandomAccessFileDemo {
    public static void main(String[] args) throws IOException{
        File demo = new File("demo");
        if(!demo.exists()){
         demo.mkdir();
        }
        File file = new File(demo,"raf.dat");
        if(!file.exists()){
         file.createNewFile();
        }

        RandomAccessFile raf = new RandomAccessFile(file, "rw");
        //指针的位置
        System.out.println(raf.getFilePointer());

        raf.write('A');//只写了一个字节
        System.out.println(raf.getFilePointer());
        raf.write('B');

        int i = 0x7fffffff;
        //用write方法每次只能写一个字节,如果要把i写进去就得写4次
        raf.write(i >>> 24);//高8位
        raf.write(i >>> 16);
        raf.write(i >>> 8);
        raf.write(i);
        System.out.println(raf.getFilePointer());

        //可以直接写一个int
        raf.writeInt(i);

        String s = "中";
        byte[] gbk = s.getBytes("gbk");
        raf.write(gbk);
        System.out.println(raf.length());

        //读文件,必须把指针移到头部
        raf.seek(0);
        //一次性读取,把文件中的内容都读到字节数组中
        byte[] buf = new byte[(int)raf.length()];
        raf.read(buf);

        System.out.println(Arrays.toString(buf));
           for (byte b : buf) {
         System.out.println(Integer.toHexString(b & 0xff)+" ");
        }
           raf.close();
    }
}

运行结果:
View Code

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1793109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TPM仿真环境搭建

文章目录 背景及注意事项一、CMake二、m4三、GNU MP Library四、TPM_Emulator五、TSS协议栈(trousers-0.3.14.tar.gz)六、 tpm-tools七、查看是否安装成功八、测试 TPM环境(需要开三个终端分别运行)8.1 启动TPM (第一个…

【机器学习基础】Python编程03:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

华为手机录屏在哪里?图文详解帮你找!

随着科技的进步,智能手机已成为我们日常生活中不可或缺的工具。其中,华为手机凭借其卓越的性能和用户体验,在全球范围内赢得了广泛的赞誉。在众多功能中,录屏功能尤为实用,无论是制作教程、记录游戏精彩瞬间&#xff0…

实现教育数字化转型,选择智慧校园软件

在当今数字时代,教育数字化转型已经成为不可忽视的趋势。随着技术的不断发展,智慧校园软件正日益受到教育机构的关注。那么,为什么选择智慧校园软件能够成为实现教育数字化转型的最佳解决方案呢? 首先,智慧校园软件为教…

用langchain搭配最新模型ollama打造属于自己的gpt

langchain 前段时间去玩了一下langchain,熟悉了一下大模型的基本概念,使用等。前段时间meta的ollama模型发布了3.0,感觉还是比较强大的,在了解过后,自己去用前后端代码,调用ollama模型搭建了一个本地的gpt应用。 核心逻辑 开始搭…

七天进阶elasticsearch[one]

elasticSearch 概述 Elasticsearch是一个近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个很小的延迟(通常是一秒) 集群 一个集群就是由一个或多个节点组织在一起, 它们共同持有你全部的数据&#x…

初识 MyBatis 【MyBatis 核心概念】

MyBatis 简介: MyBatis 是一个优秀的持久层框架,它对JDBC操作数据库的过程进行封装,使开发者只需要关注sql本身,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyB…

【人工智能】第五部分:ChatGPT的实际应用案例和未来发展方向

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

解决vscode终端不显示conda环境变量名称问题【详细步骤!实测可行!!】

最近在使用Visual Studio Code (VSCode) 时候,发现终端没有正确显示激活的conda环境名称,搜了一下,找到原因,记录一下,如果有人也遇到同样的问题,可以收藏一下。   分别两种情况,一是windows系…

SpringBoot+Vue在线视频课程网站(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户教师管理员 系统功能截图

2.1.4 采用配置类与注解方式使用MyBatis

实战概述:采用配置类与注解方式使用MyBatis 创建MyBatis配置类 在net.huawei.mybatis.config包中创建MyBatisConfig类,用于配置MyBatis核心组件,包括数据源、事务工厂和环境设置。 配置数据源和事务 使用PooledDataSource配置MySQL数据库连接…

基于LabVIEW虚拟示波器设计

随着计算机技术的发展,传统仪器开始向计算机化的方向发展。虚拟仪器是90年代提出的新概念。虚拟仪器技术的提出与发展,标志着二十一世纪自动测试与电子测量仪器领域技术发展的一个重要方向。所谓虚拟仪器,就是在通用的计算机平台上定义和设计…

《UDS协议从入门到精通》系列——图解0x23:通过地址读取内存

《UDS协议从入门到精通》系列——图解0x23:通过地址读取内存 一、简介二、数据包格式2.1 服务请求格式2.2 服务响应格式2.2.1 肯定响应2.2.2 否定响应 三、通信示例 Tip📌:本文描述中但凡涉及到其他UDS服务的,将陆续提供链接跳转方…

electron自定义顶部

我的项目是采用的electron-vite搭建的,希望下面的内容可以给你带来帮助 自定义菜单栏Vue <template><div class"title-bar"><div class"left-section"><img src"../assets/icon.png" alt"Icon" class"icon…

idea 常用插件推荐

文章目录 1、Lombok2、Convert YAML and Properties File3、Grep Console4、MyBatisX5、Free MyBatis Tool6、MyBatis Log EasyPlus &#xff08;SQL拼接&#xff09;7、MyBatisPlus8、Eclipse theme9、Eclipse Plus Theme10、Rainbow Brackets Lite - Free and OpenSource&…

在大模型落地这件事上,智谱玩出花了

大数据产业创新服务媒体 ——聚焦数据 改变商业 2024年6月5日&#xff0c;仅仅用了一上午的功夫&#xff0c;智谱就连发了三个产品&#xff0c;分别是智谱清言、GLM4-9B、智谱MaaS平台。 在这次的发布会与智谱在2024年1月16日开的发布会不太一样&#xff0c;后者更注重技术分享…

计算机网络 期末复习(谢希仁版本)第1章

大众熟知的三大网络&#xff1a;电信网络、有线电视网络、计算机网络。发展最快起到核心的是计算机网络。Internet是全球最大、最重要的计算机网络。互联网&#xff1a;流行最广、事实上的标准译名。互连网&#xff1a;把许多网络通过一些路由器连接在一起。与网络相连的计算机…

QT 使用信号和槽,让QLabel的内容实时与QLineEdit同步,类似vue框架的双向绑定

在窗口里放置一个单行文本编辑器&#xff08;QLineEdit&#xff09;和一个标签控件&#xff08;QLabel&#xff09;&#xff0c;实现的效果就是当编辑器的内容被编辑时&#xff0c;标 签控件同步显 示编辑控件里的内容 1&#xff09;当 lineEdit 控件被用户编辑时&#xff0c;它…

【Java数据结构】二叉树详解(四)

&#x1f512;文章目录&#xff1a; 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 2.1第一种思路 2.2第二种思路 3.根据一棵树的前序遍历与中序遍历构造二叉树 4.根据一棵树的中序…

【Web API DOM03】事件监听

一&#xff1a;什么是事件监听 指程序检测有无某一事件发生&#xff0c;如果发生&#xff0c;就调用一个函数做出反应&#xff1b;也称为绑定事件或注册事件 比如鼠标经过显示下拉菜单、点击侧边栏播放轮播图 二&#xff1a;怎么用事件监听 1 语法规范&#xff1a; 元素对…