除IO流外其他的流的简单介绍

数据流:

分为数据输入流(DateInputStream)和数据输出流(DateOutputStream

 

下面来看数据流的读写:

package com.westos.Other;
 
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
/**
 *数据流:针对Java基本类型的数据进行读写操作
 *数据输入流:DataInputStream 
 *数据输出流:DataOutputStream 
 */
public class DateStreamDome {
 
public static void main(String[] args) throws Exception {

read();
}
 
private static void read() throws IOException   {
//创建数据输入流
DataInputStream dis=new DataInputStream(new FileInputStream("d.txt"));

//读取数据
int i = dis.readInt();
boolean flag = dis.readBoolean();
double l = dis.readDouble();
char c = dis.readChar();
float f = dis.readFloat();

//关闭数据
dis.close();

//获取数据
System.out.println(i);
System.out.println(flag);
System.out.println(l);
System.out.println(c);
System.out.println(f);
}

private static void write() throws IOException{
//创建数据输出流
DataOutputStream dos=new DataOutputStream(new FileOutputStream("d.txt"));

//写数据
dos.writeInt(73);
dos.writeDouble(13.25);
dos.writeChar('a');
dos.writeFloat(12.45f);
dos.writeBoolean(true);

//关闭资源
dos.close();
}
}

内存操作流

内存操作流一般用来临时存储文件,分为:

内存操作输出流:byteArrayOutputStream:该流不需要关闭资源

  构造方法:ByteArrayOutputStream() 

内存操作输入流:byteArrayInputStream

  构造方法:ByteArrayInputStream(byte[] buf)

内存操作流:一个程序结束后,那么这些程序的变量,就会从内存消失(马上消失的这些数据进行读取写入)

 

package com.westos.Other;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
 
public class byteArrayStreamDome {
 
public static void main(String[] args) throws IOException {

//创建内存操作输出流
ByteArrayOutputStream baos=new ByteArrayOutputStream();

//写数据
baos.write("hello".getBytes());
baos.write("world".getBytes());

byte[] array = baos.toByteArray();
//创建内存操作输出流
ByteArrayInputStream bais=new ByteArrayInputStream(array);

//读取数据:一次读取一个字节
int len=0;
while((len=bais.read())!=-1) {
System.out.print((char) len);
}
//关闭资源
bais.close();
}
}

打印流:

打印流分为字符打印流和字节打印流

字符打印流:(只针对于输出流)printWriter

1)只能写数据(只能针对目的地文件进行操作),不能读数据(不能针对源文件进行操作)

2)可以针对文件直接进行操作

如果一个类中的构造方法里面有File对象或者String类型数据,这个类可以对文本文件直接操作

FileInputStream

  FileOutputStream

FileWriter

  FileReader..

PrintWriter

3)自动刷新功能::PrintWriter(OutputStream out/Writer out,boolean autoflush);第二个参数如果是true 表示启动自动刷新功能

4)打印的方法:print(XXX x)/println(XXX  xx)

例如:

package com.westos.Other;
 
import java.io.IOException;
import java.io.PrintWriter;
 
public class PrintWriterDome {
 
public static void main(String[] args) throws IOException {

//创建字符打印流对象
PrintWriter pw=new PrintWriter("e.txt");

//这个打印没有换行
/*pw.write("hello");
pw.write("world");
pw.write("java");*/

//打印数据,这个打印可以实现自动换行
pw.println("hello");
pw.println("world");
pw.println("java");

//关闭资源
pw.close();
}
}

 

我们的字符打印流有一个构造方法可以实现自动刷新,让我们用字符打印流去实现文件之间的copy

例如:

package com.westos.Other;
 
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
 
/**
 * @author 杰哥
 *使用字符缓冲输入流和字符打印流来copy文件
 */
public class CopyDome {
 
public static void main(String[] args) throws IOException {

//创建字符缓冲输入流
BufferedReader br=new BufferedReader(new FileReader("file.txt"));
//创建字符打印流,这样的对象可以实现自动刷新
PrintWriter pw=new PrintWriter(new FileWriter("f.txt"),true);

//一次读取一行
String str=null;
while((str=br.readLine())!=null) {
pw.println(str);
}

//关闭资源
br.close();
pw.close();
}
}

 

字节打印流:标准的输入输出流

标准的输入流:

InputStream in=System.In

标准的输出流:

OutputStream out=System.out

jdk5以后,添加了Scanner类,可以实现键盘录入的功能

我们还可以通过流来实现第二种键盘录入的方法

 

例如:

package com.westos.Other;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
/**
 * @author 杰哥
 *通过标准的输入流与字符缓冲输出流实现另一种键盘录入的功能
 */
public class SystemStreamDome {
 
public static void main(String[] args) throws IOException {

/*//创建一个标准输入流
InputStream in=System.in;
//再创建一个字符转换流对象
InputStreamReader isr=new InputStreamReader(in);
//创建一个字符缓冲输入流对象
BufferedReader br=new BufferedReader(isr);*/

//我们可以直接用匿名对象实现一步完成
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

//来实现键盘录入的功能,当你需要的是字符串时
System.out.println("请您输入一个字符串...");
//调用字符缓冲输入流 的读取一行的方法
String line = br.readLine();
System.out.println("您输入的字符串是:"+line);
 
//当需要你输入的是整数,并需要进行判断
int number;
while(true) {
System.out.println("请您输入一个整数...");
try {
String str=br.readLine();
//将字符串转化成整数
number = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
// e.printStackTrace();
System.out.println("只能输入整数...");
}
}
System.out.println("您输入的整数是:"+number);
}
}

 

标准的输出流:这种方法我们了解就好

package com.westos.Other;
 
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
 
public class SystemOutDome {
 
public static void main(String[] args) throws IOException {

//创建标准的输出流
PrintStream out=System.out;
//去打印数据
out.println("hello");
System.out.println("-------------------");

//通过字节打印流去创建字符缓冲输出流对象
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
//写数据
bw.write("迪丽热巴");
bw.newLine();
bw.write("最美");
bw.flush();
//关闭资源 
bw.close();
}
}
运行结果:
hello
-------------------
迪丽热巴
最美

 

合并流:sequenceInputStream

构造方法1

  public SequenceInputStream(InputStream s1, InputStream s2)

需求:将两个文件的内容复制到一个文件中

例如:

package com.westos.Other;
 
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.SequenceInputStream;
 
public class SequenceInputStreamDome {
 
public static void main(String[] args) throws Exception {
//创建两个源文件对象
InputStream in1=new FileInputStream("file.txt");
InputStream in2=new FileInputStream("f.txt");

//创建合并流对象
SequenceInputStream sis=new SequenceInputStream(in1,in2);

//创建一个字节缓冲输出流对象
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("copy.txt"));

//一次读取一个数组
byte[] ch=new byte[1024];
int len=0;
while((len=sis.read(ch))!=-1) {
bos.write(ch, 0, len);
bos.flush();
}
//关闭资源
bos.close();
sis.close();
}
}

 

构造方法2

 public SequenceInputStream(Enumeration e)

需求:将多个文件的内容复制到一个文件中

 

例如:

package com.westos.Other;
 
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;
 
public class SequenceInputStreamDome2 {
 
public static void main(String[] args) throws Exception {
//创建一个Vector集合对象
Vector<InputStream> v=new Vector<InputStream>();

//创建三个字节输入流对象
InputStream in1=new FileInputStream("c.txt");
InputStream in2=new FileInputStream("f.txt");
InputStream in3=new FileInputStream("file.txt");

//将三个字节输入流添加到集合中
v.add(in1);
v.add(in2);
v.add(in3);

//调用elements方法,这里的返回类型正好是构造方法中需要的类型
Enumeration<InputStream> elements = v.elements();
//创建合并流对象
SequenceInputStream sis=new SequenceInputStream(elements);

//创建一个字节缓冲输出流对象
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("g.txt"));

//一次读取一个数组
byte[] bys=new byte[1024];
int len=0;
while((len=sis.read(bys))!=-1) {
bos.write(bys, 0, len);
bos.flush();
}
bos.close();
sis.close();

  }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章