当前位置: 首页 > news >正文

Java I/O流详解

目录

字节流

字节输入流

字节输出流

字符流

字符输入流

字符输出流

Java流的综合应用:复制图片


作为一个Java的初学者,Java输入/输出流学习起来还是有些吃力的,因为分不清字节流/字符流,高级流/低级流,本章详细介绍Java中常见的输入输出流的使用。

在学习Java的I/O流之前,首先要掌握以下的几种概念:

①输入流、输出流

输入流用于读数据,输出流用于写数据。输入流分为字符输入流和字节输入流,输出流分为字符输出流和字节输出流。

②高级流(节点流)、低级流(处理流)

常见的3对低级流:FileInputStream/FileOutputStream、ByteArrayInputStream/ByteArrayOutputStream和网络流(通过socket.getInputStream()/socket.getOutputStream()得到的流),其余基本都是高级流。低级流主要用于读取数据,高级流主要对数据进行加工处理(如转换)。

③字符流、字节流

字符流分为字符输入流和字符输出流:Reader是所有字符输入流的超类;Writer是所有字符输出流的超类。

字节流分为字节输入流和字节输出流:InputStream是所有字节输入流的超类;OutputStream是所有字节输出流的超类。

④转换流

转换流就是将字节转为字符的流,InputStreamReader和OutPutStreamWriter是所有输入/输出转换流的超类。

重点:怎么区分一个类是什么类型的流呢?看后缀

1、以InputStream结尾的是字节输入流

2、以OutputStream结尾的是字节输出流

3、以InputStreamReader结尾的是输入转换流

4、以OutPutStreamWriter结尾的是字符输出转换流

5、以Reader结尾的是字符输入流

6、以Writer结尾的是字符输出流

字节流

字节输入流

字节输入流用于读取文件,文件内容可以是文本和多媒体文件(音乐、视频等)

/**
 * 读取src下的demo.txt文件的内容并在控制台打印
 */
public class FISExample {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("src/demo.txt");
        int len;
        while((len = fis.read()) != -1) {
            System.out.print((char) len);
        }
        fis.close();
    }

}

字节输出流

字节流用于向文件中写数据,如:复制图片

/**
 * 往src下的demo_cp.txt中写入Hello world
 */
public class FOSExample {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("demo_cp.txt");
        String text = "Hello world";
        byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
        
        fos.write(bytes);
        fos.close();
    }

}

字符流

字符输入流

字符输入流主要用于从文件中读取文本(字符串)

/**
 * 读取src下的demo.txt文件的内容并在控制台打印
 */
public class BufferReaderExample {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("src/demo.txt");
        BufferedInputStream bis = new BufferedInputStream(fis);
        InputStreamReader isr = new InputStreamReader(bis);
        BufferedReader reader = new BufferedReader(isr);

        String data;
        while ((data = reader.readLine()) != null) {
            System.out.println(data);
        }
        reader.close();
    }

}

字符输出流

字符输入流主要用于向文件中写字符串

/**
 * 往src目录下的文件demo_cp.txt中写入You are beautiful
 */
public class BufferWriterExample {
    public static void main(String[] args) throws FileNotFoundException {
        FileOutputStream fos = new FileOutputStream("src/demo.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        OutputStreamWriter osw = new OutputStreamWriter(bos);
        BufferedWriter br = new BufferedWriter(osw);
        PrintWriter writer = new PrintWriter(br, true);

        String data = "You are beautiful";
        writer.write(data);
        writer.close();
    }

}

Java流的综合应用:复制图片

/**
 * 把src下的图片susu.jpg复制一份,并命名为susu_cp.jpg
 */
public class IOStreamExample {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("src/susu.jpg");
        FileOutputStream fos = new FileOutputStream("src/susu_cp.jpg");

        int len;
        byte[] data = new byte[1024];
        while((len = fis.read(data)) != -1) {
            fos.write(data, 0, len);
        }
        fos.close();
        System.out.println("OK!");
    }

}

流的连接:低级流很少单独使用,一般都会连接一个或多个高级流。把一组高级流连接在一个低级流上称为流的连接,流的连接很重要,可以记住帮助我们记忆文件读写的实现代码。

相关文章:

  • T1051 分段函数(信息学一本通C++)
  • react ——withRouter——页面隐式传值—嵌套路由——渲染方式——自定义导航组件
  • MATLAB基础应用精讲-【论文写作篇】数学建模论文写作要点
  • R语言使用expand.grid函数生成多个变量的笛卡尔积组合、多个变量的所有水平(level)的组合
  • [架构之路-3]:架构师 - 软件架构师也是魔法师,架构师应具备的四大方面的技能
  • Java Boolean类中valueOf(String s)方法具有什么功能呢?
  • 一幅长文细学MongoDB(一)——MongoDB相关概念
  • 接口开发 — — RPC远程过程调用实现
  • JAMA子刊:孕妈妈每天喝半杯咖啡,可能让胎儿发育迟缓
  • Acrylamide-PEG-acid,ACA-PEG-COOH,丙稀酰胺-聚乙二醇-羧基可用于修饰多肽
  • 搭建个人的GPS定位系统
  • TorchProtein教程--蛋白质数据结构(2)
  • 动力学(dynamics)与动理学(kinetics)概念辨析
  • Vue | Object.defineProperty()、数据代理、计算属性、监视属性
  • 常见的排序总结
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • gulp 教程
  • laravel 用artisan创建自己的模板
  • MySQL-事务管理(基础)
  • node-glob通配符
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue总结
  • XForms - 更强大的Form
  • 官方解决所有 npm 全局安装权限问题
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 通信类
  • 我的业余项目总结
  • 学习HTTP相关知识笔记
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 由插件封装引出的一丢丢思考
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • elasticsearch-head插件安装
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​如何防止网络攻击?
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # 数论-逆元
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (C#)获取字符编码的类
  • (Forward) Music Player: From UI Proposal to Code
  • (Git) gitignore基础使用
  • (Oracle)SQL优化技巧(一):分页查询
  • (二)windows配置JDK环境
  • (篇九)MySQL常用内置函数
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET大文件上传知识整理
  • .NET企业级应用架构设计系列之技术选型
  • .php文件都打不开,打不开php文件怎么办