文件传输基础——Java IO流

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、文件的编码
  • 二、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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动态IP基础解析:为什么我们需要它?

在深入探讨互联网世界的运作机制时,IP地址无疑是其核心要素之一。IP地址,作为网络设备的唯一标识,不仅确保了数据的准确传输,更是网络安全和管理的基石。本文将深入解析动态IP的基础知识,并探讨其重要性及在多种场景下…

【协同感知】Collaborative Perception in Autonomous Driving数据集与论文整理

Collaborative Perception in Autonomous Driving 目前最全的Collaborative Perception整理数据集协同感知论文-【三维目标检测】现实世界下的协同感知理想条件下的协同感知 目前最全的Collaborative Perception整理 https://github.com/Little-Podi/Collaborative_Perception…

在Jenkins 中使用 NVM 管理 Node.js 部署项目的自动化脚本

在Jenkins 中使用 NVM 管理 Node.js 部署项目的自动化脚本 人生旅途,总有人不断地走来,有人不断地离去。当新名字变成老名字,当老的名字渐渐模糊,又是一个故事的结束和另一个故事的开始。 在现代软件开发中,持续集成/持…

【android】设置背景图片

改变值&#xff0c;可显示zai在 在theves下面的两个value都要增加名字代码 <item name"windowActionBar">false</item><item name"android:windowNoTitle">true</item><item name"android:windowFullscreen">tru…

《Navi日语社》App:日语学习与翻译的智能助手,支持日文OCR识别提取文字,无需打字对着说话就能翻译的日语语音翻译工具!

在全球化的今天&#xff0c;掌握一门外语已经成为许多人的必备技能。尤其是日语&#xff0c;不仅在学术、商务领域有着广泛的应用&#xff0c;也是许多旅行者和动漫爱好者的心头好。《Navi日语社》App&#xff0c;作为一款专为日语学习者和翻译需求者设计的移动应用&#xff0c…

书生·浦语大模型全链路开源体系-笔记作业4

XTuner 微调 LLM:1.8B、多模态、Agent 引自&#xff1a;Tutorial/xtuner/personal_assistant_document.md at camp2 InternLM/Tutorial GitHub 1. XTuner介绍 引自&#xff1a;欢迎来到 XTuner 的中文文档 — XTuner 0.1.18.dev0 文档 1.1. 什么是 XTuner &#xff1f; X…

四、Window整理右键扩展

一、桌面右键和文件右键扩展整理 简而言之整理下面图示内容 桌面右键&#xff1a; 对文件右键&#xff1a; 工具&#xff1a;火狐自带工具 二、新建扩展管理 简而言之整理下面图示内容 Win R输入regedit 寻找&#xff1a;计算机\HKEY_CURRENT_USER\Software\Microsof…

Padstack制作贴片和通孔焊盘

Padstack制作贴片和通孔焊盘 一、贴片焊盘制作 先选择SMD Pin&#xff0c;下面的pad geometry根据需求选择&#xff0c;一般是Circle和Rectangle&#xff0c;然后选择单位&#xff0c;mm制。 然后点击Design Layers&#xff0c;只需要修改Regular Pad常规焊盘就行&#xff0c…

【深度解析GPT-4o】:全面解析新一代AI技术的突破与优势

目录 ​编辑 1.版本对比&#xff1a;从GPT-3到GPT-4&#xff0c;再到GPT-4o的飞跃 1.1 模型规模的扩展 1.2 训练数据的更新 1.3 算法优化与效率提升 1.4 案例分析 2.技术能力&#xff1a;GPT-4o的核心优势 2.1 卓越的自然语言理解 2.1.1 上下文理解能力 2.1.2 语义分…

vscode运行Java utf-8文件中文乱码报错

问题现象 vscode 运行utf-8 java文,爆出如下错误 hello.java:5: &#xfffd;&#xfffd;&#xfffd;&#xfffd;: &#xfffd;&#xfffd;&#xfffd;&#xfffd;GBK&#xfffd;IJ&#xfffd;&#xfffd;&#xfffd;ӳ&#xfffd;&#xfffd;&#xfffd;ַ&a…

联想Y410P跑大模型

安装vs 2017 查看GPU版本 查看支持哪个版本的cuda windows cuda更新教程_cuda 12.0-CSDN博客 下载并安装cuda tookit 10.1 CUDA Toolkit 10.1 Update 2 Archive | NVIDIA Developer 找到下载的文件&#xff0c;安装 参考安装链接 Win10 Vs2017 CUDA10.1安装&#xff08;避坑…

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核 2024/6/6 10:51 0、整体编译&#xff1a; 1、cat android12-rk-outside.tar.gz* | tar -xzv 2、cd android12 3、. build/envsetup.sh 4、lunch rk3588_s-userdebug 5、./build.sh -AUCKu -d rk3588-toybrick-x0-a…

ArUco与AprilTag 标签

一、简介 在许多计算机视觉应用程序中&#xff0c;姿势估计非常重要&#xff1a;机器人导航&#xff0c;增强现实等等。 该过程基于发现真实环境中的点与其2d图像投影之间的对应关系。 这通常是一个困难的步骤&#xff0c;因此通常使用合成或基准标记来简化操作。 最受流行的…

Github Copilot登录账号,完美支持chat

Github Copilot 代码补全等功能&#xff0c;提高写代码的效率 https://web.52shizhan.cn/activity/copilot 登录授权后&#xff0c;已经可以使用&#xff0c;完美。如图

OpenCv之简单的人脸识别项目(动态处理页面)

人脸识别 准备九、动态处理页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.定义视频处理脚本4.定义相机抓取脚本5.定义关闭窗口的函数6.按钮设计6.1视频处理按钮6.2相机抓取按钮6.3返回按钮 7.定义关键函数8.动态处理…

Web前端

Web前端&#xff1a; 1.建立web开发的息维模式写代码不仅仅是为了实现某个功能&#xff0c;更是学习解决问题的思维方式 2.先使用&#xff0c;再理解&#xff0c;会导致刚开始比较懵&#xff0c;不知其所以然.切忌不可深陷其中&#xff0c; 3.涉及简单的软件工程的设计思想&…

您的游戏端被攻击了怎么办,德迅云安全的应用加速来帮您

游戏行业DDoS攻击的主要原因是因为游戏产品生命周期偏短&#xff0c;而DDoS供给成本又不高&#xff0c;只要发起攻击&#xff0c;企业为确保游戏稳定运营而不得不快速做出让步&#xff0c;致使敲诈勒索的成功率相对更高。在遭受DDoS攻击后&#xff0c;游戏公司的日损失甚至多达…

AI 绘画零基础想入门学习AIGC,该如何学习呢?

近年来&#xff0c;随着人工智能的兴起&#xff0c;人工智能逐渐进入制造业、医疗、服务业等越来越多的行业。这些行业大多是劳动密集型行业&#xff0c;大多数人认为人工智能只能在劳动密集型行业执行任务&#xff0c;而创意领域是人工智能的禁区。但实际情况是&#xff0c;人…

倍福:驱动电机两种控制方式对比

驱动电机两种控制方式对比 验证用修改Override值控制电机转速的实际效果 规定反复启动Mc_MoveVelocity功能块为方法一&#xff0c;修改Override值为方法二 control_drive.cpp #include <ros/ros.h> #include <geometry_msgs/Twist.h> #include "myAds.hpp&…

【基础】LwM2M 通讯协议

【基础】LwM2M 通讯协议 LwM2M 协议基础LwM2M 简介LwM2M 基本架构LwM2M 资源定义 LwM2M 协议实现开源协议实现Java LwM2M Client LwM2M 协议基础 LwM2M 简介 LwM2M 的全称为 Lightweight Machine-To-Machine&#xff0c;是一种适用于物联网设备的轻量级的通讯协议&#xff0c…