处理流

处理流类型


一、缓冲流

缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法。

J2SDK提供了四种缓冲流,其常见的构造方法为:

BufferedReader (Reader in)

BufferedReader (Reader in, int size) //sz为自定义缓存区的大小

BufferedWriter (Writer out)

BufferedWriter (Writer out, int size)


BufferedInputStream (InputStream in)

BufferedInputStream (InputStream in, int size)

BufferedOutputStream (OutputStream out)

BufferedOutputStream (OutputStream out, int size)


●缓冲输入流支持其父类的mark 和reset 方法。

BufferedReader 提供了readLine 方法用于读取一行字符串。(以 \r 或 \n 分隔

BufferedWriter 提供了newLine 用于写入一个行分隔符。

对于输出的缓冲流,写出的数据会先在内存中缓存,使用 flush 方法将会使内存中的数据立刻写出。


例1:TestBufferStream1.java

import java.io.*;
public class TestBufferStream1 {
	public static void main(String[] args) {
		try{	
			FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\desktop\\HelloWorld.java");
			BufferedInputStream bis = new BufferedInputStream(fis);
			int c = 0;
			System.out.println((char)bis.read());
			System.out.println((char)bis.read());
			bis.mark(100);//把标记放到100,从100开始读
			for(int i=0; i<=10 && (c=bis.read())!=-1 ; i++) {
				System.out.print((char)c+" ");
			}
			System.out.println();
			bis.reset();//回到标记的点
			for(int i=0; i<=10 && (c=bis.read()) != -1; i++) {
				System.out.print((char)c+" ");
			}
			bis.close();
		}catch(IOException e) {
		e.printStackTrace();
		}
	}
}










例2:TestBufferStream2.java

import java.io.*;
public class TestBufferStream2 {
	public static void main(String[] args) {
		try {
			BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\Administrator\\desktop\\Result1.txt"));
			BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\Administrator\\desktop\\Result1.txt"));
			String s = null;
			for(int i=1; i<=100; i++) {
				s = String.valueOf(Math.random());
				bw.write(s);
				bw.newLine();
			}
			bw.flush();
			while((s=br.readLine()) != null) {
				System.out.println(s);
			}
			bw.close();
			br.close();
		}catch(IOException e){
			e.printStackTrace();	
		}
	}
}


 

二、转换流

●InputStreamReader 和 OutputStreamWriter 用于字节数据字符数据之间的转换。

简单的说,就是把InputStream转换成Reader。于是现在可以直接写入字符,而不是一个字节一个字节的写入。

InputStreamReader 需要和 InputStream “套接”。

OutputStreamWriter 需要和 OutputStream “套接”。


转换流在构造时可以指定其编码集合,例如:

InputStream isr = new InputStreamReader(System.in, "ISO8859_1")

例1:TestTransform.java

import java.io.*;
public class TestTransform1 {
	public static void main(String[] args) {
		try {
			OutputStreamWriter osw = new OutputStreamWriter(
				new FileOutputStream("C:\\Users\\Administrator\\desktop\\Result2.txt"));
				osw.write("microsoftibmsunapplehp");
				System.out.println(osw.getEncoding());
				osw.close();
				osw = new OutputStreamWriter(
					new FileOutputStream("C:\\Users\\Administrator\\desktop\\Result2.txt",true),
					"ISO8859_1");
				osw.write("microsoftibmsunapplehp");
				System.out.println(osw.getEncoding());
				osw.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

例2:TestTransform2.java(阻塞/同步)

import java.io.*;
public class TestTransform2 {
	public static void main(String[] args) {
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		String s = null;
		try {
			s = br.readLine();
			while(s!=null) {
				if(s.equalsIgnoreCase("exit")) {
					break;
				}
				System.out.println(s.toUpperCase());
				s = br.readLine();
			}
			br.close();
	}catch(IOException e) {
			e.printStackTrace();
		}
	}
}


三、数据流

DataInputStream 和 DataOutputStream 分别继承自 InputStream 和 OutputStream ,它属于处理流,需要分别“套接”在 InputStream 和 OutputStream 类型的节点流上。


DataInputStream 和 DataOutputStream 提供了可以存取与机器无关的Java原始类型数据(如:int, double等)的方法。


DataInputStream 和 DataOutputStream 的构造方法为:

DataInputStream (InputStream in)

DataOutputStream (OutputStream out)


例3:TestDataStream

import java.io.*;
public class TestDataStream {
	public static void main(String[] args) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();//第一步在内存中分配了一个字节数组,第二步把管道插上去
		DataOutputStream dos = new DataOutputStream(baos);//
		try {
			dos.writeDouble(Math.random());
			dos.writeBoolean(true);
			
			ByteArrayInputStream bais = 
				new ByteArrayInputStream(baos.toByteArray());
			System.out.println(bais.available());
			DataInputStream dis = new DataInputStream(bais);
			System.out.println(dis.readDouble());
			System.out.println(dis.readBoolean());
			dos.close();
			dis.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}


注:队列。先进先出,先写的先读


四、Print 流

PrintWriter 和 PrintStream 都属于输出流,分别针对字符字节

PrintWriter 和 PrintStream 提供了重载的 Print 方法

Println 方法用于多种数据类型的输出。


PrintWriter 和 PrintStream 的输出操作不会抛出异常,用户通过检测错误状态获取错误信息。

PrintWriter 和 PrintStream 有自动 flush 功能  


例1:TestPrintStream1.java

import java.io.*;
public class TestPrintStream1 {
	public static void main(String[] args) {
		 PrintStream ps = null;
		 try {
			 FileOutputStream fos = 
					new FileOutputStream("C:\\Users\\Administrator\\Desktop\\log.dat");
			 ps = new PrintStream(fos);
		 }catch(IOException e){
			 e.printStackTrace();
		 }
		 if(ps != null) {
			 System.setOut(ps);
		 }
		 int ln = 0;
		 for(char c = 0; c <= 60000; c++) {
			 System.out.print(c+" ");
			 ln++;
			 if(ln >=100) {
				 System.out.println();
				 ln = 0;
			 }
		 }
	}
}


例2:TestPrintStream2.java

import java.io.*;
public class TestPrintStream2 {
	public static void main(String[] args) {
		String filename = args[0];
		if(filename!=null) {
			list(filename,System.out);//System.out是PrintStream类型
		}
		
		
	}
	
	public static void list(String f,PrintStream fs) {
			try{
				BufferedReader br = new BufferedReader(new FileReader(f));
				String s = null;
				while((s=br.readLine()) != null) {
					fs.println(s);
				}
				br.close();
			}catch(IOException e){
				fs.println("无法读取文件");
			}
		}
}


例3:TestPrintStream3.java

import java.util.*;
import java.io.*;

public class TestPrintStream3 {
	public static void main(String[] args) {
		String s = null;
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		try {
			FileWriter fw = new FileWriter("C:\\Users\\Administrator\\Desktop\\logfile.log",true);
			PrintWriter log = new PrintWriter(fw);
			while( (s=br.readLine()) != null ) {
				if(s.equalsIgnoreCase("exit")) {
					break;
				}
				System.out.println(s.toUpperCase());
				log.println("_____");
				log.println(s.toUpperCase());
				log.flush();
			}
			log.println("==="+new Date()+"===");
			log.flush();
			log.close();
		}catch(IOException e) {
			e.printStackTrace(); 
		}
	}
}


五、Object 流

直接Object 写入或读出

●transient 关键字

transient修饰的成员变量在序列化的时候不予考虑


●serializable接口

标记性接口。想把某个对象序列化,必须实现这个接口,打上标记。


●externalizable 接口

一个serializable的子接口,可以控制序列化的过程。有两个方法:readExternal (ObjectInput in) 和 writeExternal(ObejectOutput out)


例1:TestObjectIO.java

import java.io.*;
public class TestObjectIO {
	public static void main(String[] args) {
		try{
			T t = new T();
			t.k = 8;
			FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\testobjectio.dat");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(t);
			oos.flush();
			oos.close();
			
			FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\testobjectio.dat");
			ObjectInputStream ois = new ObjectInputStream(fis);
			T tReaded = (T)ois.readObject();
			System.out.println(tReaded.i + " "+tReaded.j + " "+tReaded.d+" "+tReaded.k);
		}catch(IOException e){
			e.printStackTrace();
		}catch(ClassNotFoundException e1){
			e1.printStackTrace();
		}
	}
}

class T implements Serializable {
	int i = 0;
	int j = 9;
	double d = 2.3;
	int k = 15;
}


















  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark数据处理图描述了数据在Spark中的动和处理过程。以下是一个典型的Spark数据处理图的示例: 1. 数据加载:从数据源(如文件系统、数据库等)加载原始数据,并创建一个初始的RDD(弹性分布式数据集)或DataFrame。 2. 数据转换和清洗:使用Spark的转换操作,如map、filter、flatMap等,对数据进行转换和清洗。可以将RDD转换为DataFrame,以便后续的结构化处理。 3. 特征提取和转换:使用Spark的特征提取操作,如特征转换器(如Tokenizer、CountVectorizer等)或特征选择器(如PCA、ChiSqSelector等),对数据进行特征提取和转换。 4. 数据分析和挖掘:使用Spark的分析和挖掘功能,如聚合操作、统计函数、机器学习算法等,对数据进行分析和挖掘。可以使用Spark的机器学习库(如MLlib)来训练模型,进行分类、回归、聚类等任务。 5. 结果输出:将处理后的结果保存到目标数据源,如文件系统、数据库等,或者将结果发送到其他系统进行进一步处理或展示。 需要注意的是,Spark的数据处理图是一个有向无环图(DAG),其中每个节点代表一个转换或操作,边表示数据的动。这个图可以根据实际情况进行自定义和扩展,以适应特定的数据处理需求。 使用Spark的数据处理图可以充分利用Spark的分布式计算能力和优化执行引擎,高效地处理大规模的数据,并支持复杂的数据处理程和分析任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值