JAVA学习第五十七课 — IO流(十一)
一、管道流
PipedInputStream 和 PipedOutPutStream
输入和输出能够直接进行连接。结合线程使用
管道流,顾名思义,写一个读一个。连成一个管子
API文档:管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的全部数据字节。通常,数据由某个线程从
PipedInputStream
对象读取,并由其它线程将其写入到对应的 PipedOutputStream
。
不建议对这两个对象尝试使用单个线程。由于这样可能死锁线程。
管道输入流包括一个缓冲区。可在缓冲区限定的范围内将读操作和写操作分离开。
假设向连接管道输出流提供数据字节的线程不再存在。则觉得该管道已损坏
class Input implements Runnable{ private PipedInputStream pis;
Input(PipedInputStream pis){
this.pis = pis;
}
@Override
public void run() {
try {
byte[] by = new byte[1024];
int len = pis.read(by);
String str = new String(by,0,len);
System.out.println("str = "+str);
pis.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
class Output implements Runnable{ private PipedOutputStream pos;
Output(PipedOutputStream pos) {
// TODO Auto-generated constructor stub
this.pos = pos;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(5000);
pos.write("你好".getBytes());//字符串转字节流 } catch (Exception e) {
// TODO: handle exception
} }
}
public class Main { public static void main(String[] args)throws IOException{
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream();
pis.connect(pos);//两流对接 Thread t1 = new Thread(new Input(pis));
Thread t2 = new Thread(new Output(pos));
t1.start();
t2.start();
}
}
管道流应用不是非常多,可是其自身非常有特点
IO包中的其它类
操作基本类型数据的流对象—DataInputStream与DataOutputStream
操作字节数组—ByteArrayInputStream与ByteArrayOutputStream
操作字符数组—CharArrayInputStream与CharArrayOutoutStream
操作字符串—StringWriter与StringReader
DataInputStream与DataOutputStream
public static void read() throws IOException {
// TODO Auto-generated method stub
DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));
String str = dis.readUTF();
System.out.println(str);
dis.close();
} public static void DataStreamDemo() throws IOException {
// TODO Auto-generated method stub
DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));
dos.writeUTF("你好胖");以与机器无关方式使用 <a target=_blank href="">UTF-8 改动版</a>编码将一个字符串写入基础输出流。
dos.close();
}
剩下的方法和OutputStream、InputStream差点儿相同
操作数组的流
源和汇都是内存。ByteArrayInputStream、ByteArrayOutputStream
ByteArrayOutputStream:此类实现了一个输出流,当中的数据被写入一个
byte 数组。缓冲区会随着数据的不断写入而自己主动增长。可使用 toByteArray()
和 toString()
获取数据,关闭
ByteArrayOutputStream 无效。
public static void ByteStreamDemo() throws IOException {
ByteArrayInputStream bis = new ByteArrayInputStream("asdfd".getBytes());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len = 0;
while((len = bis.read())!=-1){
bos.write(len);
}
System.out.println(bos.toString());
}
剩下的流使用方法和ByteArrayInputStream都是同样的
编码问题
编码问题无非就是文字和二进制之间的相互转换
字符串->字符数组:编码
字符数组->字符串:解码
public static void Demo() {
String str = "你好";
//编码
byte[] by = str.getBytes();
for(byte b : by){
System.out.println(b);
} //解码
String str1 = new String(by);// == new String(by,"GBK");
System.out.println(str1);
}
编码编对了,有可能能成功解码
public static void main(String[] args)throws IOException{ String str = "ab你好asdas撒旦发射的";
int len = str.getBytes("GBK").length;
for(int i = 0;i<len;i++){//依照i个字节取
System.out.println("OK : "+Demo(str,i+1));
}
} public static String Demo(String str,int len) throws IOException {
byte[] by = str.getBytes("GBK");
int count = 0;//记录从哪个索引開始,字节不是汉字
for(int i = len-1;i>=0;i-- ){
if(by[i]<0){
count++;
}else {
break;
}
}
//汉字相应2个字节,汉字的个数 = 有负字节数/2
return (count & 1) == 0?new String(by,0,len):new String(by,0,len-1); }
JAVA学习第五十七课 — IO流(十一)的更多相关文章
- JAVA学习第四十七课 — IO流(一):文件的读写
输入流和输出流相对于内存 将外部设备的数据读取到内存中:输入 将内存中的数据写入外部设备中:输出 IO流经常使用基类 字节流的抽象基类:InputStream,OutputStream 字符的抽象基类 ...
- JavaSE学习总结(十七)—— IO流
一.IO流概要 1.1.概念 开发中经常要进行输入输出操作,掌握Java中的IO流显得非常必要. 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流, ...
- java学习第21天(IO流的使用)
IO流分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流 字节输出流 字符流 字符输入流 字符输出流 注意: a:如果我们没有明确说明按照什么分,默认按照数据类型分 ...
- 【java学习笔记】文件读写(IO流)
1.字节流 FileInputStream.FileOutputStream ①FileInputStream import java.io.FileInputStream; public class ...
- java学习第20天(IO流)
构造方法File file = new File("e:\\demo"); 创建文件夹 File file = new File("e:\\demo"); fi ...
- Python学习第五堂课
Python学习第五堂课推荐电影:华尔街之狼 被拯救的姜哥 阿甘正传 辛德勒的名单 肖申克的救赎 上帝之城 焦土之城 绝美之城 #上节内容: 变量 if else 注释 # ""& ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第五周
java学习第五周心得体会 本周,是Java学习第五周,随着时间推移,随着课本内容的推进,我们接触到的程序也开始变得越来越复杂,不再是二三章那些用来练手的小程序了,这一点,在我们的例题运 ...
- JAVA第09次实验(IO流)
JAVA第09次实验(IO流) 0.字节流与二进制文件 我的代码 import java.io.DataInputStream; import java.io.DataOutputStream; im ...
- java基础第十五篇之IO流和递归算法
FileInputStream : 输入流 int available() : 一次读取所有的字节数 read() : 将文件上的字节读取到内存的数组中 FileOutputStream : 输出流 ...
随机推荐
- Hadoop 2 初探
Hadoop 2.6.0的安装略复杂,在一台既有Hadoop 1又有Hadoop 2的server上,要设置好环境变量,必要时候echo $HADOOP_HOME一下看运行的是哪个版本. Master ...
- Android 订阅-发布者模式-详解
1.概念简述 Android 简称观察者模式, GoF说道:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”. 有 ...
- 服务器安装Linux应该注意的问题
安装方式: 1.光盘安装 2.睿捷引导安装 3.u盘安装 4.硬盘安装 5.IPMI远程安装 其中,睿捷是最方便的方式,驱动直接都会安装好,但是睿捷支持的Linux系统只有两个,局限性比较大: 光盘和 ...
- 在Mac OS X 10.9上安装 Thrift 0.9.1
Thrift 0.9.1 官方文档中对于Mac OS X上的安装描述适合 10.8,但不适用于10.9. Homebrew macport 默认都不能在 10.9上安装Thrift 0.9.1成功 ...
- PHPCURL直接访问JSONRPC服务
<?php $ch = curl_init(); $url = 'http://localhost/jsonrpc?tm='.time().mt_rand (100,999); //参数是为了防 ...
- erlang 常用函数
os:getpid() 获得erl.exe的进程表示符 application:start(appname, Type), Type == permanent 表示一个应用死了,其它应用全部死掉 ...
- 基于MapReduce的关系代数运算(2)
1.自然连接 Map函数:对于R中的每个元组(a,b),生成键值对(b,(R,a)),对于S中的每个元组(b,c),生成键值对(b,(S,c)) Reduce函数:每个键值b会与一系列对相关联,这些对 ...
- freetds相关
什么是FreeTDS 简单的说FreeTDS是一个程序库,可以实现在Linux系统下访问微软的SQL数据库! FreeTDS 是一个开源(如果你喜欢可以称为自由)的程序库,是TDS(表列数据流 )协 ...
- 【转】使用json-lib进行Java和JSON之间的转换
原文链接:http://www.cnblogs.com/mailingfeng/archive/2012/01/18/2325707.html 1. json-lib是一个java类库,提供将Java ...
- yum添加网易和搜狐源
先进入yum源配置目录 cd /etc/yum.repos.d 备份系统自带的yum源 mv CentOS-Base.repo CentOS-Base.repo.save 163的yum源: wget ...