除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();

  }
}

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