IO 流之字节流和转换流
基本读取操作:
- InputStream();
- OutputStream(); // 直接写入目的地中, 不需要 flush() 刷新
- write(byte[] b); // 参数为 byte 数组
字符流不能操作媒体文件, 因为字符流读入文件后, 需要对照编码表.
如果编码表中没有对应的数据, 这时, 码表会用一些未知字符区的编码替代,最终,会发生错误.
// 示例一: 写入数据
// 1. 创建字节输出流对象, 用于操作文件
FileOutputStream fos = new FileOutputStream("demo.js");
//2. 写入数据, 注意写入的为 byte 类型, 并且直接写入到目的地中, 不需要 flush()
fos.write("abc".getBytes());
//3, 关闭资源
fos.close();
// 示例二: 读取数据
// 1, 创建读取流对象, 和指定文件关联
FileInputStream fis = new FileInputStream("demo.js");
// 2. 读取字节数组
byte[] buf = new byte[1024];
int len = 0;
while((ch=fis.read(buf)) != -1){
System.out.println(new String(buf,0,len));
}
/*
* // 一次读取一个字节
* int ch = 0;
* while((ch=fis.read()) != -1){
* System.out.println((char)ch);
* }
*/
// 3. 关闭流
fis.close();
// 备注: fis.available(); 可以获取文件大小
// 示例三: 复制一个 mp3 媒体文件
public static void copyMp3() throws IOException {
FileInputStream fis = new FileInputStream("demo.mp3");
BufferedInputStream bufis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("my.mp3");
BufferedOutputStream bufos = new BufferedOutputStream(fos);
/*
* byte[] buf = new byte[1024];
*
* int len = 0;
* while((len=bufis.read(buf))!=-1){
* bufos.write(buf,0,len);
* bufos.flush(); // 使用缓冲区的读, 每次读完后, 需要刷新
* }
*/
// 缓冲区读取单个字符
int ch = 0;
while((ch=bufis.read())!=-1){
bufos.write(ch);
}
bufos.close();
bufis.close();
}
// 示例四: 读取一个键盘录入的数据, 并将数据变成大写显示在控制台上,
// 如果用户输入的是 over, 结束键盘录入
/* 分析:
* 键盘本身就是一个标准的输入设备,
* 对于 java 而言, 对于这种输入设备都有对应的对象.
* 键盘录入对应的对象位于 java.lang 包中的 System 类
* "in" : 标准输入
* "out" : 标准输出
* 思路:
* 1. 因为键盘录入只读取一个字节, 要判断是否是 over, 需要将读取到的字节拼成字符串
* 2. 那就需要一个容器, StringBuilder
* 3. 在用户回车之前, 将录入的数据变成字符串判断即可
*
* 步骤:
* 1. 创建容器
* 2. 获取键盘读取流
* 3. 定义变量记录读取到的字节, 并循环获取
* 4. 将读取到的字节存储到 StringBuilder 中
* 5. 在存储之前需要判断是否是换行标记, 因为换行标记不存储
*/
public static void readKey() throws IOException{
// 1. 创建容器
StringBulider sb = new StringBuilder();
// 2. 获取键盘读取流
InputStream in = System.in;
// 3. 定义变量记录读取到的字节, 并循环获取
int ch = 0;
while((ch=in.read())!=-1){
// 在存储之前需要判断是否是换行标记, 因为换行标记不存储
if(ch=='\r')
continue;
if(ch=='\n'){
String temp = sb.toString();
if("over".equals(temp))
break;
System.out.println(temp.toUpperCase());
sb.delete(0,sb.length()); // 每次输出后,需要清空 StringBuilder 容器.
// 集合的清空用 clear
}
else{
sb.append((char)ch); // 需要变成字符存储进容器
}
}
}
转换流
- 将字节流转换为字符流的桥梁:
InputStreamReader();相当于解码 - 将字符流转换为字节流的桥梁:
OutputStreamWriter();相当于编码 - 转换过程中,可以指定编码表
// 示例四: 读取一个键盘录入的数据, 并将数据变成大写显示在控制台上,
// 如果用户输入的是 over, 结束键盘录入
public static void readKey() throws IOException{
// 字节流
InputStream in = System.in;
// 将字节流转换为字符流
InputStreamReader isr = new InputStreamReader(in);
// 缓冲区修饰字符流
BufferedReader bufr = new BufferedReader(isr);
// 获取输出流
OutputStream out = System.out;
// 将字符流转换为字节流, 构造函数可以接收 字节流
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bufw = new BufferedWriter(osw);
String line = null;
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;
// System.out.println(line.toUpperCase());
// 每次读取到的 line 是字符, 将字符写入到字节输入流中, 需要用到 OutputStreamWriter
bufw.write(line.toUpperCase());
bufw.newLine(); // 换行
bufw.flush(); // 每次写入后,需要刷新. 将流中的数据刷到控制台上
}
}
// 升级版本:
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

参考资料
IO 流之字节流和转换流的更多相关文章
- JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律
JAVA之旅(二十七)--字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律 我们继续来聊聊I/O 一.字节流的缓冲区 这 ...
- Java基础:IO流之字节流和字符流
1. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端 ...
- Java基础知识强化之IO流笔记32:转换流之OutputStreamWriter的使用
1. OutputStreamWriter的使用 OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流 OutputStreamWriter ...
- IO流(6)—转换流
1.处理流之二:转换流 InputStreamReader和OutputStreamWriter 2.当作用的文件就是一个文本文件且使用字节流传输时,需要把它转换成字符流,再在外面加上缓冲流以加速传输 ...
- JavaSE学习笔记(14)---File类和IO流(字节流和字符流)
JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...
- java IO流 (五) 转换流的使用 以及编码集
转换流的使用 1.转换流涉及到的类:属于字符流InputStreamReader:将一个字节的输入流转换为字符的输入流解码:字节.字节数组 --->字符数组.字符串 OutputStreamWr ...
- java 笔记(4) —— java I/O 流、字节流、字符流
Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...
- javaIO流(二)--字节流与字符流
一.流的基本概念 在java.io包中,File类是唯一一个与文件本身有关的程序处理类,但是File类只能操作文件本身,而不能操作文件内容,IO操作的核心意义在于输入和输出操作.而对于程序而言,输入和 ...
- JAVA IO分析一:File类、字节流、字符流、字节字符转换流
因为工作事宜,又有一段时间没有写博客了,趁着今天不是很忙开始IO之路:IO往往是我们忽略但是却又非常重要的部分,在这个讲究人机交互体验的年代,IO问题渐渐成了核心问题. 一.File类 在讲解File ...
随机推荐
- Unity中差乘判断目标是否在左边或右边
使用差乘判断左右一般是比较差乘的y,小于0是左,大于0是右.特殊情况可以用其他分量来比较 默认情况: var cross = Vector3.Cross(lhsObject.transform.pos ...
- [svc][jk]gpu温度监测
在使用TensorFlow跑深度学习的时候,经常出现显存不足的情况,所以我们希望能够随时查看GPU时使用率.如果你是Nvidia的GPU,那么在命令行下,只需要一行命令就可以实现. 1. 显示当前GP ...
- Struts2请求流程图
ServletContext中的内容: <s:property value="#attr['countries']['cn']"/> <br> Sessio ...
- Python 常用内建模块(time ,datetime)
1,在Python中,与时间处理有关的模块就包括:time,datetime以及calendar. 2,在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(st ...
- 快速解读GC日志
本文是 Plumbr 发行的 Java垃圾收集指南 的部分内容.文中将介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息.我们通过 -XX:+UseSerialGC 选项,指定JVM ...
- C# tif文件转jpg
需要添加WindowBase,PresentationCore的引用. 代码如下: private Stream GetImageStream() { //可以通过网络或本地文件的形式,返回Tif文件 ...
- python学习笔记3----正则表达式
正则表达式(RE)是通过re模块来实现的. 字符匹配: --普通字符: *大多数字母和字符一般都会和自身匹配. --元字符:. ^ $ * + ? {} [] \ | () []: 通常用来指定一个 ...
- JVM Specification 9th Edition (3) Chapter 2. The Structure of the Java Virtual Machine
Chapter 2. The Structure of the Java Virtual Machine 内容列表 2.1. The class File Format (class文件的格式) 2. ...
- ubox及日志管理
ubox是openwrt的帮助工具箱,位于代码package/system/ubox下, CMakeLists.txt kmodloader.c log/ lsbloader.c validate/ ...
- spring 使用注解来调度定时任务
配置自动调度的包 @Configuration @ComponentScan(basePackages = "com.test.indexer.service") public c ...