Java中的IO流字节流(FileOutputStream与FileInputStream)+编码与解码

news2024/11/25 4:46:00

目录

​编辑

IO流

File0utputstream 

FileOutputstream写数据的3种方式

void write(int b)     一次写一个字节数据

void write(byte[] b)     一次写一个字节数组数据

void write(byte[] b,int off,int len)   一次写一个字节数组的部分数据 

FileOutputstream写数据的两个小问题

该如何换行呢?

FilelnputStream

文件拷贝

编码与解码

编码 

解码 


 IO流

Java中的IO流是用于输入和输出数据的工具。Java的IO流分为字节流和字符流两种类型。

字节流可以操作所有类型的文件   

字符流可以操作纯文本文件(纯文本文件就是windows自带的笔记本打开能读懂的)

字节流:

  • InputStream和OutputStream:用于读取和写入二进制数据(字节)。
  • FileInputStream和FileOutputStream:用于读取和写入文件的字节流。
  • ByteArrayInputStream和ByteArrayOutputStream:用于读写字节数组的字节流。
  • BufferedInputStream和BufferedOutputStream:用于提供带缓冲的字节流,提高IO性能。

字符流:

  • Reader和Writer:用于读取和写入字符数据。
  • FileReader和FileWriter:用于读取和写入文件的字符流。
  • CharArrayReader和CharArrayWriter:用于读写字符数组的字符流。
  • BufferedReader和BufferedWriter:用于提供带缓冲的字符流。

File0utputstream 

字节输出流,可以把程序中的数据写到本地文件上,是字节流的基本流 

写出一段文字到本地文件中。👇

package io;


import java.io.FileOutputStream;
import java.io.IOException;

public class ioDemo1 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos=new FileOutputStream("..\\Myio\\a.txt");
        fos.write(97);
        fos.close();
    }
}

如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。 

 

如果文件已经存在,则会清空文件👇 

运行之后👇 

字节输出流:

1.创建字节输出流对象

  • 参数是字符串表示的路径或者是File对象都是可以的
  • 如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
  • 如果文件已经存在,则会清空文件

2.写数据

write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

每次使用完流之后都要释放资源

FileOutputstream写数据的3种方式

void write(int b)     一次写一个字节数据
void write(byte[] b)     一次写一个字节数组数据
void write(byte[] b,int off,int len)   一次写一个字节数组的部分数据 

void write(int b)     一次写一个字节数据

void write(byte[] b)     一次写一个字节数组数据

package io;


import java.io.FileOutputStream;
import java.io.IOException;

public class ioDemo1 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos=new FileOutputStream("..\\Myio\\a.txt");
        byte[] bytes={97,98,99};
        fos.write(bytes);
        fos.close();
    }
}

 

void write(byte[] b,int off,int len)   一次写一个字节数组的部分数据 

 参数一:数组,参数二:起始索引,参数三:个数

package io;


import java.io.FileOutputStream;
import java.io.IOException;

public class ioDemo1 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos=new FileOutputStream("..\\Myio\\a.txt");
        byte[] bytes={97,98,99};
        fos.write(bytes,1,2);
        fos.close();
    }
}

FileOutputstream写数据的两个小问题

该如何换行呢?

package io;

import java.io.FileOutputStream;
import java.io.IOException;

public class ioDemo2 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("..\\Myio\\a.txt");
        //写出数据
        String str = "niihao";
        byte[] bytes1 = str.getBytes();
        fos.write(bytes1);
        String str2="\n";
        byte[] bytes2 = str2.getBytes();
        fos.write(bytes2);
        String str3="csdn";
        byte[] bytes3 = str3.getBytes();
        fos.write(bytes3);
        //释放资源
        fos.close();
    }
}

这里的\n为换行 

 

那又该如何续写?再次运行不会清空上次的数据呢?

package io;

import java.io.FileOutputStream;
import java.io.IOException;

public class ioDemo2 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("..\\Myio\\a.txt",true);
        //写出数据
        String str = "niihao";
        byte[] bytes1 = str.getBytes();
        fos.write(bytes1);
        String str2="\n";
        byte[] bytes2 = str2.getBytes();
        fos.write(bytes2);
        String str3="csdn";
        byte[] bytes3 = str3.getBytes();
        fos.write(bytes3);
        //释放资源
        fos.close();
    }
}

 

如果想要续写。打开续写开关即可开关位置:创建对象的第二个参数

默认false:表示关闭续写,此时创建对象会消空文件手动传递true:表示打开续写,此时创建对象不

会清空文件

FilelnputStream

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来 

1、创建字节输入流对象

如果文件不存在,就直按报错。

2.写数据

一次读一个字节,读出来的是数据在ASCII上对应的数字

读到文件末尾了,read方法返回-1。

3.释放资源
细节:每次使用完流之后都要释放资源

 

package inputio;

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

public class inputDemo1 {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        FileInputStream fis=new FileInputStream("..\\Myio\\b.txt");
        //读取数据
        int r1 = fis.read();
        System.out.println(r1);
        int r2 = fis.read();
        System.out.println(r2);
        int r3 = fis.read();
        System.out.println(r3);

        int r4 = fis.read();
        System.out.println(r4);
        //释放资源
        fis.close();
    }
}

 

可以看到最后一次读到文件末尾了,read方法返回-1。

字节输入流的循环读取👇

package inputio;

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

public class inputDemo2 {
    public static void main(String[] args) throws IOException {
        //创建字节输入流对象
        FileInputStream fis=new FileInputStream("..\\Myio\\b.txt");
        int b=0;
        //循环读取
        while((b=fis.read())!=-1){
            System.out.println((char)b);
        }
        //释放资源
        fis.close();
    }

}

一次读取多个字节数据,具体读多少,跟数组的长度有关

返回值:本次读取到了多少个字节数据

package inputio;

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

public class inputDemo3 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("..\\Myio\\a.txt");
        byte[] bytes=new byte[2];
        int len1 = fis.read(bytes);
        String str1=new String(bytes);
        System.out.println(str1);
        System.out.println(len1);
        System.out.println("----------------------");
        int len2 = fis.read(bytes);
        String str2=new String(bytes);
        System.out.println(str2);
        System.out.println(len2);
        System.out.println("----------------------");
        int len3 = fis.read(bytes);
        String str3=new String(bytes);
        System.out.println(str3);
        System.out.println(len3);
        System.out.println("----------------------");
        int len4 = fis.read(bytes);
        String str4=new String(bytes);
        System.out.println(str4);
        System.out.println(len4);
        fis.close();
    }
}

 

第3次读取到的数据为什么是ed呢?

这是第一次读取到的👇len为2

这是第二次读取到的👇len为2

a跟b都被覆盖了

这是第三次读取👇len为1

可以发现c被覆盖了,d没有被覆盖,这是因为只读取到了一个数据

还可以给这个代码优化一下

package inputio;

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

public class inputDemo3 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("..\\Myio\\a.txt");
        byte[] bytes=new byte[2];
        int len1 = fis.read(bytes);
        String str1=new String(bytes,0,len1);
        System.out.println(str1);
        System.out.println(len1);
        System.out.println("----------------------");
        int len2 = fis.read(bytes);
        String str2=new String(bytes,0,len2);
        System.out.println(str2);
        System.out.println(len2);
        System.out.println("----------------------");
        int len3 = fis.read(bytes);
        String str3=new String(bytes,0,len3);
        System.out.println(str3);
        System.out.println(len3);
       
        fis.close();
    }
}

 

文件拷贝

将abc拷贝进a.txt中

package inputio;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IODemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("D:\\b.txt");
        FileOutputStream fos=new FileOutputStream("..\\Myio\\a.txt");
        int b=0;
        while((b=fis.read())!=-1){
            fos.write(b);
        }
        fos.close();
        fis.close();
    }
}

 

但是这样写对于文件过大的情况,运行的会非常的慢

下面我们来优化一下

package inputio;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IODemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("D:\\b.txt");
        FileOutputStream fos=new FileOutputStream("..\\Myio\\a.txt");
        //这里的大小设置为1024的整数倍就好了
        byte[] bytes=new byte[1024];
        int len=0;
        while ((len=fis.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        fos.close();
        fis.close();
    }
}

编码与解码

我们先了解一下这个👇

GBK字符集完全兼容ASCII字符集

一个英文占一个字节,二进制第一位是0

一个中文占两个字节,二进制高位字节的第一位是1

以下为GBK字符集中编码之后的二进制,请说出有几个中文,几个英文

Unicode字符集的UTF-8编码格式

一个英文占一个字节,二进制第一位是0,转成十进制是正数

一个中文占三个字节,二进制第一位是1,第一个字节转成十进制是负数

Java中编码的方法

  • public byte[] getBytes()                使用默认方式进行编码
  • public byte[]getBytes(string charsetName)                        使用指定方式进行编码

Java中解码的方法

  • string(byte[] bytes)        使用默认方式进行解码
  • string(byte[] bytes,string charsetName)                使用指定方式进行解码 

编码 

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class ioDemo1 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str="ai你呀";
        byte[] bytes1 = str.getBytes();
        System.out.println(Arrays.toString(bytes1));

        byte[] bytes2 = str.getBytes("GBK");
        System.out.println(Arrays.toString(bytes2));
    }
}

Java默认的是UTF-8

解码 

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class ioDemo1 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //编码
        String str="ai你呀";
        byte[] bytes1 = str.getBytes();
        System.out.println(Arrays.toString(bytes1));
        //解码
        String s1 = new String(bytes1);
        System.out.println(s1);

        String s2 = new String(bytes1, "GBK");
        System.out.println(s2);
    }
}

 

UTF-8一个英文占一个字节,一个中文占三个字节

 

GBK字符集一个英文占一个字节一个中文占两个字节

 


IO流的字节流就先说到这啦!!!感谢各位观看

字节流在这👇

 想先占个位😀

 

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

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

相关文章

MathType 7.8最新版核心功能特性 及免费汉化版安装包下载地址

大家好!今天我要给大家种草一个非常实用的数学公式编辑器——MathType 7.8!作为一名软件评测专家,我对这款软件进行了详细的测试和试用,下面来给大家分享一下我的使用体验。 我们来说说MathType 7.8的核心特性吧!它是一…

智能网联汽车信息安全风险识别与应对策略研究综述

摘要:随着智能网联汽车技术的飞速发展,其信息安全问题逐渐成为公众关注的焦点。本文概述了智能网联汽车技术的发展背景和信息安全风险的来源,采用STRIDE威胁分析方法对智能网联汽车的四层模型进行风险识别,进一步探讨了抗女巫攻击…

进口电动流量调节阀的选型-美国品牌

进口电动流量调节阀的选型需要综合考虑多个因素,以确保所选阀门能够满足实际应用需求。以下是选型时需要考虑的主要方面: 一、明确应用需求 工作介质:了解介质的性质,包括流体类型、温度、压力以及是否具有腐蚀性或特殊性质。流…

6.7.11 一种新的迁移学习方法可提高乳房 X 线摄影筛查中乳腺癌的诊断率

分割是一种将图像分割成离散区域的技术,以便将感兴趣的对象与周围环境分开。为了制定治疗计划,分割可以帮助医生测量乳房中的组织量。 二元分类问题的目的是将输入数据分为两组互斥的数据。在这种情况下,训练数据根据要解决的问题以二进制格…

基于JSP技术的网络视频播放器

你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:JSP技术 工具:IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员界面 用户界…

2024年G3锅炉水处理证考试题库及G3锅炉水处理试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年G3锅炉水处理证考试题库及G3锅炉水处理试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大纲随机…

大模型管理工具Ollama搭建及整合springboot

目录 一、Ollama介绍 1.1 什么是Ollama 1.2 Ollama特点与优势 二、Ollama本地部署 2.1 版本选择 2.2 下载安装包 2.3 执行安装 2.4 Ollama常用命令 三、使用Ollama部署千问大模型 3.1 千问大模型介绍 3.2 部署过程 四、springboot接入Ollama 4.1 引入Ollama依赖 4…

最小栈、栈的弹出(C++)

1.最小栈 思路分析: 代码: class MinStack { public:MinStack() {}void push(int val) {st.push(val);//两种情况需要更新最小值//1.最小栈为空(就是存最小值的那个栈)//2.插入的值小于或等于最小栈的栈顶元素if(minstack.empty()||minstack.top()>…

将10个整数按由小到大的顺序排列

在之前的文章中介绍过可以用数组名作函数的参数,并多次强调:数组名代表数组首元素的地址。用数组名作函数的参数,传递的是数组首元素的地址。很容易推想:用指针变量作函数形参,同样可以接收从实参传递来的数组首元素的…

Tongweb7重置密码优化版*(by lqw )

如图所示,输入初始密码是会报错的,说明已经修改了密码 首先我们先备份一下tongweb的安装目录,避免因为修改过程中出现的差错而导致tongweb无法启动: 备份好了之后,我们关闭掉tongweb。 方式一: Cd 到tong…

C盘满了怎么办,Windows11的C盘没有磁盘清理选项怎么办,一次搞定

问题: 太久没清电脑了,满的跟垃圾堆一样。。。C盘红色看上去很不妙。 一. C盘满了怎么办: 1. 删除临时文件 找到 C:\Windows\Temp,进入Temp资料夹,选中所有文件夹和文件,按下ShiftDelete键,彻…

推荐系统三十六式学习笔记:原理篇.内容推荐05|从文本到用户画像有多远?

目录 从文本开始构建用户画像一、结构化文本1、TF-IDF2、TextRank3、内容分类:4、实体识别5、聚类6、词嵌入 二、标签选择1、卡方检验2、信息增益 总结 对于一个早期的推荐系统来说,基于内容推荐离不开用户构建一个初级的画像,这种初级的画像…

攻防世界---misc---小小的PDF

1、题目描述,下载附件是一个PDF,打开之后是这样,有两页PDF 2、用winhex分析,没有发现奇怪的地方 3、在kali中binwalk发现有多张照片 4、接着使用foremost将图片分离出来, 5、得到3张图片,打开第3张图片&am…

数字滤波器和模拟滤波器(一)

模拟滤波器和数字滤波器(一) 下面介绍模拟滤波器和数字滤波器的频率响应的异同,以及如何使用python地scipy.signal来绘制其频谱响应和冲激阶跃响应。在第二期将谈到如何设计模拟滤波器和数字滤波器。 在正文之间,应该介绍连续时…

Spark 性能调优——分布式计算

前言 分布式计算的精髓,在于如何把抽象的计算流图,转化为实实在在的分布式计算任务,然后以并行计算的方式交付执行。今天这一讲,我们就来聊一聊,Spark 是如何实现分布式计算的。分布式计算的实现,离不开两个…

Shell脚本学习_字符串变量

目录 1.Shell字符串变量:格式介绍 2.Shell字符串变量:拼接 3.Shell字符串变量:字符串截取 4.Shell索引数组变量:定义-获取-拼接-删除 1.Shell字符串变量:格式介绍 1、目标: 能够使用字符串的三种方式 …

详解linux设备下的/dev/null

/dev/zero是一个特殊的设备文件,它在Linux系统中通常被用来生成无限数量的零数据流。 这个设备文件位于/dev目录下,它不代表任何实际的硬件设备,而是一个虚拟设备。 当从/dev/zero设备中读取数据时,会得到无限数量的零字节&…

JAVA开发的一套(智造制造领航者云MES系统成品源码)saas云MES制造执行系统源码,全套源码,支持二次开发

JAVA开发的一套(智造制造领航者云MES系统成品源码)saas云MES制造执行系统源码,全套源码,支持二次开发 1990年11月,美国先进制造研究中心AMR(Advanced Manufacturing Research)就提出了MES&#…

进程通信(IPC-Inter Process Communication)

进程之间的通信通过内核空间实现 IPC技术 ①管道(匿名管道/命名管道-FIFO队列) ②System V IPC(消息队列、信号量和共享内存) ③套接字(UNIX套接字&Internet套接字) ※信号 软中断,信号提供了一种处理异步事件的方法,作为进程通信的一种机制&am…

D455相机RGB与深度图像对齐,缓解相机无效区域的问题

前言 上一次我们介绍了深度相机D455的使用:intel深度相机D455的使用-CSDN博客,我们也看到了相机检测到的无效区域。 在使用Intel深度相机D455时,我们经常会遇到深度图中的无效区域。这些无效区域可能由于黑色物体、光滑表面、透明物体以及视…