- 浏览: 15102 次
- 性别:
- 来自: 广州
最新评论
javase_16(其它流)
- 博客分类:
- 1.javaSeBase
IO包中的其他流:
1.打印流
a)PrintWriter(写-->print打印) 与PrintStream (字符流)
2.序列流 b)SequencelnputStream(假设我有多个文本.需要合并成一个文本)
3.操作对象 c)ObjectinputStream与ObjectOutputStream(对象必须要实现Serializable这个接口,做为标记需要使用序列 或者序列化
将图片切割成若干份,每10k一个文件, 再使用序列流组合成图片(为什么第一张图片可以看得到呢.特征码的问题) 小练习: 4.操作基本数据类型 d)DataInputStream 与DataOutputStream 5.操作内存缓冲数组 e)ByteArrayStream与CharArrayReader 6.管道流 PipedinputStream与PipedOutputStream 7.RandomAccessFile 实现了该类的实例支持对随机文件的读取和写入
PrintWriter用法一:其实它是对一个Writer进行了封装
package com.javami.kudyTest;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
public class PrintWriterTest {
/*
* PrintWriter 是对Writer 进行了一个封装
*/
public static void main(String[]args) throws FileNotFoundException
{
PrintWriter pw = new PrintWriter("src/a.txt");
int num = 98; //char类型占了一个类型
// pw.write(num); //输出了一个char类型的
pw.print(num); //输出的是int类型的
/*
* 其实里面做的事情
* String str = str.valueOf(int) //转换成字符串 再转换为字节 98
* 而我们系统默认的字节编码格式每一个字符是占了1位的,所以显示出来的结果为是2bytes
* ---------------------------------
* String str = str.valueOf(num);
* byte[]buf = str.getBytes(); //转换成字节
* for(byte ch :buf)
* while(ch);
*/
pw.close();
}
}
第二:PrintStream
是继承于OutputStream(输出流(字节流))
package com.javami.kudyTest;
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class PrintStreamTest {
/*
* PrintStream 的应用:
* 这是一个字节流: 输出字节流
* (写数据)
* 继承于:OutputStream
*/
public static void main(String[]args) throws FileNotFoundException
{
PrintStream ps = new PrintStream("src/b.txt");
// int num = 98;
// ps.write(num);
int num = 97;
ps.print(num); //本质上是没有区别.但是内部实现原理就有区别 (占了2个字节)
/*
* 实现原理和PrintWriter很想:
* String str = str.valueOf(num); //转换成字符
* byte[] buf = str.getBytes();
* for(byte b : buf)
* {
* 字节数现在为2 存入的是字节.之后系统会根据系统的编码格式进行了一个解码
* }
*/
}
}
package com.javami.kudyTest;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;
import java.util.Iterator;
public class SequenceInputStreamTest {
/*
* 序列流
*/
public static void main(String[]args) throws IOException
{
/*
* 读取两个文本的方式
*/
InputStream is1 = new FileInputStream("src/a.txt");
InputStream is2 = new FileInputStream("src/b.txt");
OutputStream os = new FileOutputStream("src/c.txt");
//读取两个参数
SequenceInputStream sis = new SequenceInputStream(is1,is2);
byte[] buf = new byte[1024];
int ch;
while((ch=sis.read(buf))!=-1)
{
os.write(buf,0,ch);
}
//关流,由于SequenceInputStream 是一个包装类.但把这个流关闭.会把底层的两个流也关
sis.close();
os.close();
/*
* 如果我有很多文本需要合并内容的,但是构造方法只能传递进去.这时候如果用到带两个参数的构造方法来传递就不是太方便啦~~
* 那么我可以使用使用到枚举+集合
*/
InputStream isone = new FileInputStream("src/a.txt");
InputStream istwo = new FileInputStream("src/b.txt");
InputStream isthree = new FileInputStream("src/c.txt");
OutputStream osone = new FileOutputStream("src/happy.txt");
Vector<InputStream> v = new Vector<InputStream>();
v.add(isone);
v.add(istwo);
v.add(isthree);
/* //枚举里面我需要使用的是InputStream
Enumeration<InputStream> e = v.elements();
//读取枚举里面的内容.再写入到一个文本里面去
//里面只能放一个枚举类型.并且这个枚举类型的泛型是继承于InputStream的
SequenceInputStream sisone = new SequenceInputStream(e); //读写集合里面的内容.已经合并在一起啦
int len;
while((len=sisone.read())!=-1)
{
osone.write(len);
}
//关流
sisone.close(); //这个如果关流.已经把底层的三个流已经被关闭
osone.close();*/
//看第二种方式: 产生一个迭代器
final Iterator<InputStream> it = v.iterator();
SequenceInputStream sistwo =
new SequenceInputStream(new Enumeration<InputStream>(){
@Override
//这里面是否有更多的元素呢?
public boolean hasMoreElements() {
return it.hasNext();
}
@Override
//下一个元素为多少呢?
public InputStream nextElement() {
// TODO Auto-generated method stub
return it.next();
}
});
int len;
//一个字符一个字符读取进去的方式啊?没有包装的.哥们.难道你忘记啦?
//不读出来怎么写? 您教我.
while((len=sistwo.read())!=-1)
{
osone.write(len); //读一个字节.写一个字节
}
}
}
package com.javami.kudyTest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.Serializable;
public class ObjectStreamTest {
/*
* 对象序列化:
* 有的时候我们需要找一种数据对内存中的对象进行描述.便于保存.这时,可能每个程序员都有自己的想法.
* 都会去使用自己习惯的方式,对象的序列化,就是按照java规定格式对对象转换成一种数据,编译保存.这个过程就是对象的序列化
* 将数据的格式转换成对象就是叫做反序列化
*/
public static void main(String[]args) throws FileNotFoundException, IOException, ClassNotFoundException
{
/* Person p1 = new Person("张三",18);
Person p2 = new Person("王五",19);
Person p3 = new Person("李四",20);
Person p4 = new Person("大毛",21);*/
/*
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream("src/1.txt"));
oos.writeObject(p1); //父类型的引用可以指向子类型的对象
oos.writeObject(p2);
oos.writeObject(p3);
oos.writeObject(p4);
oos.close();
/1.对象的序列化的第一种方式
*/
/*
* 假设我们已经序列化:现在需要反序列化>需要把对象里面的内容输出去
*/
ObjectInputStream ois =
new ObjectInputStream(new FileInputStream("src/1.txt"));
while(true)
{
try
{
Person p =(Person)ois.readObject();
System.out.println(p);
}catch(IOException e)
{
return ;
}
//如果是异常的,咱们就不执行
}
}
}
/*
* 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
* 由于我们希望序列化的是Person 这个类.所以我们要实现这个接口
* 这个主要就是做一个下标识
* 但异常出现的错误为:NotSerializableException 就是说明了: 有一个类还没有被标记即将要序列化
*/
class Person implements Serializable
{
private String name;
private int age;
Person(){}
Person(String name,int age)
{
this.name = name;
this.age = age;
}
@Override
public String toString()
{
return this.name +"@"+this.age;
}
}
第二种方式: 可以利用集合去做一个问题
(输入数据 通过集合读 通过遍历集合写.) 建议使用哦
package com.javami.kudyTest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
/*
* 可以通过集合去写入数据 ... 之后再通过集合遍历数据..
*/
public class ObjetcStreamTest2 {
public static void main(String[]args) throws FileNotFoundException, IOException, ClassNotFoundException
{
/*
* 1.序列化
Person p1 = new Person("张三",18);
Person p2 = new Person("王五",19);
Person p3 = new Person("李四",20);
Person p4 = new Person("大毛",21);
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream("src/Object.txt"));
ArrayList<Person> al = new ArrayList<Person>();
al.add(p1);
al.add(p2);
al.add(p3);
al.add(p4);
oos.writeObject(al);
oos.close();*/
/*
* 反序列化
*/
ObjectInputStream ois =
new ObjectInputStream(new FileInputStream("src/Object.txt"));
//要把这个类型强制转换
ArrayList<Person> al = (ArrayList<Person>)ois.readObject();
for(Person p : al)
{
System.out.println(p);
}
ois.close();
}
}
/*
* Person 实现一个接口,标记为即将序列化或者反序列化
*/
class Person implements Serializable
{
private String name;
private int age;
Person(){}
Person(String name,int age)
{
this.name = name;
this.age = age;
}
@Override
public String toString()
{
return this.name +"@"+this.age;
}
}
package com.javami.kudyTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;
public class PictureCut {
public static void main(String[] args) {
File file = new File("f:/a/1.jpg");
try
{
//cutPicture(file);
splicePicture();
}catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
/**
* 将图片分成若干份,每10K一份,再使用序列流组合图片
* 思路: 需要定义一个FileinputStream 读取一个图片. 再写入到一个FileInputStream里面去
* 定义一个byte[] buf = new byte[1024]; //缓冲区定义成1k
* int count = 0; //标记循环10次.也就是10K
* int num = 1; //标记图片命名
* int len ; //返回的字符
* 循环读取一个图片.当读取到10K的时候.咱们就写入到一个新的字节流里面去..
* 注意count每一次标记一下.当count等于10的时候.咱们要重新清空一下.
*
*
*/
private static void cutPicture(File file) throws IOException
{
FileInputStream fis = null;//输入
FileOutputStream fos = null; //输出流
try
{
fis = new FileInputStream(file);
fos = new FileOutputStream("f:/a/a1.jpg"); //写入到这个文本里面去
byte[] buf = new byte[1024]; //1K的大小
int count = 0; //标记如果是读到10K就是一个图片
int len;
int num = 1; //等待给一个图片标号
while((len=fis.read(buf))!=-1) //意思: 从缓冲区读取10K的字节内容赋给len 0,len最大字符数
{
//每次从缓冲区那里边读取1K
if(count==10)
{
count=0; //清空一下.
fos.close(); //关闭上一次的流
fos = new FileOutputStream("f:/a/a"+(++num)+".jpg");
}
//从缓冲区里面写入buf 0 ,len的内容 .是不是刚好1K的内容
fos.write(buf,0,len); //把10K内容写入进去 //0-9 刚好10次
//标记是否是10次 0 - 9 刚好10次 10 -19 刚好10次 ...
count++;
}
}finally
{
try
{
if(fis!=null)
fis.close();
}finally
{
if(fos!=null)
fos.close();
}
}
}
/*
* 并且一个图片,咱们可以先读取一个图片
* 可以所以用到枚举
*/
private static void splicePicture() throws IOException
{
/*
* Vector是一个集合
*/
Vector<InputStream> v = new Vector<InputStream>(); //读取图片
SequenceInputStream sis = null;
FileOutputStream fos = null;
v.add(new FileInputStream("F:/a/a1.jpg"));
v.add(new FileInputStream("F:/a/a2.jpg"));
v.add(new FileInputStream("F:/a/a3.jpg"));
v.add(new FileInputStream("F:/a/a4.jpg"));
v.add(new FileInputStream("F:/a/a5.jpg"));
v.add(new FileInputStream("F:/a/a6.jpg"));
v.add(new FileInputStream("F:/a/a7.jpg"));
v.add(new FileInputStream("F:/a/a8.jpg"));
v.add(new FileInputStream("F:/a/a9.jpg"));
Enumeration<InputStream> e = v.elements(); //枚举类型
try
{
sis = new SequenceInputStream(e);
fos = new FileOutputStream("src/dj.jpg");
int ch;
while((ch=sis.read())!=-1)
{
//写入字节流
fos.write(ch);
}
}finally
{
try
{
if(sis!=null)
sis.close();
}
finally
{
if(fos!=null)
fos.close();
}
}
}
}
package com.javami.kudyTest;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataStreamTest {
/**
* 操作基本数据类型:
* 格式化数据类型: int类型占了4个字节.写在文本里面也是占了4个字节
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
/*DataInputStream dis =
new DataInputStream(new FileInputStream("src.ohoh.txt"));
int num = 98;*?里面有98给我读取吗?*/
/*DataOutputStream dos =
new DataOutputStream(new FileOutputStream("src/ohoh.txt")); //写入数据
int num = 98;
//dos.writeInt(num); 是以int类型所占的字节写入进去,4个字节
String str = "abc中国人";
dos.writeUTF(str);//是以UTF编码写入进去 汉字占3个字节
*/
//读
DataInputStream dis = new DataInputStream(new FileInputStream("src/ohoh.txt"));
/*
* 是与UTF编码写进去的,咱们就用相同的码表去解码
*/
String datat = dis.readUTF();
System.out.println(datat);
dis.close();
/*
* 将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。如果没有抛出异常,则计数器 written 增加 4。
*
*/
}
}
package com.javami.kudyTest;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ByteArrayStream {
/*
* ByteArrayInputStream 读取字节
* ByteArrayOutputStream 写入字节
*/
public static void main(String[]args) throws IOException
{
String chinese = "我是中国人.钓鱼岛是咱们中国的同胞的.jb帝国主义滚~~~";
byte[] buf = chinese.getBytes(); //获取到字节数组
//读取字节包装流
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
int len = bais.available(); //获取到字节里面有多少个字节
byte[] bufs = new byte[len]; //自定义大小做缓冲区.为什么这样做.以为我们这样做.可以节省内存空间.
bais.read(bufs); //我们把定义存储到自定义缓冲区里面去
String happy = new String(bufs);
System.out.println(happy);
bais.close();
//写入字节包装类
ByteArrayOutputStream bos =
new ByteArrayOutputStream();
bos.write("jb滚出钓鱼钓".getBytes());
byte[] jbs = bos.toByteArray(); //获取里面的数据
System.out.println(new String(jbs));
bos.close();
}
/*
* 一般的用法:
* DataoutputStream dos = new DataOutputStream(new ByteArrayOutputStream());
*/
}
package com.javami.kudyTest;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipedStreamTest {
public static void main(String[]args) throws IOException
{
//1.输入流读
PipedInputStream pis = new PipedInputStream();
//2.输出流写
PipedOutputStream pos = new PipedOutputStream();
//3.输入流连接输出流
pis.connect(pos);
//从服务器的角度来说:向用户发出信息 发出的字节
pos.write("欢迎来到本站".getBytes());
int len = pis.available();
byte[] buf = new byte[len]; //获取到一个自定义缓冲区大小数组
//自定义一个缓冲区大小.把内容读取到这边来
pis.read(buf); //把内容读取到一个buf里面去
//已经被独到了buf里面去
String user = new String(buf);
System.out.println(user);
pis.close();
pos.close();
}
}
package com.javami.kudyTest;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileTest {
/**
* 编写一个程序,记录该程序运行次数,运行满足30day.就提示软件到期
* @throws IOException
* @throws NumberFormatException
*/
public static void main(String[] args) throws IOException
{
//打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
//读一次.写一次.读一次.写一次.
RandomAccessFile raf = new RandomAccessFile("src/count.txt","rw");
int count = Integer.parseInt(raf.readLine()); //转换成int类型
count++;
if(count>10)
{
System.out.println("软件已经到期");
return ; //结束整个循环
}
System.out.println("已经使用了"+count+"次,请马上续费~~");
String str = String.valueOf(count);
//再写入进去.就是一读一些的概念啦
/*
* 注意这个偏移量的问题.如果我们不设置偏移量的时候.
* 他执行的顺序是: 012 那么程序判断成12就结束啦..
* 设置偏移量为零:
* 位置是不会懂的0
* 1
* 2
* 3...这样
*/
raf.seek(0);
raf.write(str.getBytes()); //把字节写进去 把字节写进去.
raf.close();
}
}
希望以后好好努力..加油..
发表评论
-
javase_22(TCP的理解)
2012-09-02 19:43 560TCP传输 Socket(客户端)和ServerSocket( ... -
javase_21(DUp的学习-->*)
2012-08-30 00:45 693Socket网络编程 网络协议 IP地址与端口号 本 ... -
javase_20(Awt初步认识)
2012-08-27 01:00 940多线程的再度复习.class package com.jav ... -
javase_19(多线程)
2012-08-24 23:32 800进程: 进程是具有一定独立功能的程序关于某个数据集合上的一次 ... -
javase_18(回顾与反射机制学习)
2012-08-20 11:58 429AM上午总结: package com.ja ... -
javase_17(IO的总结)
2012-08-20 11:55 1000所有的流在使用完毕时,都需要调用close方法进行关流,释放资 ... -
javase_16(其它流)
2012-08-20 11:38 0IO包中的其他流: 1.打印流 a)PrintWri ... -
javase_15(File类的应用)
2012-08-19 00:07 802File类:用来将文件或者 ... -
javase_14(字节流)
2012-08-19 00:00 667字节流的抽象基类: InputStream(输入) ... -
javase_13(字符流)
2012-08-19 00:00 527IO(Input OutPut)流 IO流用来处理设备 ... -
javase_12(集合+时间对象)
2012-08-19 00:00 516Map集合 1.Map存储了一系列键值的映射关系2.M ... -
javase_11(集合的理解)
2012-08-19 00:00 829集合类: 为什么使 ... -
javase_10(String类日常操作)
2012-08-18 09:40 795第一: package com.ja ... -
javase_09(面向对象总结)
2012-08-18 09:39 855Java的环境配置 day01 1. 环 ... -
javase_08(基础面试题)
2012-08-18 09:38 662面试题:请说说抽象类和接口的区别 抽象类,使用abstrac ... -
javase_07(继承与设计模式)
2012-08-18 09:36 603/* 子类对象的实 ... -
javase_06(面向对象)
2012-08-18 09:29 653/* 内部类: .在类中定义的类我们称之为内部类, ... -
javase_05(面向对象)
2012-08-16 11:25 0一.构造函数的定义与 ... -
javase_05(面向对象)
2012-08-16 11:22 734一.构造函数的定义与作用 1.函数的名次与类同名2.没有 ... -
javase_04(面向对象)
2012-08-16 11:21 532面向对象:一种编程思想,使用对象来描述生活中的事物:面向对象的 ...
相关推荐
里面包含了字节输入输出流、字符输入输出流的接口继承以及具体...适用于:初学者:能更清晰地认清javaSE的IO流部分接口与实现类之间的关系。 其他人:要使用IO部分但忘记具体的实现类和常用方法可以充当帮助文档使用。
17.1.2 JavaSE 5.0中固定尺寸线程池的基本知识 374 17.1.3 自定义尺寸固定线程池的使用 375 17.1.4 单任务线程池的使用 377 17.1.5 可变尺寸线程池的使用 378 17.1.6 延迟线程池的使用 380 17.1.7 使用...
第2章给出了流的完整概述:第3 章给出了使用lambda表达式设计库的有效技巧;第4 章介绍了JavaFX:第5章详细介绍了Java新增 的日期/时间API;第6章介绍了原子计数器、并发哈 希映射、并行数组操作等特性中的改进;第...
4.本游戏涉及继承、克隆、线程以及IO流的使用、控制台颜色的修改的运用 战斗系统 简易逻辑 1.判定双方速度,速度快的先出手 2.攻击时有50%概率拿出自己的一把武器,对敌人进行一次攻击 3.攻击有【暴击率 + 武器暴击...
全套课程精细讲解,高级课程超过其他机构30%的课程量,经过我们全套课程系统学习的同学,可轻松从事Java高级工程师或系统架构师岗位,课程提供全套代码笔记其它相关素材及答疑服务,可谓是低投资高回报!学习前或...
第2章给出了流的完整概述;第3章给出了使用lambda表达式设计库的有效技巧;第4章介绍了JavaFX;第5章详细介绍了Java新增的日期/时间API;第6章介绍了原子计数器、并发哈希映射、并行数组操作等特性中的改进;第7章...
与第1卷(涵盖了核心的语言和类库特性)一样,本卷已经更新到了JavaSE6。并且对新内容都作了重点标注。书中所有的示例程序都进行了详细的设计,用来演示最新的编程技术。并展示针对专业开发者在现实中所碰到的典型...
本书聚焦于Java语言中更高级的特性,包括下列内容:流与文件、网络、数据库编程、XML、JNDI与LDAP、国际化、高级 GUI组件、Java 2D、JavaBeans、安全、RMI与Web服务、高级AWT、注解、本地方法。
JavaSE2 ------ :进阶的Java语法,包括异常,流,集合,泛型,多线程,JDBC,网络编程等。 JavaSE3 ------ :后续理解框架的基础,包括反射机制,注解。 JavaUse ------ :开发中常用的工具包,包括Log4j,测试...
1.3.1 JavaSE标准版8 1.3.2 JavaEE企业版10 1.3.3 JavaME微型版11 1.4 JavaSE环境安装和配置12 1.4.1 什么是JDK12 1.4.2 JDK安装目录和实用命令工具介绍12 1.4.3 设置环境变量13 1.4.4 验证配置的正确性14 1.5 ...
\contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{... {16}Web基础}{215}{chapter.16} {16.1}HTML}{215}{section.16.1} {...
分为两个部分笔记1是比较完善的,笔记2有些内容杂乱,错别字较多(主要是懒了)文件io流哪里有些错误,其他的还可以吧
1.2.2 java简介 java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的...
本书涵盖了JavaSE开发环境配置、程序设计基础、面向对象相关技术、常用API、UML基础知识。在章节中穿插了上机习题,并提供了答案,用于对该章内容进行阶段性总结演练。 作者长期从事教学工作,积累了丰富的经验,其...
3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于springboot的在线聊天系统源码+项目说明.zip # Huxin-Project huxin项目是一套聊天系统,包括前台手机界面及后台...
服务网关,对外暴露统一规范的接口和包装响应结果,包括各个子系统的交互接口、对外开放接口、开发加密接口、接口文档等服务,可在该模块支持验签、鉴权、路由、限流、监控、容错、日志等功能。示例图: ![API网关]...
等你参加工作,有了可持续发展的事业动力和经济基础,有时间有精力闲的没事儿干的时候,再去研究那些其它吧。 曾经有一个故事,说得是产能和产量的关系。 一个人喜欢读书,读了一辈子,无所不通,这时候要做任何...