IO

/*
 *IO:输入、输出的一些简单实例。
 */

package classfile;

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

public class IODemo
{
	public static void main(String[] args)
	{
		method_InputAndOutput();
		method_ReaderAndWriter();
		method_InputAndWriter();
		method_MyReadLine();
		method_KeyboardAndPrint();
		method_TraversalDirectory();
		method_SequenceAndSplit();
		method_ObjectStream();
		method_RandomAccessFile();
		method_Charset();
		
	}

	public static void method_InputAndOutput()
	{
		//复制一个图片文件
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;

		try
		{
			bis = new BufferedInputStream(new FileInputStream("SecondaryFile\\IODemoOne.jpg"));
			bos = new BufferedOutputStream(new FileOutputStream("SecondaryFile\\IODemoOneCopy.jpg"));

			byte[] arr = new byte[1024];
			int length = 0;
			while((length=bis.read(arr))!=-1)
			{
				bos.write(arr,0,length);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(bis!=null)
				try
				{
					bis.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			if(bos!=null)
				try
				{
					bos.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}
	}

	public static void method_ReaderAndWriter()
	{
		//复制一个文本文件
		BufferedReader br = null;
		BufferedWriter bw = null;

		try
		{
			br = new BufferedReader(new FileReader("SecondaryFile\\IODemoTwo.txt"));
			bw = new BufferedWriter(new FileWriter("SecondaryFile\\IODemoTwoCopy.txt"));

			char[] arr = new char[1024];
			int length = 0;
			while((length=br.read(arr))!=-1)
			{
				bw.write(arr,0,length);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(br!=null)
				try
				{
					br.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			if(bw!=null)
				try
				{
					bw.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}
	}

	public static void method_InputAndWriter()
	{
		//将一个文本文件输出在控制台上
		BufferedReader br = null;
		PrintWriter pw = null;

		try
		{
			br = new BufferedReader(new InputStreamReader(new FileInputStream("SecondaryFile\\IODemoTwo.txt")));
			pw = new PrintWriter(System.out,true);

			char[] arr = new char[1024];
			int length = 0;
			while((length=br.read(arr))!=-1)
			{
				//pw.write(arr,0,length);
				pw.println(String.valueOf(arr,0,length));
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(br!=null)
				try
				{
					br.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			/*此处不关闭输出流,是为了后续的使用
			if(pw!=null)
				try
				{
					pw.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			*/
		}

		System.out.println("---------method_InputAndWriter run over------------");
	}

	public static void method_MyReadLine()
	{
		/**
		 *方法内部类,装饰了一个文件读取流,具备读一行的功能。
		 */
		class MyFileReader
		{
			private Reader r = null;
			
			/**
			 *对象一被初始化,就有了一个文件读取流与之相对应。
			 *
			 *param r
			 *			一个文件读取流
			 */
			public MyFileReader(Reader r)
			{
				this.r = r;
			}
			
			/**
			 *传递文件读取流的读方法
			 */
			public int read()throws IOException
			{
				return r.read();
			}
			
			/**
			 *可以按行读取文本的方法。对读一个字符方法的装饰。
			 */
			public String readLine()throws IOException
			{
				//定义一个字符串缓冲区,用于存储读取到的一行文本
				StringBuilder sr = new StringBuilder();

				//定义一个变量,用于接收读取到的字符数据
				int ch = 0;

				while((ch=r.read())!=-1)
				{
					if(ch=='\r')//适用于window系统
					{
						continue;
					}

					if(ch=='\n')
					{
						return sr.toString();
					}
					else
					{
						sr.append((char)ch);
					}
				}
				
				if(sr.length()!=0)//避免最后一行没有换行符,造成的数据丢失。
				{
					return sr.toString();
				}

				return null;
			}
			
			/**
			 *传递文件读取流的关闭方法。
			 */
			public void close()throws IOException
			{
				r.close();
			}
		}
		
		MyFileReader mfr = null;
		PrintWriter pw = null;

		try
		{
			mfr = new MyFileReader(new FileReader("SecondaryFile\\IODemoTwo.txt"));
			pw = new PrintWriter(System.out,true);

			String str = null;
			while((str=mfr.readLine())!=null)
			{
				pw.println(str);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(mfr!=null)
				try
				{
					mfr.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			/*此处不关闭输出流,是为了后续的使用
			if(pw!=null)
				try
				{
					pw.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			*/
		}
		
		System.out.println("---------method_MyReadLine run over------------");
	}

	public static void method_KeyboardAndPrint()
	{
		BufferedReader br = null;
		PrintWriter pw = null;

		try
		{
			br = new BufferedReader(new InputStreamReader(System.in));
			pw = new PrintWriter(System.out,true);

			String str = null;
			while((str=br.readLine())!=null)
			{
				if(!"over".equals(str))
				{
					pw.println(str.toUpperCase());
				}
				else
				{
					return;
				}
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(br!=null)
				try
				{
					br.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			/*此处不关闭输出流,是为了后续的使用。
			if(pw!=null)
				try
				{
					pw.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			*/
		}
	}

	public static void method_TraversalDirectory()
	{
		StringBuilder sr = new StringBuilder();
		/**
		 *方法内部类,用于提供遍历目录文件的功能。
		 */
		class TraversalDirectory
		{
			/**
			 *遍历目录文件,并记录其中的文件名称。
			 *
			 *param dir
			 *			一个目录文件
			 */
			public void traversalDirectory(File dir)
			{
				sr.append(dir+"\r\n");

				File[] files = dir.listFiles();
				for(int i=0;i<files.length;i++)
				{
					if(files[i].isDirectory())
					{
						traversalDirectory(files[i]);
					}
					else
					{
						if(files[i].getName().endsWith(".avi"))
						{
							sr.append(files[i]+"\r\n");
						}
					}
				}
			}
		}
		
		new TraversalDirectory().traversalDirectory(new File("D:\\学习相关资料\\黑马程序员_毕向东最新经典Java基础视频"));

		PrintWriter pw = null;
		try
		{
			pw = new PrintWriter("SecondaryFile\\IODemoThree_TraversalDirectory.txt");
			pw.println(sr.toString());
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(pw!=null)
				try
				{
					pw.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}
	}

	public static void method_SequenceAndSplit()
	{
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		int count = 1;

		try
		{
			bis = new BufferedInputStream(new FileInputStream("SecondaryFile\\IODemoOne.jpg"));

			byte[] arr = new byte[1024*32];
			int length = 0;
			while((length=bis.read(arr))!=-1)
			{
				bos = new BufferedOutputStream(new FileOutputStream("SecondaryFile\\Split_"+(count++)+".partfile"));
				bos.write(arr,0,length);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(bis!=null)
				try
				{
					bis.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			if(bos!=null)
				try
				{
					bos.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}

		//---------在本方法中--以上为文件切割--以下为文件合并------------------

		List<InputStream> list = new ArrayList<InputStream>();
		SequenceInputStream sis = null;

		try
		{
			for(int i=1;i<count;i++)
			{
				list.add(new BufferedInputStream(new FileInputStream("SecondaryFile\\Split_"+i+".partfile")));
			}

			Iterator<InputStream> iterator = list.iterator();
			sis = new SequenceInputStream(new Enumeration<InputStream>(){
				public boolean hasMoreElements()
				{
					return iterator.hasNext();
				}

				public InputStream nextElement()
				{
					return iterator.next();
				}
			});

			bos = new BufferedOutputStream(new FileOutputStream("SecondaryFile\\IODemoSequence.jpg"));
			
			byte[] arr = new byte[1024];
			int length = 0;
			while((length=sis.read(arr,0,arr.length))!=-1)
			{
				bos.write(arr,0,length);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(sis!=null)
				try
				{
					sis.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			if(bos!=null)
				try
				{
					bos.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}	
	}

	public static void method_ObjectStream()
	{
		class Person implements Serializable
		{
			private String name;

			//如果变量被transient修饰,则不被序列化
			private transient int age;
			
			//给类添加序列化版本号,当该版本号固定之后,可以对类进行修改,依然可以读取原来的被序列化对象。
			private static final long serialVersionUID = 42L;

			public Person(String name,int age)
			{
				this.name = name;
				this.age = age;
			}

			public String toString()
			{
				return name+"..."+age;
			}
		}

		ObjectOutputStream oos = null;

		try
		{
			oos = new ObjectOutputStream(new FileOutputStream("SecondaryFile\\IODemoObjectStream.obj"));
			oos.writeObject(new Person("张三",20));
			oos.writeObject(new Person("李四",21));
			oos.writeObject(new Person("王五",22));
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(oos!=null)
				try
				{
					oos.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}

		//---------本方法中--以上为对象的持久化存储--以下为读取被持久化的对象-------

		ObjectInputStream ois = null;

		try
		{
			ois = new ObjectInputStream(new FileInputStream("SecondaryFile\\IODemoObjectStream.obj"));
			
			System.out.println(ois.readObject().toString());
			System.out.println(ois.readObject().toString());
			System.out.println(ois.readObject().toString());
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(ois!=null)
				try
				{
					ois.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}
	}

	public static void method_RandomAccessFile()
	{
		//其内部封装了一个byte数组,既能读又能写。
		RandomAccessFile raf =null;

		try
		{
			//此流只能操作文件,并且要指定读写模式
			raf = new RandomAccessFile("SecondaryFile\\IODemoRandomAccess.txt","rw");

			raf.write("张三".getBytes());
			raf.writeInt(97);
			raf.write("李四".getBytes());
			raf.writeInt(98);
			raf.write("王五".getBytes());
			raf.writeInt(99);
			
			byte[] arr = new byte[4];
			for(int i=0;i<3;i++)
			{
				//可以随机访问文件中的数据,数据必须是有规律的。
				raf.seek(8*i);

				raf.read(arr);
				String name = new String(arr);
				int age = raf.readInt();

				System.out.println("name = "+name+",age = "+age);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(raf!=null)
				try
				{
					raf.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}
	}

	public static void method_Charset()
	{
		OutputStreamWriter osw = null;
		InputStreamReader isr = null;

		try
		{
			osw = new OutputStreamWriter(new FileOutputStream("SecondaryFile\\IODemoCharsetUTF-8.txt"),"utf-8");
			osw.write("你好");
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(osw!=null)
				try
				{
					osw.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}

		try
		{
			osw = new OutputStreamWriter(new FileOutputStream("SecondaryFile\\IODemoCharsetGBK.txt"),"gbk");
			osw.write("你好");
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(osw!=null)
				try
				{
					osw.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}

		//-------本方法中--以上为输出数据--以下为读取数据--一个文件不能够同时关联两个不同的流----------------------
		try
		{
			isr = new InputStreamReader(new FileInputStream("SecondaryFile\\IODemoCharsetUTF-8.txt"),"gbk");
			
			char[] arr = new char[1024];
			int length = isr.read(arr);
			System.out.println("用UTF-8编码,用GBK解码:"+String.valueOf(arr,0,length));
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(isr!=null)
				try
				{
					isr.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}

		try
		{
			isr = new InputStreamReader(new FileInputStream("SecondaryFile\\IODemoCharsetUTF-8.txt"),"utf-8");
			
			char[] arr = new char[1024];
			int length = isr.read(arr);
			System.out.println("用UTF-8编码,用UTF-8解码:"+String.valueOf(arr,0,length));
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(isr!=null)
				try
				{
					isr.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}

		try
		{
			isr = new InputStreamReader(new FileInputStream("SecondaryFile\\IODemoCharsetGBK.txt"),"utf-8");
			
			char[] arr = new char[1024];
			int length = isr.read(arr);
			System.out.println("用GBK编码,用UTF-8解码:"+String.valueOf(arr,0,length));
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(isr!=null)
				try
				{
					isr.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}

		try
		{
			isr = new InputStreamReader(new FileInputStream("SecondaryFile\\IODemoCharsetGBK.txt"),"gbk");
			
			char[] arr = new char[1024];
			int length = isr.read(arr);
			System.out.println("用GBK编码,用GBK解码:"+String.valueOf(arr,0,length));
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(isr!=null)
				try
				{
					isr.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}

		//---------用ISO8859-1解码错误,可以反编译,在重新用正确的方式解码-----------

		try
		{
			isr = new InputStreamReader(new FileInputStream("SecondaryFile\\IODemoCharsetUTF-8.txt"),"iso8859-1");
			
			char[] arr = new char[1024];
			int length = isr.read(arr);
			System.out.println("用UTF-8编码,用ISO8859-1解码:"+String.valueOf(arr,0,length));
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(isr!=null)
				try
				{
					isr.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}

		try
		{
			isr = new InputStreamReader(new FileInputStream("SecondaryFile\\IODemoCharsetGBK.txt"),"iso8859-1");
			
			char[] arr = new char[1024];
			int length = isr.read(arr);
			System.out.println("用GBK编码,用ISO8859-1解码:"+String.valueOf(arr,0,length));
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(isr!=null)
				try
				{
					isr.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值