Java标准输入输出流【转换流打印流】

news2024/11/18 11:40:15

➤ Java 输入输出IO流 全部导航

文章目录

  • 乱码转换【转换流】
    • InputStreamReader
    • OutputStreamWriter
  • 打印流:
    • PrintStream
    • PrintWriter

类型默认设备
System.in 标准输入InputStream键盘
System.out 标准输出PrintStream显示器
System类的 public final static InputStream in = null;
		   public final static PrintStream in = null;
标准输入:
System.in  编译类型  InputStream
System.in  运行类型  BufferedInputStream

System.out.print(System.in.getClass());
输出为 class java.io.BufferedInputStream 

标准输出:
System.out  编译类型  PrintStream
System.out  运行类型  PrintStream

乱码转换【转换流】

字节流 ----> 字符流 即 转换流

通过一个例子引出乱码转换问题:

  1. 使用BufferedReader 对象读取一个txt文件
  2. txt文件默认编码方式是 UTF-8
  3. 由图中可以看到是正常读取的,没有问题

在这里插入图片描述

但是 把文件编码方式改成 ANSI 之后,再进行读取时:

在这里插入图片描述

在这里插入图片描述
发现出现了乱码,没有正常读取到文件内容;

可以这样解决:

  1. 将字节流以指定编码方式读取(GBK、UTF-8、ISO8859、ANSI等等);
  2. 再通过转换流 转换为字符流 即可;

转换流有:

  • InputStreamReader
  • OutputStreamWriter

        当处理纯文本数据时,使用字符流效率更高,并且可以有效解决中文乱码问题,所以建议将字节流转换为字符流:

InputStreamReader

  • Reader的子类,可以将InputStream(字节流)包装成Reader(字符流);
InputStreamReader的构造器:(属于字符流)

InputStreamReader(InputStream) 字节流转换为字符流

InputStreamReader(InputStream,Charset) 以指定编码方式Charset,字节流转换为字符流

InputStreamReader(InputStream,CharsetDecoder) 给定一个字符解码器CharsetDecoder,字节流转换为字符流

InputStreamReader(InputStream,String) 指定编码名称,字节流转换为字符流

在这里插入图片描述

示例: 将字节流FileInputStream包装成字符流InputStreamReader,对文件进行按UTF-8编码读取,进而在包装成 BufferedReader

/*
演示使用InputStreamReader转换流解决中文乱码问题
将字节流FileInputStream转成字符流InputStreamReader,指定编码GBK/UTF-8
 */
public static void main(String[] args) throws Exception{
    String filePath = "d:\\hello.txt";
    //1.把FileInputStream转成InputStreamReader (字节流转为字符流)
    //2.指定编码 gbk
    InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "GBK");
    //3.把InputStreamReader传入BufferedReader
    BufferedReader br = new BufferedReader(isr);
    /*
    为了简化 可以将 2 和 3 合在一起
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "GBK"));
     */
    //4.读取
    String s = br.readLine();
    System.out.println("读取内容:\n"+s);
    //5.关闭外层流
    br.close();
}

可以看出 运行结果读取正常:
在这里插入图片描述

OutputStreamWriter

  • Writer的子类,可以将OutputStream(字节流)包装成Writer(字符流);

类比 InputStream 有如下关系 及 构造器:

在这里插入图片描述

示例:将字节流 FileOutputStream 包装成 字符流 OutputStreamWriter,对文件进行写入(按gbk编码方式,也可以指定其他。如 utf-8)

/*
演示 OutputStreamWriter 使用
把 FileOutputStream 字节流 转为 字符流 OutputStreamWriter
指定编码 gbk/utf-8/utf8
 */
public static void main(String[] args) throws Exception{
    String filePath = "d:\\yes.txt";//提前创建
    String charset = "utf8";
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath),charset);
    osw.write("Hi 祝你天天开心!");
    osw.close();
    System.out.println("按照"+charset+"保存文件成功");
}

运行结果:
在这里插入图片描述
改变编码方式:
在这里插入图片描述


打印流:

打印流只有输出流,没有输入流

PrintStream & PrintWriter(两者区别在文章末尾)

PrintStream

在这里插入图片描述

在这里插入图片描述

/*
		演示PrintStream(字节打印流/输出流)
 */
public static void main(String[] args) throws IOException {
    PrintStream out = System.out;
    //在默认情况下PrintStream输出数据的位置是标准输出即显示器
    /*
        public void print(String s) {
            if (s == null) {
                s = "null";
            }
            write(s);
        }
     */
    out.print("Java");
    //因为print底层使用的是write方法,所以可以直接调用write进行打印/输出
    out.write("你好".getBytes());
    out.close();
    //可以修改打印输出流的位置/设备
    /*
    public static void setOut(PrintStream out) {
         checkIO();
         setOut0(out); //native()方法,修改out
    }
     */
    //输出到文件
    System.setOut(new PrintStream("d:\\hello.txt"));
    System.out.println("Hello World!");//输出到文件
}

PrintWriter

在这里插入图片描述
在这里插入图片描述

//	演示 PrintWriter 使用方式
public static void main(String[] args) throws IOException {
    PrintWriter printWriter = new PrintWriter(new FileWriter("d:\\hello.txt"));
    printWriter.print("你好Java");
    printWriter.close();//如果不关闭,就无法写入
}

PrintStream 和 PrintWriter 的区别:

  1. Stream用于二进制文件(非文本) ,Writer/Reader用于文本文件(虽然也是二进制,不过是按照一定的字符编码规则,不像前者) ,当然Stream也可用于文本,只不过比Writer/Reader来的麻烦;
  2. PrintStream主要操作byte流,而PrintWriter用来操作字符流。读取文本文件时一般用后者。
  3. Java的一个字符(char)是16bit的,一个byte是8bit的。PrintStream是写入一串8bit的数据的,PrintWriter是写入一串16bit的数据的。String缺省是用UNICODE编码,是16bit的。因此用PrintWriter写入的字符串,跨平台性会好一些,PrintStream的可能会出现字符集乱码。
  4. PrintStream是OutputStream的子类,PrintWriter是Writer的子类,两者处于对等的位置上,所以它们的API是非常相似的;二者区别不大;
  5. PrintStream类是过滤器类中一个不可忽视的成员,最基本的标准输出就要借助于它——我们常用的System.out变量就是PrintStream实例。与之对应的字符流类是PrintWriter类。
  6. PrintWriter类是JDK1.1版增加了与字节流I/O相对应的字符流I/O。但是,为了保持兼容性,原先的类几乎没有改动。再加之调试的需要,PrintStream类被保留,并且System类中的成员变量out、err仍作为它的对象。然而,PrintWriter用于大多数输出比PrintStream更为合适。因此1.1版的API中建议新开发的代码使用PrintWriter类,并将PrintStream类的两个构造函数标记为过时。这样,虽然使用System.out输出不会产生问题,在程序中创建新的PrintStream对象时却会产生编译时的警告。

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

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

相关文章

C++ 语法基础课4 —— 数组

文章目录1. 一维数组1.1 数组的定义1.2 数组的初始化1.3 访问数组元素(通过下标访问数组)1.4 练习1:1.5 练习21.6 练习31.7 练习41.8 练习4(难点)2. 多维数组2.1 练习11. 一维数组 1.1 数组的定义 数组的定义方式和变量类似 #include<iostream> #include<algorithm…

linux网络编程 - epoll边沿触发/水平触发内核实现代码分析

1、listen socket水平触发的poll函数调用 以服务器端epoll为例&#xff0c;加入监听、等待并接受连接、再次等待&#xff0c;会有3次检查是否有连接就绪的操作&#xff0c;分别是epoll_ctl、epoll_wait、epoll_wait。 1.1、epoll_wait(第1次调用) 等待就绪链表相关内核看前面发…

dropout 机制存在,对于同一句子的两次输出是不同的

SimCSE 提供了无监督&#xff08;上图 a&#xff09;和有监督&#xff08;上图 b&#xff09;两种架构&#xff0c;由于业务需要我们只用了无监督方式&#xff0c;其基本思路是&#xff1a; 1. 同一个 batch 内的数据两次输入模型。 2. 由于有 dropout 机制存在&#xff0c;对…

摩托车商城系统(基于javaweb开发的项目)

目录 前言 一、项目目录 二、效果图 2.1 首页面效果图 2.2 商品分类页面 ​​​​​​​2.3 热销栏页面 2.4 新品栏页面 2.5 购物狂欢栏页面 2.6 我的订单页面 2.7 个人中心页面 2.8 注册页面 2.9 用户登录页面 2.10 Admin后台管理主页面 2.11 Admin订单管理页面 2.12 A…

[附源码]SSM计算机毕业设计基于社区生鲜配送系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

万字总结线程池

本文将从背景、原理、架构、实现、参数状态等方面详细介绍percona-线程池。此外&#xff0c;还将简单介绍腾讯云企业级MySQL(CDB)内核技术--TXSQL&#xff0c;关于线程池的动态启停、负载均衡以及快速断连等优化。 「第一部分 背景」 社区版的MySQL的连接处理方法默认是为每个…

“信任机制”才是数字化时代发展中的精髓所在

2008年&#xff0c;美国次贷危机全面爆发并不断蔓延&#xff0c;最终席卷全球&#xff0c;酿成了世界性的金融危机。当年11月1日&#xff0c;一位署名为中本聪的人发表一篇《比特币&#xff1a;一种点对点的电子现金系统》论文提出了一种完全通过点对点技术实现的电子现金系统。…

Flutter 实现背景 Parallax 动画

Flutter 实现背景 Parallax 动画 原文 https://arkapp.medium.com/background-parallax-animation-in-flutter-4aa9e23d6cfb 前言 我们将创建我们的 Flutter 项目惊人的 Parallax 动画。 在本文中&#xff0c;我们将实现一个简单的实用工具 widget &#xff0c;它将在任何 widg…

Transformer/Bert

诸神缄默不语-个人CSDN博文目录 文章目录1. Transformer1.1 Transformer整体工作流程1.2 Transformer的输入1.2.1 单词 Embedding1.2.2 位置 Embedding1.3 Block1.3.1 Add & Norm层1.3.2 Self-Attention1.3.3 Multi-Head Attention1.3.4 Feed Forward1.3.5 Masked Multi-He…

[附源码]计算机毕业设计JAVA篮球装备商城系统

[附源码]计算机毕业设计JAVA篮球装备商城系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

HTTP/2是什么?和HTTP/1.1有什么不同?和SPDY有什么不同?

HTTP/2简介 HTTP/2 是超文本传输协议第2版&#xff0c;最初命名为 HTTP 2.0 &#xff0c;其简称为 h2&#xff08;基于TLS/1.2或以上版本的加密连接&#xff09;或 h2c&#xff08;非加密连接&#xff09;&#xff0c;是HTTP协议的的第二个主要版本&#xff0c;使用于万维网。 …

备考2023年软考需要了解什么?

2022年软考已经结束啦&#xff01;下半年还是有不少地区取消了&#xff0c;没能报上名或是没能正常参考的朋友们&#xff0c;只能把目光转向2023年了。 这篇文章就来给大家讲讲备考2023年软考需要了解什么&#xff1f; 软考小白必看哦&#xff01; 一、软考是啥&#xff1f;…

带你走进神奇的元宇宙的世界

&#x1f3e0;个人主页&#xff1a;黑洞晓威 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晓威&#xff0c;一名普普通通的大二在校生&#xff0c;希望在CSDN中与大家一起成长。&#x1f381;如果你也在正在学习Java&#xff0c;欢迎各位大佬来到我的博客查漏补缺…

阿里架构师推荐,微服务分布式构架开发实战PDF,快快收藏吧

什么是微服务架构 微服务是一种软件架构风格&#xff0c;目标是将一个复杂的应用拆分成多个服务模块&#xff0c;每个模块专注单一业务功能对外提供服务&#xff0c;并可以独立编译及部署&#xff0c;同时各模块间互相通信彼此协作&#xff0c;组合为整体对外提供完整服务。 微…

嵌入式开发学习之--创建工程

提示&#xff1a;本篇文章依旧是了解为主&#xff0c;实际做项目时直接找开源的类似项目做模板更效率。 文章目录一、前言二、新建工程三、使用模板工程四、总结一、前言 前面的学习&#xff0c;都是文件内的代码联系&#xff0c;这一篇&#xff0c;是学习文件与目录的联系。当…

数字信号处理-8-自相关

1 皮尔森相关系数 假设 x 和 y 均为 N 个样本的数组&#xff0c;皮尔森公式如下&#xff1a; 皮尔森相关系数总是在 -1 到 1 之间&#xff08;包含这两个字&#xff09;。ρ 的绝对值意味着相关性的强度。ρ 接近 1 表示强正相关&#xff1b;ρ 接近 -1 表示强负相关&#xf…

上传文件很费时费力?那是你没用对方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、前端直传的优点二、实现步骤2.1、后端方面2.1.1 添加依赖2.1.2 增加接口2.1.3 测试接口2.2、前端方面2.2.1 安装 cos-js-sdk-v5 依赖2.2.2 新建组件2.2.3 使…

你的哪些SQL慢?看看MySQL慢查询日志吧

前言 在项目里面&#xff0c;多多少少都隐藏着一些执行比较慢的SQL, 不同的开发测试人员在平时使用的过程中多多少少都能够遇到&#xff0c;但是无法立马有时间去排查解决。那么如果有一个文件能够将这些使用过程中比较慢的SQL记录下来&#xff0c;定期去分析排查&#xff0c;…

meta视口标签

属性解释说明width宽度设置的是viewport宽度&#xff0c;可以设置device-width特殊值initial-scale初始缩放比&#xff0c;大于0的数字maximum-scale最大缩放比&#xff0c;大于0的数字minimum-scale最小缩放比&#xff0c;大于0的数字user-scalable用户是否可以缩放&#xff0…

关于我们编写好的java程序是如何运行部署的

了解如何去查看项目如何运行怎么部署java项目部署到服务器的程序和在本地运行的程序有什么不同java中的Class文件是如何形成的Class文件如何执行的怎么部署java项目 首先宏观的说一下&#xff0c;程序的运行都是要有一个启动入口的&#xff0c;也就是我们经常说的main函数是程…