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. zookeeper原理介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt354 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它 ...

  2. ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解

    ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解 1.1. 名词解释 1.2. Kestrel基本工作原理 1.2.1. Kestrel的基本架构 1.2.2. Ke ...

  3. Java线程调度—休眠

    线程休眠的方法是Thread.sleep(long millis) 和Thread.sleep(long millis, int nanos) ,均为静态方法,那调用sleep休眠的哪个线程呢?简单说 ...

  4. asp.net core 2.0 web api基于JWT自定义策略授权

    JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端 ...

  5. 转:【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)

    载请注明出处:http://blog.csdn.net/ns_code/article/details/17524153 在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作 ...

  6. MacOS下免密码ssh登陆

       由于配置过程中需要频繁的进行ssh连接到开发服务器执行命令以及通过scp命令向服务器拷贝文件等依赖ssh连接的操作.所以,配置本地环境跟服务器之间的ssh免密码连接可以有效的提升工作效率.    ...

  7. RobotFramework安装完成后怎么在桌面显示ride图标

    安装了RobotFramework后,怎么让桌面上显示带有机器人的图标呢? 一.桌面上创建ride快捷方式 进入到python的安装目录的/Scripts目录下,找到ride.py文件-->右键 ...

  8. 201521123052《Java程序设计》第7周学习总结

    1. 本周学习总结 参考资料: XMind 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Ob ...

  9. 201521123026 《Java程序设计》第4周学习总结

    1. 本章学习总结 尝试使用思维导图总结有关继承的知识点 使用常规方法总结其他上课内容 1.类的重写:在子类中重写的方法需要和父类被重写的方法具有相同的方法名.参数列表以及返回值类型.当子类重写父类的 ...

  10. 201521123013 《Java程序设计》第11周学习总结

    1. 本章学习总结 2. 书面作业 Q1.1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥 ...