一、数据流
- DataInputStream:
- DatalnputStream能够以一种与机器无关的方式,直接从底层字节翁入流读取Java基本类型和Sring类型的数据,常用方法包括
public DatalnputStream(lnputStream in) //构造方法
public final boolean readBoolean()
public final byte readByte()
public final char readChar()
public final double readDouble()
public final float readFloat()
public final int readlnt()
public finallong readLong()
public final short readShort()
public final String readUTF()
- DatalnputStream 是包裹流,必须依附于InputStream。
- DataOutputStream
- DataOutputStream能够以一种与机器无关的方式直接将Java基本类型和String类型数据写出到其他的字节输出流。常见方法:
public DataOutputStream(OutputStream in)
public final boolean writeBoolean()
public final byte writeByte()
public final char writeChar()
public final double writeDouble()
public final float writeFloat()
public final int writelnt()
public final long writeLong()
public final short writeShort()
public final String writeUTF()
- DataOutputStream 是包裹流,必须依附于OutputStream。
二、数据流实例:将long类型数据写入byte数组,然后再从byte数组中把该数据读出来
- 附注:这是Socket编程中经常要完成的功能,因为网络编程中经常要把数值型数据存入byte数组中,然后把byte数组打包成数据包(即DatagramPacket),再把数据包经过网络传输到目的机,目的机再从byte数组中把原数值型数据还原回来。
- 本例子要使用到:
ByteArraylnputStream
ByteArrayOutputStream
DatalnputStream
DataOutputStream
- 编程实现
import java.io.*;
public class TestByteArrayOutputStream {
public static void main(String[] args) {
//输出数据
//ByteArrayOutputStream不仅是OutputStream的一个子类,也是一个字节数组
ByteArrayOutputStream baos=new ByteArrayOutputStream();
DataOutputStream dos=new DataOutputStream(baos);
long m=1234567;
try {
dos.writeLong(m);
} catch (IOException e) {
System.out.println("输出失败:"+e);
}
byte [] buf=baos.toByteArray();//创建一个新分配的 byte 数组,其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。
//返回:以 byte 数组的形式返回此输出流的当前内容
//关联输出流的buf
ByteArrayInputStream bais =new ByteArrayInputStream(buf);
//ByteArrayInputStream bais =new ByteArrayInputStream(buf,0,buf.length);
DataInputStream dis =new DataInputStream(bais);
long n;
try {
n=dis.readLong();
System.out.println("n="+n);
} catch (IOException e) {
System.out.println("输出失败:"+e);
}
}
}
三、转换流
- OutputStreamWriter 流是把 OutputStream 流 转化成Writer 流的流;
InputStreamReader 是把InputStream 转化成 Reader;
OutputStreamWriter 和InputStreamReader 都是包裹流。 - 例子:将键盘输入的字符组成字符串直接赋给String 对象
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class TestString {
public static void main(String[] args) {
String str;
//System.in代表键盘,System.out代表显示器
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
//System.in属于InputStream这样一个类,通过InputStreamReader把它转换成reader
try {
str = bfr.readLine();
System.out.println("str=" + str);
} catch (IOException e) {
System.out.println(e);
}
}
}
- readLine()与 回车符的问题:
String str ="123";
BufferedReader br =new BufferedReader(newInputStreamReader(System.in));
str = br.readLine();
如果直接输入回车的话,则
(1) br.readLine()会丢弃回车符,而不是返回 回车符,即br.readLine()遇到回车符时终止读取,并且会把读取到的回车符自动丢弃掉;
(2) br.readLine() 返回的是“”而不是 null,“”表示空字符串,null表示空指针,空指针就是空地址,空地址就是不指向任何存储单元的意思
四、Print流
- Print 流只输出,不输入;
- 分类:
PrintWriter 输出字符
PrintStream 输出字节 - Print流的由来
(1)Writer的 write 方法可以写入:
一个字符
一个字符数组
一个字符数组的一部分
一个字符串
一个字符的一部分
(2)OutputStream 的write 方法可以写入:
一个字节
一个字节数组
一个字节数组的一部分
(3)DataOutputStream 流可以写入:
一个字节
一个字节数组(继承自Outputstream)
一个字节数组的一部分
所有的基本类型数据的二进制代码,如:writeDouble(8.8);写入的是8.8的二进制代码,共占8个字节。
(4)PrintStream 流的 print可以写入:
所有基本类型数据的字符串形式表示,如:print(8.8);写入的是 ‘8’ ‘.’ ‘8’ 这三个字符,共占3个字节。 - PrintStream
PrintStream在OutputStream基础之上提供了增强的功能,即可以方便地输出各种类型数据(而不仅限于byte型)的格式化表示形式;
PrintStream重载了print和println方法,用于各种不同类型数据的格式化输出;
格式化输出是指将一个数据用其字符串格式输出。 - PrintWriter
PrintWriter提供了PrintStream的所有打印方法,其方法也从不抛出IOException。
与PrintStream的区别:
作为处理流使用时,PrintStream只能封装OutputStream类型的字节流,而PrintWriter既可以封装OutputStream,还能够封装Writer;PrintWriter中的println()方法具有更好的跨平台性。 - DataOutputStream 中的 writeXXX(data)方法是把data在内存中的二进制数据写入文件;
PrintStream中的printIn(data)是把该数据的格式化后的字符串写入文件。
import java.io.*;
public class TestPrintStream {
public static void main(String[] args) throws Exception{
DataOutputStream dos=new DataOutputStream(new FileOutputStream("D://java1.txt"));
dos.writeLong(12345);//实际写入文件的是00 00 00 00 00 00 30 39
dos.close();
System.out.printf("%#X\n",12345); //输出的是12345的十六进制:0X3039
PrintStream ps=new PrintStream(new FileOutputStream("D://java2.txt"),true);
ps.println(12345);//实际写入文件的是'1' '2' '3' '4' '5'
//PrintWriter pw=new PrintWriter(new PrintStream("java"));
ps.close();
}
}
运行结果:
7.标准输入输出的重定向:
try{
.....
}catch (Exception e){
e.printStackTrace();
}
......
//e.printStackTrace();
//默认把错误信息输出到System.err 所关联的设备中
例1:
import java.io.PrintStream;
public class TestSystem {
public static void main(String[] args) throws Exception{
PrintStream ps=new PrintStream("d:/java3.asd");
System.setOut(ps);//将System.out的值重新设置为ps,即System.out不再关联到显示器,而是关联到"d:/java3.asd"文件
//说明out值可以修改,而且可以根据和它同类型的对象对它重新赋值
System.out.println("哈哈哈哈");//这实际上是把"哈哈哈哈"输出到了System.out所关联的"d:/java3.asd"中
}
}
运行结果:
例2:将键盘输入的数据输入A文件中,如果输入有误,则把错误信息输出到B文件中 :
import java.io.PrintStream;
import java.util.Scanner;
public class TestSetOutErr {
public static void main(String[] args) {
PrintStream psOut=null;
PrintStream psError=null;
Scanner sc=null;
try{
psOut=new PrintStream("d:/Out.txt");
psError=new PrintStream("d:/Error.txt");
sc=new Scanner(System.in);
int num=1;
System.setOut(psOut);
System.setErr(psError);
while(num!=0){
num=sc.nextInt();
System.out.println(num);
}
}catch (Exception e){
//输入的不是整型数据就出错,并把出错的信息写到System.err所关联的"d:/Error.txt"文件中
System.err.println("出错的信息是:");
e.printStackTrace();//e.printstackTrace():默认把错误信息输出到System.err所关联的设备中
}
}
}
运行结果: