Java——IO:输入输出流技术

news2024/9/30 11:12:36

简介

在java中,数据的输入输出都是以流的方式来处理。

流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。

JDK中与输入/输出有关的包和类都放在java.io包里面,其中有5个重要的抽象类。

  1. InputStream     :以此结尾的都是字节输入流
  2. OutputStream  :以此结尾的都是字符输出流
  3. Reader             :以此结尾的都是字符输入流
  4. Writer               :以此结尾的都是字符输出流
  5. File                  

IO流可按照一下三个方面划分

  • 按数据流的方向:输入流、输出流
  • 按处理数据单位:字节流、字符流
  • 按功能:节点流、处理流

字节流:操作的单元是数据单元为8位的字节

字符流:操作的单元是数据单元为16位的字符

Java的字符采用的Unicode标准,在这里面一个英文是一个字节,一个中文是两个字节

Java中最基本的流就是字节流,但是为了更方便的处理双字节的中文字符,java推出了字符流,

提供了Reader,Writer类及其之类,可以方便的实现字节流和字符流的相互转换、字符流的读/写等等操作。

字符流和字节流的区别:

  1. 字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。用一句话说就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。
  2. 字节流本身没有缓冲区,缓冲字节流相对于字节流,效率提升非常高。而字符流本身就带有缓冲区,缓冲字符流相对于字符流效率提升就不是那么大了。详见文末效率对比

关于其他的还有什么缓冲流之类的之后用到了再回来补充

完整IO分类图:

 File类

File类可以用于获取和处理与磁盘文件和文件夹相关的信息和操作,对文件内容的存取通常由

FileInput、FileOutputStream、FileReader、FileWriter等类实现。

File是对文件和文件夹的一种抽象表示(引用或指针)。File类的对象可能指向一个存在的文件或文件夹,也可能指向一个不存在的文件或文件夹。

public class test {
    public static void main(String[] args) {
        File f=new File("src\\chap_IO\\test.java");
        System.out.println("f.exists()="+f.exists());  //判断指向文件是否存在
        System.out.println("f.isDirectory()="+f.isDirectory());  //判断指向的是不是文件夹或者说目录
        System.out.println("f.length()="+f.length());   //输出指向文件的内容长度
        System.out.println("f.getName()="+f.getName());  //获取指向文件或文件夹的名字
        System.out.println("f.getParent()"+f.getParent()); //获取到上一级位置的路径
        System.out.println("f.getPath()"+f.getPath());  //获取当前文件所在路径
        File f1=new File("src\\chap_IO\\hb\\hd");
        //mkdirs可以一次性创建多个嵌套文件夹
        f1.mkdirs();
        File f2=new File("src\\chap_IO\\hc\\dp.txt");
        //mkdir一次只能创建一个文件夹
        f2.mkdir();
    }
}

输出如下所示

IO流的使用 

文件字节流(FileInputStream和FileOutStream)

FileInputStream用于从本地文件系统中的一个文件读取直接数据,但并不适合读取文本文件中的字符信息,若含有中文字符,则容易出现乱码。

如下代码利用字节流实现的文件的复制。

package chap_IO;

import java.io.*;

public class test {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("H:\\天天相册\\Elf1-1.mp4");
        FileOutputStream fos=new FileOutputStream("H:\\天天相册\\里番\\Elf1-1.mp4"); //这里这个文件是不存在的,传的时候会自动创建
        System.out.println("文件大小:"+fis.available());
//        1.一个字节一个字节的读/写,直到文件结尾-1,效率低
//        int b=0;
//        while((b=fis.read())!=-1)  //一个字节一个字节传太慢了,我174mb的视频估计都要传个10多分钟。
//        {
//            fos.write(b);
//        }
//        fis.close();
//        fos.close();
//        2.一次读取一个数组的数据,效率高
        int b=0;
        byte[] ba=new byte[1024];   //1mb的大小一两秒就传完了,但是我的视频却放不了了,悲
        while((b=fis.read(ba))!=-1)
        {
            fos.write(ba,0,ba.length-1);//指定数组以及数组的长度
        }
        fis.close();
        fos.close();
    }
}

 第一种方法传的慢,但是传的视频确实可以播放,第二种方法传的快但是直接损坏视频了,

不清楚传别的ppt之类的东西会不会损坏。

 文件字符流(FileReader和FileWriter)

InputStreamReader是字节流通向字符流的桥梁。

InputStreamReader可以使用指定的charset将读取的字节流解码为字符流。为了进一步提高读取数据的效率,可以将字符流包装为BufferedReader类,举例如下:

        InputStream is =new FileInputStream("H:\\天天相册2\\天使\\天使☆纷扰 RE-BOOT!\\游戏启动必看.txt");
        Reader r=new InputStreamReader(is,"UTF-8");
        BufferedReader br=new BufferedReader(r);
        String s=br.readLine();
        System.out.println(s);

输出如下:

文档内容其实不止这么点,但是这个只读取了第一行,所以只输出了这点。

利用文件字符流实现文件的复制。

利用FileReader和RileWriter实现文件复制功能

public class test {
    public static void main(String[] args) throws IOException {
        FileReader fr=new FileReader("C:\\Users\\Administrator\\Desktop\\名单.txt");
        FileWriter fw=new FileWriter("C:\\Users\\Administrator\\Desktop\\名单备份.txt");
//        1.一个字符一个字符的读写,直到读到文件尾时返回-1,效率低下
//        这里还不能读取中文,会乱码的
//        int ch=0;
//        while((ch=fr.read())!=-1)
//        {
//            fw.write((char)ch);
//        }
//        fr.close();
//        fw.close();
        //2.一次读取一个字符数组,效率更高
        char[] ca=new char[1023];
        int n=0;
        while((n=fr.read(ca))!=-1)
        {
            fw.write(ca,0,ca.length-1);
        }
        fr.close();
        fw.close();
    }
}

 利用带缓冲区的字符流实现文件的复制

使用BufferedReader和BufferedWriter实现文件的复制功能,效率更高,操作更加简便。

还是会乱码。

public class test {
    public static void main(String[] args) throws IOException {
        FileReader fr=new FileReader("C:\\Users\\Administrator\\Desktop\\名单.txt");
        BufferedReader br=new BufferedReader(fr);
        FileWriter fw=new FileWriter("C:\\Users\\Administrator\\Desktop\\名单备份.txt");
        BufferedWriter bw=new BufferedWriter(fw);

        String s;
        while((s=br.readLine())!=null)
        {
            System.out.println(s);
            bw.write(s);
            bw.newLine();
        }
        bw.flush();
        fr.close();fw.close();
        br.close();bw.close();
    }
}

以上使用文件字节流和文件字符流的输入输出还没解决中文乱码问题,等之后有空了想起来再回来解决。

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

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

相关文章

Renesas瑞萨A4M2和STM32 CAN通信

刚好拿到一块瑞萨开发板,捣鼓玩下CAN,顺便试下固件升级。 A4M2 工程创建 详细可以参考,我之前写的文章 Renesa 瑞萨 A4M2 移植文件系统FAT32 CAN0 配置信息,使能FIFO,接收标准帧 ID为0x50,数据帧。 代…

汇编语言学习笔记六

flag 寄存器 CF:进位标志位,产生进位CF1,否则为0 PF:奇偶位,如010101b,则该数的1有3个,则PF0,如果该数的1的个数为偶数,则PF1。0也是偶数 ZF:在相关指令执行后(运算和逻辑指令,传送指…

yml、xml、json文件

目录 一、yml (1)注释 (2)内容语法 (3)取名规范 二、xml (1)注释 (2)内容语法 声明头 标签 关于cdata 三、json (1)注释 …

MySQL库和表

MySQL库操作 创建数据库 语法 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name说明: 大写的表示关键字[ ]是可选项CHARACTER…

axios使用笔记

文章目录 基本语法其他语法defaults config作用案例 创建实例对象作用案例 拦截器 interceptor&#xff08;AOP&#xff09;请求取消&#xff08;节流&#xff09; 基本语法 <!doctype html> <html lang"en"> <head><meta charset"UTF-8&…

ADRC自抗扰算法优化(PLC梯形图篇)

ADRC自抗扰算法PLC梯形图完整源代码请参看下面博客文章: ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法_RXXW_Dor的博客-CSDN博客PLC的自抗扰控制(ADRC)算法_RXXW_Dor的博客-CSDN博客_adrc算法1、自抗扰控制算法,网上很多文章有所讲解,大家也可以关注韩京清…

6WINDGate-overview

6WINDGate Overview Author&#xff1a;Once Day Date&#xff1a;2023年4月29日 本文是对6WIND官网文档的整理和翻译&#xff0c;仅供学习和研究之用&#xff0c;原始文章可参考下面文档&#xff1a; 6WINDGate Documentation - 6WIND6WINDGate Modules — 6WINDGate Modul…

武忠祥老师每日一题||定积分基础训练(三)

常用的基本不等式&#xff1a; sin ⁡ x < x < t a n x , x ∈ ( 0 , π 2 ) \sin x<x<\ tan x,x\in(0,\frac{\pi}{2}) sinx<x< tanx,x∈(0,2π​) e x ≥ 1 x , x ∈ ( − ∞ , ∞ ) e^x\ge1x,x\in(-\infty,\infty) ex≥1x,x∈(−∞,∞) x 1 x ≤ ln …

Ubuntu20.04 交叉编译Paddle-OCR

第一步&#xff1a;交叉编译Paddle-Lite 参考链接&#xff1a;https://blog.csdn.net/sz76211822/article/details/130466597?spm1001.2014.3001.5501 第二步&#xff1a;交叉编译opencv4.x 参考链接&#xff1a;https://blog.csdn.net/sz76211822/article/details/13046168…

浅聊AIOT

引言 IoT是(Internet of Things)的简称&#xff0c;也就是人们常说的物联网&#xff1b;随着智能硬件的发展和推广&#xff0c;制造成本也随之下降&#xff0c;很多的厂家也慢慢地拥抱网络互联&#xff0c;逐步实现设备互联&#xff0c;也就进入了人们常说的万物互联时代。虽然…

linux网络统计指令:netstat

这里写自定义目录标题 一 netstat的作用以及安装命令1.1 作用1.2 安装命令 二 基本语法1.1 netstat -a1.2 netstat -e1.3 netstat -anp 三 查看指定端口的使用状况 一 netstat的作用以及安装命令 1.1 作用 主要用于显示IP和TCP、UDP与ICMP相关的统计数据&#xff0c;一般用于…

C++笔记——第十五篇 C++11来了 (上)

目录 1. C11简介 2. 列表初始化 2.1 C98中{}的初始化问题 2.2 内置类型的列表初始化 2.3 自定义类型的列表初始化 1. 标准库支持单个对象的列表初始化 2. 多个对象的列表初始化 3. 变量类型推导 3.1 为什么需要类型推导 3.2 decltype类型推导 3.2.1 为什么需要dec…

微服务全链路追踪选型:Zipkin、Pinpoint、SkyWalking、CAT

基于微服务架构&#xff0c;由于服务拆分粒度比较细&#xff0c;并且服务复用范围增大&#xff0c;不太可能再通过人工登记的方式进行接口调用情况的管理&#xff0c;因此对于每个请求的调用情况追踪将成为不可忽视的问题。追踪请求的调用情况&#xff0c;主要有几个作用&#…

分布式一致性Hash算法原理及实现【负载均衡】

文章目录 一致性Hash原理提高容错性和和扩展性一致性Hash实现思路代码 一致性Hash原理 简单来说&#xff0c;一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环&#xff0c; 如假设某哈希函数 H 的值空间为 0 ~ 2^32-1&#xff08;即哈希值是一个32位无符号整形&#xff09;…

什么是POTDR?POTDR在光缆线路维护中有哪些应用

1 引言 OTDR&#xff08;Optical Time Domain Reflectometer&#xff0c;光时域反射仪&#xff09;是光缆线路工程及维护中的常用仪表&#xff0c;是利用光信号在光纤中传输时的瑞利散射和菲涅尔反射&#xff0c;通过反射曲线来了解光纤沿长度的损耗分布情况&#xff0c;可测量…

基于C#编程建立泛型Matrix数据类型及对应处理方法

一、简介 上一篇文档中描述了如何写一个Vector<T>类&#xff0c;本次在上一篇文档基础上&#xff0c;撰写本文&#xff0c;介绍如何书写一个泛型Matrix&#xff0c;可以应用于int、double、float等C#数值型的matrix。 本文所描述的Matrix<T>是一个泛型&#xff0c;…

一个人在家怎么赚钱?普通人如何通过网络实现在家就能赚钱

近年来&#xff0c;随着互联网的飞速发展&#xff0c;嗅觉敏锐的人只要使用互联网就可以快乐地赚钱。一般来说&#xff0c;网上赚钱的投资较少&#xff0c;有时有一台能上网的电脑或手机就够了&#xff0c;所以大家有时称其为“无成本或低成本网赚”。今天就分享一个人在家如何…

23种设计模式第一章:单例模式

这里写自定义目录标题 一 单例模式1 静态常量饿汉式2 静态代码块饿汉式3 线程不安全懒汉式4 线程安全懒汉式线程安全&#xff0c;同步方法线程安全&#xff0c;同步代码块 5 doubleCheck&#xff08;双重检查&#xff0c;推荐使用&#xff09;6 静态内部类7 枚举 一 单例模式 …

K8s 安全是云安全的未来

导语 到 2025 年&#xff0c;保护 Kubernetes (K8s) 将被认为是云安全最重要的方面。 在最成功的组织中&#xff0c;CTO 和 CISO 已经意识到 Kubernetes 安全的重要性。 但是&#xff0c;虽然 Kubernetes 已经占 CTO 云支出的很大一部分&#xff0c;但 CISO 仍然有所落后。 大…

基于web的课程重难点掌握情况分析系统

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…