Java面向对象  IO  (四)



知识概要:

                (1)打印流

(2)序列流 SequenceInputStream

(3)ObjectInputStream与ObjectOutputStream

(4)RandomAccessFile

(5)DataInputStream与DataOutputStream

(6)ByteArrayInputStream

(7)字符编码

IO包中的其他类

打印流:

该流提供了打印方法,可以将各种数据类型的数据都原样打印。

字节打印流:

PrintStream

构造函数可以接收的参数类型:

1, file对象。File

        2,字符串路径。String

        3,字节输出流。OutputStream



字符打印流:

       PrintWriter

构造函数可以接收的参数类型:

       1,file对象。File

       2,字符串路径。String

       3,字节输出流。OutputStream

       4,字符输出流,Writer。

import java.io.*;

class  PrintStreamDemo
{
public static void main(String[] args) throws IOException
{
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true); String line = null; while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
out.println(line.toUpperCase());
//out.flush();
} out.close();
bufr.close(); }
}

打印流

• PrintWriter与PrintStream


          • 可以直接操作输入流和文件。 

序列流

          • SequenceInputStream

          • 对多个流进行合并。 

操作对象

          • ObjectInputStream与ObjectOutputStream


          • 被操作的对象需要实现Serializable (标记接口);

import java.io.*;
import java.util.*;
class SequenceDemo
{
public static void main(String[] args) throws IOException
{ Vector<FileInputStream> v = new Vector<FileInputStream>(); v.add(new FileInputStream("c:\\1.txt"));
v.add(new FileInputStream("c:\\2.txt"));
v.add(new FileInputStream("c:\\3.txt")); Enumeration<FileInputStream> en = v.elements(); SequenceInputStream sis = new SequenceInputStream(en); FileOutputStream fos = new FileOutputStream("c:\\4.txt"); byte[] buf = new byte[1024]; int len =0;
while((len=sis.read(buf))!=-1)
{
fos.write(buf,0,len);
} fos.close();
sis.close();
}
}

切割和合并文件

import java.io.*;
import java.util.*; class SplitFile
{
public static void main(String[] args) throws IOException
{
//splitFile();
merge();
} public static void merge()throws IOException
{
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>(); for(int x=1; x<=3; x++)
{
al.add(new FileInputStream("c:\\splitfiles\\"+x+".part"));
} <span style="color:#ff0000;"> final Iterator<FileInputStream> it = al.iterator(); Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()
{
public boolean hasMoreElements()
{
return it.hasNext();
}
public FileInputStream nextElement()
{
return it.next();
}
}; </span> SequenceInputStream sis = new SequenceInputStream(en); FileOutputStream fos = new FileOutputStream("c:\\splitfiles\\0.bmp"); byte[] buf = new byte[1024]; int len = 0; while((len=sis.read(buf))!=-1)
{
fos.write(buf,0,len);
} fos.close();
sis.close();
} public static void splitFile()throws IOException
{
FileInputStream fis = new FileInputStream("c:\\1.bmp"); FileOutputStream fos = null; byte[] buf = new byte[1024*1024]; int len = 0;
int count = 1;
while((len=fis.read(buf))!=-1)
{
fos = new FileOutputStream("c:\\splitfiles\\"+(count++)+".part");
fos.write(buf,0,len);
fos.close();
} fis.close(); }
}

ObjectInputStream ObjectOutputStream

import java.io.*;
class Person implements Serializable
{ public static final long serialVersionUID = 42L; private String name;
transient int age;
static String country = "cn";
Person(String name,int age,String country)
{
this.name = name;
this.age = age;
this.country = country;
}
public String toString()
{
return name+":"+age+":"+country;
}
}
import java.io.*;

class ObjectStreamDemo
{
public static void main(String[] args) throws Exception
{
//writeObj();
readObj();
}
public static void readObj()throws Exception
{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt")); Person p = (Person)ois.readObject(); System.out.println(p);
ois.close();
} public static void writeObj()throws IOException
{
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream("obj.txt")); oos.writeObject(new Person("lisi0",399,"kr")); oos.close();
}
}

RandomAccessFile

• 随机访问文件,自身具备读写的方法。

     • 通过skipBytes(int x),seek(int x)来达到随机访问。

管道流

• PipedInputStream和PipedOutputStream 

     • 输入输出可以直接进行连接,通过结合线程使用。

import java.io.*;

class Read implements Runnable
{
private PipedInputStream in;
Read(PipedInputStream in)
{
this.in = in;
}
public void run()
{
try
{
byte[] buf = new byte[1024]; System.out.println("读取前。。没有数据阻塞");
int len = in.read(buf);
System.out.println("读到数据。。阻塞结束"); String s= new String(buf,0,len); System.out.println(s); in.close(); }
catch (IOException e)
{
throw new RuntimeException("管道读取流失败");
}
}
} class Write implements Runnable
{
private PipedOutputStream out;
Write(PipedOutputStream out)
{
this.out = out;
}
public void run()
{
try
{
System.out.println("开始写入数据,等待6秒后。");
Thread.sleep(6000);
out.write("piped lai la".getBytes());
out.close();
}
catch (Exception e)
{
throw new RuntimeException("管道输出流失败");
}
}
} class PipedStreamDemo
{
public static void main(String[] args) throws IOException
{ PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
in.connect(out); Read r = new Read(in);
Write w = new Write(out);
new Thread(r).start();
new Thread(w).start(); }
}



DataInputStream与DataOutputStream

/*
DataInputStream与DataOutputStream 可以用于操作基本数据类型的数据的流对象。 */
import java.io.*;
class DataStreamDemo
{
public static void main(String[] args) throws IOException
{
writeData();
readData(); writeUTFDemo(); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"),"gbk");//转换流 osw.write("你好");
osw.close(); readUTFDemo(); }
public static void readUTFDemo()throws IOException
{
DataInputStream dis = new DataInputStream(new FileInputStream("utf.txt")); String s = dis.readUTF(); System.out.println(s);
dis.close();
} public static void writeUTFDemo()throws IOException
{
DataOutputStream dos = new DataOutputStream(new FileOutputStream("utfdate.txt")); dos.writeUTF("你好"); dos.close();
} public static void readData()throws IOException
{
DataInputStream dis = new DataInputStream(new FileInputStream("data.txt")); int num = dis.readInt();
boolean b = dis.readBoolean();
double d = dis.readDouble(); System.out.println("num="+num);
System.out.println("b="+b);
System.out.println("d="+d); dis.close();
}
public static void writeData()throws IOException
{
DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt")); dos.writeInt(234);
dos.writeBoolean(true);
dos.writeDouble(9887.543); dos.close(); ObjectOutputStream oos = null;
oos.writeObject(new O()); }
}

RandomAccessFile

该类不是算是IO体系中子类。而是直接继承自Object。 但是它是IO包中成员。因为它具备读和写功能。

       内部封装了一个数组,而且通过指针对数组的元素进行操作。

       可以通过getFilePointer获取指针位置,同时可以通过seek改变指针的位置。

其实完成读写的原理就是内部封装了字节输入流和输出流。

通过构造函数可以看出,该类只能操作文件。

        而且操作文件还有模式:只读r,,读写rw等。

如果模式为只读 r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现异常。

        如果模式rw。操作的文件不存在,会自动创建。如果存在则不会覆盖。

class RandomAccessFileDemo
{
public static void main(String[] args) throws IOException
{
//writeFile_2();
//readFile(); //System.out.println(Integer.toBinaryString(258)); } public static void readFile()throws IOException
{
RandomAccessFile raf = new RandomAccessFile("ran.txt","r"); //调整对象中指针。
//raf.seek(8*1); //跳过指定的字节数
raf.skipBytes(8); byte[] buf = new byte[4]; raf.read(buf); String name = new String(buf); int age = raf.readInt(); System.out.println("name="+name);
System.out.println("age="+age); raf.close(); } public static void writeFile_2()throws IOException
{
RandomAccessFile raf = new RandomAccessFile("ran.txt","rw");
raf.seek(8*0);
raf.write("周期".getBytes());
raf.writeInt(103); raf.close();
} public static void writeFile()throws IOException
{
RandomAccessFile raf = new RandomAccessFile("ran.txt","rw"); raf.write("李四".getBytes());
raf.writeInt(97);
raf.write("王五".getBytes());
raf.writeInt(99); raf.close();
}
}

用于操作字节数组的流对象。

ByteArrayInputStream :在构造的时候,需要接收数据源,。而且数据源是一个字节数组。

ByteArrayOutputStream: 在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数

组。这就是数据目的地。

因为这两个流对象都操作的数组,并没有使用系统资源,所以,不用进行close关闭。

在流操作规律讲解时:

源设备,

   键盘 System.in,硬盘 FileStream,内存 ArrayStream。

   目的设备:

   控制台 System.out,硬盘FileStream,内存 ArrayStream。

用流的读写思想来操作数据。

import java.io.*;
class ByteArrayStream
{
public static void main(String[] args)
{
//数据源。
ByteArrayInputStream bis = new ByteArrayInputStream("ABCDEFD".getBytes()); //数据目的
ByteArrayOutputStream bos = new ByteArrayOutputStream(); int by = 0; while((by=bis.read())!=-1)
{
bos.write(by);
} System.out.println(bos.size());
System.out.println(bos.toString()); // bos.writeTo(new FileOutputStream("a.txt")); }
}

(IO流字符数组操作流)

CharArrayReader与CharArrayWriter跟字节数组操作流一样。

不需要调用底层资源(也就是文件),不会抛异常,除了writeTo方法外。

(IO流字符串操作流)

StringReader与StringWriter跟字节数组操作流一样。

不需要调用底层资源(也就是文件),不会抛异常

字符编码

 字符流的出现为了方便操作字符  更重要是的加入了编码转换。 通过子类转换流来完成。

• InputStreamReader

       • OutputStreamWriter

 

在两个对象进行构造的时候可以加入字符集。

(IO流编码表)

编码表由来:

计算机只能识别二进制数据,早期由来是电信号。

为了方便应用计算机,让它可以识别各个国家的文字。

就将各个国家的文字用数字来表示,并一一对应,形成一张表。这就是编码表。

常见编码表:

ASCII:美国标准信息交换码。用一个字节的7位可以表示。

ISO8859-1:拉丁码表。欧洲码表用一个字节的8位表示。

GB2312:中国的中文编码表。用两个字节来表示。

GBK:中国的中文编码表升级,融合了更多的中文文字符号。用两个字节来表示。

Unicode:国际标准码,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode

UTF-8:最多用三个字节来表示一个字符。

......

import java.io.*;

class EncodeStream
{
public static void main(String[] args) throws IOException
{
//writeText();
readText();
} public static void readText()throws IOException
{
InputStreamReader isr = new InputStreamReader(new FileInputStream("utf.txt"),"gbk"); char[] buf = new char[10];
int len = isr.read(buf); String str = new String(buf,0,len); System.out.println(str); isr.close();
}
public static void writeText()throws IOException
{
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("utf.txt"),"UTF-8"); osw.write("你好"); osw.close();
} }
/*
编码:字符串变成字节数组。 解码:字节数组变成字符串。 String-->byte[]; str.getBytes(charsetName); byte[] -->String: new String(byte[],charsetName); */
import java.util.*;
class EncodeDemo
{
public static void main(String[] args)throws Exception
{
String s = "哈哈"; byte[] b1 = s.getBytes("GBK"); System.out.println(Arrays.toString(b1));
String s1 = new String(b1,"iso-8859");
System.out.println("s1="+s1); //对s1进行iso8859-1编码。
byte[] b2 = s1.getBytes("iso-8859");
System.out.println(Arrays.toString(b2)); String s2 = new String(b2,"gbk"); System.out.println("s2="+s2); }
}

编码表特殊之处)

public class Test{

public static void main(String...args)
throws Exception{

String s ="联通";

byte[]buf = s.getBytes("GBK");

for(byte b :buf){

System.out.println(Integer.toBinaryString(b&255));

}

}

}

发现GBK联通的编码跟UFT-8的编码形式相同,于是记事本就去找UTF-8的编码表,导致了数据错乱,解决方法就是在联通前面加个文字就OK了,但是不能是Ascll值,因为UTF-8里面兼容了Ascll码表。




Java面向对象 IO (四)的更多相关文章

  1. Java面向对象 IO (一)

     Java面向对象  IO  (一) 知识概要:                (1)IO概述 (2)IO流的常用基类 (3)IO程序的书写 (4)字符流  写入  读取  文本文件的两种读取方式 ...

  2. Java面向对象 IO (三)

     Java面向对象  IO  (三) 知识概要:                    (1)IO 流的操作规律                    (2)异常日志信息IO处理          ...

  3. Java面向对象 IO (二)

     Java面向对象  IO   (二) 知识概要:               (1)字节流概述 (2)字节流复制图片 (3)IO流(读取键盘录入) (4)读取转换流,写入转换流 字节流概述   ...

  4. java面向对象中四种权限(private,protected,public,友好型)详解

    转自http://blog.csdn.net/a1237871112/article/details/50926975 及http://blog.csdn.net/blackmanren/articl ...

  5. Java之IO(四)DataInputStream和DataOutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/6986155.html 1.前言 DataInputStream和DataOutputStream分别继承了Fil ...

  6. java面向对象编程(四)--类变量、类方法

    1.什么是类变量? 类变量是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量. 如何定义类变量? 定义语法:     ...

  7. Java 面向对象(四)继承

    一.继承的概述(Inherited) 1.由来 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 其中,多个类可以称为 子类(派生类 ...

  8. java面向对象(四)之重写、重载

    重载 定义 重载:在一个类中,存在多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载. 编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会 ...

  9. Java 面向对象(四)

    代码块 什么是代码块 在类中或方法当中 使用 { } 括起来的一段代码,就称它是一个代码块. 在代码块当中定义的变量我们称是局部变量,在外面是没有办法使用的.这里定义的 a 就是一个局部变量. 代码块 ...

随机推荐

  1. 编程零基础应当如何开始学习 Python?

    提前说一下,这篇福利多多,别的不说,直接让你玩回最有手感的怀旧游戏,参数贴图很方便自己可以根据喜好修改哦. 本篇通过以下四块展开,提供大量资源对应. 选一个好版本 有没有看过<在下坂本,有何贵干 ...

  2. 201521123084 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自 ...

  3. 团队作业1——团队展示&博客作业查重系统

    团队展示: 1.队名:六个核桃 2.队员学号: 王婧(201421123065).柯怡芳(201421123067组长).陈艺菡(201421123068). 钱惠(201421123071).尼玛( ...

  4. 团队作业4——第一次项目冲刺(Alpha版本)4.27

    一.当天站立式会议照片 本次会议主要内容:组长给大家分配新一步任务,分别汇报目前所完成的内容,完善昨日的解压接口代码,并做测试修正. 二.每个人的工 三.燃尽图 横坐标:工作日,以天为单位,一共七天, ...

  5. 201521123107 《Java程序设计》第11周学习总结

    第11周作业-多线程 1.本周学习总结 2.书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法 ...

  6. 结对编程1-四则运算GUI实现(58、59)

    题目描述 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web,手机上的),成为一 ...

  7. 【Alpha】第一次项目冲刺

    今日站立式会议照片 每个人的工作 小组成员 昨天完成的工作 今天计划完成的工作 李志霖 继续访问用户以深入了解他们的需求,分别采用面访,qq等不同方式对意见进行了采集,面访了30个人,qq空间以链接的 ...

  8. 201521123011 《Java程序设计》第1周学习总结

    1. 本章学习总结 通过这章的学习让我初步认识了Java,认识到了java和之前c语言的异同点. 对java是面向对象的这句话有了一定了解 认识了jdk,jre,jvm的区别. 2.书面作业 1.为什 ...

  9. PowerBI开发 第四篇:DAX表达式

    DAX 表达式主要用于创建度量列(Measure),度量值是根据用户选择的Filter和公式,计算聚合值,DAX表达式基本上都是引用对应的函数,函数的执行有表级(Table-Level)上下文和行级( ...

  10. 《MySQL必知必会》[02] 多表联合查询

    1.基本连接 不同类型的数据,存储在多个表中,而所谓多表连接,就是将多个表联合返回一组输出. 1.1 等值连接 基本的连接方式非常简单,只需要在WHERE子句中规定如何关联即可,如下: SELECT ...