• 基本读取操作:

    • 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); // 需要变成字符存储进容器
}
}
}

转换流

  1. 将字节流转换为字符流的桥梁: InputStreamReader(); 相当于解码
  2. 将字符流转换为字节流的桥梁: OutputStreamWriter(); 相当于编码
  3. 转换过程中,可以指定编码表
// 示例四: 读取一个键盘录入的数据, 并将数据变成大写显示在控制台上,
// 如果用户输入的是 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 流之字节流和转换流的更多相关文章

  1. JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律

    JAVA之旅(二十七)--字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律 我们继续来聊聊I/O 一.字节流的缓冲区 这 ...

  2. Java基础:IO流之字节流和字符流

    1. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端 ...

  3. Java基础知识强化之IO流笔记32:转换流之OutputStreamWriter的使用

    1. OutputStreamWriter的使用 OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流 OutputStreamWriter ...

  4. IO流(6)—转换流

    1.处理流之二:转换流 InputStreamReader和OutputStreamWriter 2.当作用的文件就是一个文本文件且使用字节流传输时,需要把它转换成字符流,再在外面加上缓冲流以加速传输 ...

  5. JavaSE学习笔记(14)---File类和IO流(字节流和字符流)

    JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...

  6. java IO流 (五) 转换流的使用 以及编码集

    转换流的使用 1.转换流涉及到的类:属于字符流InputStreamReader:将一个字节的输入流转换为字符的输入流解码:字节.字节数组 --->字符数组.字符串 OutputStreamWr ...

  7. java 笔记(4) —— java I/O 流、字节流、字符流

    Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...

  8. javaIO流(二)--字节流与字符流

    一.流的基本概念 在java.io包中,File类是唯一一个与文件本身有关的程序处理类,但是File类只能操作文件本身,而不能操作文件内容,IO操作的核心意义在于输入和输出操作.而对于程序而言,输入和 ...

  9. JAVA IO分析一:File类、字节流、字符流、字节字符转换流

    因为工作事宜,又有一段时间没有写博客了,趁着今天不是很忙开始IO之路:IO往往是我们忽略但是却又非常重要的部分,在这个讲究人机交互体验的年代,IO问题渐渐成了核心问题. 一.File类 在讲解File ...

随机推荐

  1. Atitit.跨语言异常转换机制 java c# php到js的异常转换

    Atitit.跨语言异常转换机制 java c# php到js的异常转换 1. bizEx   直接抓取,然后js catchEX1 2. Chkec runtimeEx1 3. Other异常..J ...

  2. Android开发-状态栏着色原理和API版本号兼容处理

    介绍 先上实际效果图,有三个版本号请注意区分API版本号 API>=20 API=19 API<19 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZX ...

  3. CSS Sprites的概念、原理、适用范围和优缺点

    CSS Sprites概念 CSSSprites在国内很多人叫css精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就 ...

  4. Linux之实用GDB技巧

    一.引言 在Linux下开发,肯定少不了与gdb打交道,而gdb的命令又非常多,有些是不常用的但是特殊情况下却是必须的,因此记录在此,以便翻阅 二.基本命令 前面是命令全名,在不混淆的情况下,可以简写 ...

  5. 完工尚需绩效指数 TCPI

    转自:http://www.cnblogs.com/allenblogs/archive/2010/12/09/1901404.html TCPI To Complete Performance In ...

  6. hibernate 在web.xml中配置的作用

    1. <filter>     <filter-name>Spring character encoding filter</filter-name>     &l ...

  7. linux--jdk安装与配置

    此处以centos下jdkjdk1.8.0_161安装(此处为rpm安装事例)为例 1.java官网下载页找到对应版本的jdk下载链接地址 2.下载对应版本的rmp包到服务器,执行如下指令: wget ...

  8. SSH初体验系列--Hibernate--3--单值与分页查询

    前言 查询可以按结果集分2类:单个结果 和 数组 ; 其中,返回数组,在这个 数据库数据量随随便便就能上几十万的互联网时代大背景下,常常需要做分页处理, 所以这里就说一下单值和分页, 算是对上一篇&q ...

  9. PHP上传类 图片上传 upload class实现image crop resize 缩略图

    manage uploaded files, and manipulate images in many ways through an HTML form, a Flash uploader, XM ...

  10. 快使用阿里云的maven仓库

    自从开源中国的maven仓库挂了之后就一直在用国外的仓库,慢得想要砸电脑的心都有了.如果你和我一样受够了国外maven仓库的龟速下载?快试试阿里云提供的maven仓库,从此不在浪费生命…… 仓库地址: ...