Java中流的问题总结(实例)

时间:2021-09-01 04:02:09
 
package mooc;

import java.io.IOException;
/*
 * 回车汉子代表两个字节,一个字符
 */
public class stream {
	public static void main(String[] args){
		System.out.println("Hello world");
		byte[] buffer = new byte[1024];
		try {
			int len = System.in.read(buffer);
			String s = new String(buffer,0,len);
			System.out.println("读到了多少字节"+len);
			System.out.println(s);
			System.out.println("s的长度是"+s.length());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}
package mooc;
//文件的读和写  现在很少用了
import java.util.Scanner;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;//Data用以读写二进制方式表达的基本数据类型的数据 如int等基本数据类型
import java.io.DataOutputStream;
import java.io.FileInputStream;//文件输入流//只能处理字节 二进制文件
import java.io.FileNotFoundException;
import java.io.FileOutputStream;//文件输出流
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class filestream {
	public static void main(String[] args){
//		System.out.println("Hello world 下面是文件字节流操作");
//		byte[] buf = new byte[10];
//		for(int i = 0 ;i<buf.length;i++){
//			buf[i] = (byte)i;
//		}
//		try {
//			/*在当前目录下新建一个文件,如果这个文件有,就
//			清空原本的内容然后写入心内容,如果没有,就新建一个文件*/
//			FileOutputStream out = new FileOutputStream("a.dat");
//			try {
//				out.write(buf);
//			} catch (IOException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//			try {
//				out.close();
//			} catch (IOException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//		} catch (FileNotFoundException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		
//		System.out.print("下面是流过滤器");
//		try {
//			DataOutputStream out = new DataOutputStream(
//					new BufferedOutputStream(
//							new FileOutputStream("a.dat")));
//		/*有了DataOutputStream之后我们写的东西就不仅仅是字节了,DataOutputStream
//		我们要接在一个字节流之上并且中间要有一个缓冲器    也可以说成是一个基于一FileOutput
//		Stream的BufferedOutputStream*/
//			int i = 0xcafebabe;	
//				out.writeInt(i);
//				out.close();
//			 DataInputStream in = new DataInputStream(
//					 new BufferedInputStream(
//							 new FileInputStream("a.dat")));
//			int j = in.readInt();//从in里读一个int
//			
//		} catch (FileNotFoundException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		
		
//		
//		
//		/*在流上建立文本处理  Reader和Writer是用来处理Unicode编码的文件的如果
//		如果文件本身是用Unicode编码的,则我们可以用Reader和Write直接进行读写,
//		如果文件本身并不是Unicode,文件本身可能是accisc码,文件本身可能是国标码,
//		或者就算用的是Unicode,也可能用的是UTF-8这样的编码形式,所以在这种文件本身
//		并不是Unicode编码时,我们需要借助Stream,我们需要通过Stream去打开那个文件,
//		然后在Stream的基础上,以过滤流或者说是过滤器的方式去建立Reader和Writer来实现
//		文本的输入和输出所有我们常见的做法是这样的。*/
//		System.out.print("下面是通过流过滤器来写文本");
//		try {
//			PrintWriter out = new PrintWriter(
//					new BufferedWriter(//Writer缓冲器
//							new OutputStreamWriter(/*这是一个桥梁,
//							构建起了Stream和Writer之间的一个桥梁,他的输入时Stream
//							它的输出就是一个Wirter*/
//							new FileOutputStream("a.txt"))));
//		/*有了DataOutputStream之后我们写的东西就不仅仅是字节了,DataOutputStream
//		我们要接在一个字节流之上并且中间要有一个缓冲器    也可以说成是一个基于一FileOutput
//		Stream的BufferedOutputStream*/
//			int i = 123456;	
//				out.println(i);//有了PrintWriter之后我们可以做的事情
//				out.close();
//			/*Reader 常用的是BufferedReader  readLine()能够将文本按照行
//			 * 整行地读进来
//			 * 还有LineNumberReader 可以得到行号getLineNumer(),在行号中跳转
//			 * Reader中还有一个FileReader,它直接就是InputStreamReader的子类
//			 * 它自己就能在一个二进制的或者说非unicode的文件中建立起一个流,然后最后
//			 * 形成一个reader,对于文件来说,FileReader很好用
//			 */
//			BufferedReader in = new BufferedReader(
//					new InputStreamReader(
//							new FileInputStream("src/mooc/filestream.java")));
//			String line;
//			while((line=in.readLine())!=null){
//				//readLine是文件读取返回String,当读到文件末尾的时候会返回null
//				System.out.println(line);
//			}
//			in.readLine();//
//		} catch (FileNotFoundException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		
		
		/*UTF-8编码,UTF编码是用两个字节来表示一个字符,但是因为在英文的文档中,
		 * 大家都是assic码字符用一个字节就可以表达,UTF-8就是说如果你是英文字符,
		 * 例如字母abcd和数字1234那么,我就用一个字节来表达,如果你是不常见的汉字我可能用三个字节
		 * 来表达你一个汉字,这样的编码形式就是UTF-8,它即采用了Unicode编码,保证了在任何平台上
		 * 都能用的可移植性
		 * 补充:Unicode码也是一种国际标准编码,采用二个字节编码,
		 * 与ASCII码不兼容。目前,在网络、Windows系统和很多大型软件中得到应用。*/
		System.out.println("下面是关于文本编码若干问题");
		try {
			PrintWriter out = new PrintWriter(
					new BufferedWriter(//Writer缓冲器
							new OutputStreamWriter(/*这是一个桥梁,
							构建起了Stream和Writer之间的一个桥梁,他的输入时Stream
							它的输出就是一个Wirter*/
							new FileOutputStream("a.txt"))));
		/*有了DataOutputStream之后我们写的东西就不仅仅是字节了,DataOutputStream
		我们要接在一个字节流之上并且中间要有一个缓冲器    也可以说成是一个基于一FileOutput
		Stream的BufferedOutputStream*/
			int i = 123456;	
				out.println(i);//有了PrintWriter之后我们可以做的事情
				out.close();
			/*Reader 常用的是BufferedReader  readLine()能够将文本按照行
			 * 整行地读进来
			 * 还有LineNumberReader 可以得到行号getLineNumer(),在行号中跳转
			 * Reader中还有一个FileReader,它直接就是InputStreamReader的子类
			 * 它自己就能在一个二进制的或者说非unicode的文件中建立起一个流,然后最后
			 * 形成一个reader,对于文件来说,FileReader很好用
			 * 
			 */
			BufferedReader in = new BufferedReader(
					new InputStreamReader(/*这里的InputstreamReader就是要把你刚才读到的
							字节形式的转化成文本形式,如果你不给出编码方式,他就用系统默认的编码
							方式,如文本是GBK,所以我们可以通过加一个编码参数,才解决读取UTF8的问题*/
							new FileInputStream("utf8.txt"),"utf8"));
			/*为什么当文件是UTF8时我们就读不出来了呢,是因为Eclipse环境中汉字的编码默认告诉的
			 * 是GBK国标,但是你实际的文件并不是国标的 */
			String line;
			while((line=in.readLine())!=null){
				//readLine是文件读取返回String,当读到文件末尾的时候会返回null
				System.out.println(line);
			}
			in.readLine();//
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
	}
}

package mooc;

import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Serializable;
/*对象串行化,读写类 用到了
 * ObjectInputStream类   readObject()
 * ObjectOutputStream类  writeObject()
 * Serializable接口
 */
class Student implements Serializable{//可以被串行化的类
	private String name;
	private int age;
	private int grade;
	public Student(String name,int age,int grade){
		this.name = name;
		this.age = age;
		this.grade = grade;
	}
	public String toString(){
		return name+" "+age+""+grade;
	}
}
public class streamzongheyingyong {
	public static void main(String[] args){
		Student s1 = new Student("John",18,5);
		System.out.println(s1);
		try {
			ObjectOutputStream out = 
					new ObjectOutputStream(
							new FileOutputStream
							("obj.dat"));
			out.writeObject(s1);
			out.close();
			ObjectInputStream in = 
					new ObjectInputStream
					(new FileInputStream("obj.dat"));
			Student s2 = (Student)in.readObject();
			System.out.println(s2);
			System.out.println(s1==s2);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}