System.in,System.out、转换流InputStreamReader,OutputStreamWriter、流操作基本规律

2023-11-06

读取键盘录入:

package com.readkey.demo;
import java.io.IOException;
import java.io.InputStream;
public class ReadKey {
public static void main(String[] args) throws IOException {

// readKey();
readKey_2();


}


public static void readKey_2() throws IOException {

/*
* 接收键盘输入的字符 将字符装换为大写打印到控制台上 输入over结束 思路:
* 接收的是一个一个的字符所以要先使用容器先存起来,然后在进行转换 注意的是\r \n是不需要存储的,在换行之后要先清空,才能在在进行存储
*/
// 1 创建一个容器
StringBuilder sb = new StringBuilder();
// 2 键盘输入
InputStream in = System.in;
// 循环读取数据
int ch = 0;
while ((ch = in.read()) != -1) {
if (ch == '\r')
continue;// \r 不需要存储
if (ch == '\n') {
String tmp = sb.toString();// 回车后转为字符串
if ("over".equals(tmp))// 输入over结束
break;
System.out.println(tmp.toUpperCase());


sb.delete(0, sb.length());
} else/* \n不进行存储 */{
sb.append((char) ch);
}
}
}


public static void readKey() throws IOException {
// 默认输入设备不需要关闭,否则想继续输入还得重新开启。
InputStream in = System.in;
int ch = in.read();
System.out.println(ch);
/*
* int ch1 = in.read(); //读取的是\r

 System.out.println(ch1); 

int ch2 =in.read();//读取的是\n 

System.out.println(ch2);
*/
}


}

流的转换:

package com.readkey.demo;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;


public class TransStreamDemo {


public static void main(String[] args) throws IOException {

//字节流-->字符流
//字节流   (一个汉字为两个字节)
InputStream in = System.in;
//转换流
InputStreamReader isr = new InputStreamReader(in);
//字符流
BufferedReader bufr = new BufferedReader(isr);
//以上三句相当于
BufferedReader bufr1 = new BufferedReader(new InputStreamReader(System.in)); 
String str = null;
/*while((str = bufr.readLine())!=null){
if("over".equals(str))
break;
System.out.println(str.toUpperCase());
}*/
//字符流-->字节流(从下到上)
OutputStream out = System.out;//字节流
OutputStreamWriter osw = new OutputStreamWriter(out);//字符流
BufferedWriter bufw = new BufferedWriter(osw);
//以上三句相当于
BufferedWriter bufw1 = new BufferedWriter(new OutputStreamWriter(System.out));
while((str = bufr.readLine())!=null){
if("over".equals(str))
break;
bufw.write(str.toUpperCase());//写入缓冲区 目的地是osw
bufw.newLine();
bufw.flush();
}


}


}

-------------------------------------------------------------------------------------------------------


流操作的基本规律:

转换流:

InputStreamReader :字节到字符的桥梁 解码

OutputStreamWriter:字符到字节的桥梁 编码


之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适。

想要知道开发时用到哪些对象,只要通过四个明确即可

1 明确源和目的(汇)

源:InputStream Reader

目的:OutputStream Writer

2 明确数据是否是纯文本数据

源:是纯文本 : Reader

否: InputStream

目的: 是纯文本 Writer

     否:OutputStream

到这里,就可以明确需求中具体要使用哪个体系

3 明确具体的设备

源设备:

硬盘:File

键盘:System.in

内存:  数组

网络:Socket流

目的设备:

硬盘:File

控制台:System.out

内存:数组

网络:Socket流

4 是否需要其他额外功能

1 是否需要高效(缓冲区):

是,就加上buffer

2 转换


需求1 :复制一个文本文件

       1  明确源和目的

源:InoutStream Reader

目的:OutputStream Writer

2 是否是纯文本

源:Reader

目的: Writer

3 明确具体设备

源:

硬盘:File

目的:

硬盘:File 

FileReader fr = new FileReader("a.txt");

FileWriter fw = new FileWriter("b.txt"); 

4 需要额外功能吗

需要,需要高效

BufferReader bufr = new BufferReader(new FileReader("a.txt"));

BufferWriter bufw = new BufferWriter(new FileWriter("b.txt"));


需求2 :读取键盘录入信息,并写到一个文件中

1 明确源和目的

源:InputStream Reader

目的:OutputStream Writer

2 是否为纯文本

源:Reader

目的:Writer

3 明确设备

源:键盘 System.in

目的: 硬盘 File

InputStream in = System.in

FileWriter fw = new FileWriter("b.txt");

4 需要额外功能吗?

1 转换: InputStreamReader isr = new InputStreamReader (System.in)

FileWriter fw = new FileWriter("b.txt");

将字节流转成字符流。因为明确的源是Reader,这样操作文本数据便捷

所以要将已有的字节流转成字符流。使用字节-->字符 InputStreamReader

2 高效: BufferedReader bur = new BufferedReader(newInputStreamReader (System.in))

BufferedWriter buw = new BufferedWriter ( new FileWriter("b.txt");)

需求3 :将一个文本文件数据显示在控制台上

1 明确源和目的

源:InputStream Reader

目的:OutputStream Writer

2 是否为纯文本

源:Reader

目的:Writer

3 明确具体设备

源:

硬盘:File

目的:

控制台:System.out

FileReader fr = new FileReader("a.txt");

OutputStream out = System.out;

4 需要额外功能吗?

需要:转换

FileReader fr = new FileReader("a.txt")

OutputStreamWriter osw = new OutputStreamWriter (System.out)

高效:

BufferedReader bufr = new BufferedReader (new FileReader("a.txt"));

BufferedWriter bufw = new BufferedWriter (newOutputStreamWriter (System.out))


需求4 :读取键盘录入数据,显示在控制台上

1 明确源和目的

源:InputStream Reader

目的:OutputStream Writer

2 是否为纯文本

源:Reader

目的:Writer

3 明确具体设备

源:System.in

目的:System.out

InputStream in = System.in

OutputStream out = System.out

4 需要额外功能吗?

1 转换

InputStreamReader isr = new InputStreamReader(System.in)

OutputStreamWriter osw = new OutStreamWriter(System.out)

2 高效

BufferedReader bufr = new BufferedReader (new InputStreamReader(System.in))

BufferedWriter bufw = newBufferedWriter(newnew OutStreamWriter(System.out) )


需求5:

将一个中文字符串数据按照指定的编码表写入到一个文本文件中

1 目的 OutputStream.Writer

2 是纯文本,Writer

3 设备:硬盘File

FileWriter其实是按照默认编码表操作的

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk_1.txt"),"GBK");GBK 这个码表一汉字两个字节)(UTF-8 这个码表一汉字三个字节)
FileWriter fw = new FileWriter("gbk.txt");

/*这两句代码的功能是等同的。


* FileWriter:其实就是转换流指定了本机默认表的体现,而且这个转换流的子类对象,可以方便操作文件
* 简单说:操作文件的字节流+本机默认的编码表,这是按照默认码表来操作文件的便捷类。
* 如果操作文本文件需要明确具体的编码。FileWriter就不行了。必须用转换流。

因为操作的是文件 所以用FileOutputStream

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("utf_1.txt"),"编码表");                     
读取时:InputStreamReader isr = new InputStreamReader(new FileInputStream("utf_1.txt"),"编码表");

需要高效:

BufferedWriter bufw = new BufferedWriter (new OutputStreamWriter(new FileOutputStream("utf_1.txt"),"编码表");  )


什么时候使用转换流?

1 源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁。

提高对文本操作的便捷

2 一旦操作文本涉及到具体的指定编码表时,必须使用转换流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.in,System.out、转换流InputStreamReader,OutputStreamWriter、流操作基本规律 的相关文章

随机推荐

  • 服务器和网站域名,网站服务器和域名的区别

    网站服务器和域名的区别 内容精选 换一换 华为云漏洞扫描服务帮助中心 为用户提供产品简介 用户指南 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用漏洞扫描服务 目前 华为云SSL证书管理服务提供了OV 企业版 OV Pro 企业
  • PyCharm 2023.1.2版本关闭后一直显示正在关闭项目

    最近下载了新的社区版本 出现了关闭程序就一直显示关闭项目的问题 然后各种找方法 试了如下几种 1 调整了一下编码方式 都0变为UTF 8 然后在自然语言添加了中文 也在编辑器那一行里 2 这个问题可能是由于Pycharm在关闭时正在运行一些
  • ubuntu下安装hadoop和eclipse

    hadoop安装方法 https www cnblogs com oskyhg p 9150000 html hadoop 安装教程 本教程由厦门大学数据库实验室 给力星出品 转载请注明 本教程适合于原生 Hadoop 2 包括 Hadoo
  • FloatingActionButton的使用

    FloatingActionButton FAB 是 Android 5 0 新特性 Material Design 中的一个控件 是一种悬浮的按钮 FloatingActionButton 是 ImageView 的子类 因此它具备Ima
  • JAVA代码保护工具DashO Pro v10.0.0 Beta 2重磅上线!更新DashO Gradle插件!

    DashO是一个Java和Android的混用程序 它提供企业级应用的加固和屏蔽 大大降低了知识产权盗窃 数据盗窃 盗版和篡改的风险 分层混淆 加密 水印 自动失效 反调试 反篡改 反仿真器 反挂钩 反根设备解决方案 为世界各地的应用程序提
  • unity Dropdown默认选择不选择任何选项

    当我们使用Dropdown下拉框时 有时不需要有默认选项 把 value设置为 1就可以了 但是用代码设置value 1是没有效果的
  • [Tools: ssh隧道] 跳板机连接内网服务器

    终端连接内网服务器 假设本地是A 内网跳板机是B 内网服务器是C 通常 从A连接C需要两次ssh 但通过以下ssh设置 可以简化连接过程 设置后 在终端键入ssh C 即可登录内网服务器C Host B HostName h User ds
  • C++智能指针实现类多态

    智能指针让我们不再操心内存泄露的问题 类多态是面向对象的一大特性 普通指针可以实现类多态 智能指针同样也能 请看代码 include
  • 70.语义分割和数据集

    在 之前讨论的目标检测问题中 我们一直使用方形边界框来标注和预测图像中的目标 本节将探讨语义分割 semantic segmentation 问题 它重点关注于如何将图像分割成属于不同语义类别的区域 与目标检测不同 语义分割可以识别并理解图
  • 重试C语言之C语言常量

    本章的学习目标如下 1 了解常量定义 2 常量数据类型 3 定义常量的方式 常量定义 常量是固定值 在C语言程序执行过程中不会发生改变 常量数据类型 常量可以使任何基本数据类型 比如 整形常量 浮点型常量 字符串常量 字符常量 也有枚举常量
  • Python删去本地指定类型文件

    Python删去本地指定类型文件 import os def Del File dir ftype files os listdir dir for f in files fl f split if fl 1 ftype os remove
  • 7-52 两个有序链表序列的交集 (20分)Java/C

    先是Java写的 用ArrayList求交集 最后一个测试点内存超限 package exercise import java util public class Main public static Object search Array
  • 面向对象编程的三大特征(封装,继承、多态)以及重写、MRO

    封装 特征一 根据需求将属性和方法封装到一个抽象的类中 在使用的时候 只要按照自己的需求去调用 不必了解实现的细节 封装有两方面的含义 1 将数值 属性 和行为 方法 包装到类对象中 在方法内部对属性进行操作 在类对象的外部调用方法 这样
  • 低通滤波器降噪matlab,基于MATLAB语音信号降噪处理方法研究

    2017 年 04 月下 青春岁月 415 一 语音信号的采集 为了表示取样的语音信号 我们采用的是离散时间模型 建立模型的基本准则是寻求一种可以表达一定物理状态下的数学关系 要使这种关系不仅具有强大的精确度 而且还要最简单 由于语音信号是
  • Java——Scanner的对象next()和nextLine()的区别

    Scanner对象 next 1 一定要读取到有效字符后才可以结束输入 2 对输入有效字符之前遇到的空白 next 方法会自动将其去掉 3 只有输入有效字符后才将其后面输入的空白作为分隔服或者结束符 4 next 不能得到带有空格的字符 p
  • 【光线追踪】 流程分析与实现的路径跟踪渲染器

    前言 搞光追是图形学的浪漫 先放张目前渲染图 分析了部分代码框架 后续补上完整 效果 左边黄色球是Blinn Phong进行着色 右边是Cook Torrance模型着色 BVH 1024x1024 200spp 2x2MSAA VS Om
  • SVR的简单实例应用

    在开始实例应用前先明确一般的操作步骤 导入数据 分割训练集和测试集 数据预处理 建模 模型测试与模型评价 话不多说 我们直接开始吧 导入数据 导入需要的库函数 import pandas as pd import numpy as np f
  • cve-1999-0614 ftp服务器版本信息可被获取,关于SolarWinds Serv-U远程代码执行漏洞(CVE-2021-35211)的预警提示...

    一 漏洞详情 Serv U是Windows平台和Linux平台的安全FTP服务器 FTPS SFTP HTTPS 是一个文件管理 文件传输和文件共享的解决方案 2021年7月13日 SolarWinds对外发布漏洞公告 其产品Serv U
  • useEffect 总结

    useEffect 有一个返回值 每次重新执行这个useEffect 或者组件销毁时 就会去执行return方法里面的内容 简而言之 在组件销毁或useEffect重新执行时 会执行返回值 useEffect return xxxxxx 2
  • System.in,System.out、转换流InputStreamReader,OutputStreamWriter、流操作基本规律

    读取键盘录入 package com readkey demo import java io IOException import java io InputStream public class ReadKey public static