Java 打印流 、文件合并

  1、  Java 打印流 使用 PrintStream

package com.denganzhi.demo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.Scanner;

public class Main1 {
	
	public static void main(String[] args) throws IOException {
		
// 		System.in        标准键盘输入
//		System.out       标准键盘输出
//		System.err       标准出错输出
		
		// 1. 控制台输出1
//		PrintStream ps1 =System.out;
//		ps1.println("System.out");
//		ps1.close();
		
		// 2. 控制台错误输出
//		PrintStream ps2 =System.err;
//		ps2.println("System.out");
//		ps2.close();
		
		//3.  控制台输入
//	  System.out.println("请输入用户名:");
//      Scanner Sc=new Scanner(System.in);
//      String name= Sc.next();
//      System.out.println(name);
	
		
      //4. 封装输入,指定输入源,控制台, 
		// 输入源可以 是控制台、文件 、ByteArrayOutputStream
//  	InputStream is =System.in;  
//	BufferedReader br = new BufferedReader(new InputStreamReader(is));  //包装流
//	System.out.println("请输入用户名:");
//	String msg =br.readLine();
//	System.out.println("我睡到:"+msg);
		
		
		
		// 5. 应用
		// 重新输入到文件
		//PrintStream(OutputStream out, boolean autoFlush), 创建新的打印流,自动刷新,否则没有输出结果,当然关闭流的时候自动刷新          
//				System.setOut(new PrintStream(new BufferedOutputStream(new FileOutputStream("E:/a.txt")),true));
//						System.out.println("a");  //控制台  -->文件		
//						System.out.pr intln("test");
						//回控制台  setOut
//						System.setOut(new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.out)),true));//必须是追加
//								System.out.println("back....");
//						                System.out.println("呵呵呵");
						  //这里必须要自动刷新,否者没有          
				
		
		
		// 6.  重定向输入
		 //使用System.in重置输入控制台,自能把对应文件的数据读取出来				                
						                InputStream is =System.in;  //从文件中输入
						        		is = new BufferedInputStream(new FileInputStream("E:/a.txt"));
						        		Scanner sc = new Scanner(is);
						        		System.out.println("读取文件第一行:");
						        		System.out.println(sc.nextLine());
						        		//这样也是可以把文件中的数据全部读取出来
						                        while(sc.hasNext()){
						                            System.out.println(sc.nextLine());
						                        }		                
	}

}

  2、 装饰设计模式 

Voice 类:

package com.denganzhi.demo;

public class Voice {
	int voiceSize;

	public Voice(int voiceSize) {
		super();
		this.voiceSize = voiceSize;
	}

	public int getVoiceSize() {
		return voiceSize;
	}
	

}

 Amplifier类:

package com.denganzhi.demo;



public class Amplifier {
	public Voice voice;

	public Amplifier() {
		super();
	}

	public Amplifier(Voice voice) {
		super();
		this.voice = voice;
	}
	public void say(){
	    System.out.println(voice.getVoiceSize()*10000);
	}
}

 ZhuangShi.java

package com.denganzhi.demo;

public class ZhuangShi {
	
	public static void main(String[] args) {
		
	
		// 装饰设计模式
		Amplifier anAmplifier=new Amplifier(new Voice(100));
		//BufferReader 也是这个道理
		// 通过麦克风,声音得到了扩大
	     anAmplifier.say();
		
	}
	

}


  3.  RandomAccessFile  RandomAccessFile 从指定文件的第几个字节开始读

	//	 3. RandomAccessFile 从指定文件的第几个字节开始读
		RandomAccessFile randomAccessFile=new RandomAccessFile(new File("E:/a.txt"), "r");
		// windows每一行文件     a\r\n
		randomAccessFile.seek(3);  //  从第2个字节开始读
		
		byte[] flush=new byte[1024];
		
		int len=-1;
		while(  (len=randomAccessFile.read(flush))!=-1){
			System.out.println(new String(flush,0,len));
		}
		randomAccessFile.close();

  
  4.  文件拆分

 实现思路:
// 1.  快数
// 2.  每块名称
// 3.    splitFileDeatil(i,beginPos,actualBlockSize);  
            // i: 需要合并的第几块文件     beginPos: 合并的起始位置    actualBlockSize: 需要合并的实际大小
            // 第i次合并其实位置       beginPos + i* actualBlockSize
// 4. 拆分文件读取字节问题
                // 如果每次读取1024个但是    每次需要拆分1025个字节
                // 第一次 读取 1024个字节, 第二次 读取 1个 字节

	public static class SpiltFile{
		String filePah="E:/a.txt";    //文件路径
		int size;    //块 数  
		long blockSize=6;  // 每块大小,最后一块大小需要计算
		List<String> blockPathList=new ArrayList<>();   // 每一块名称
		 
		public  void init(){
			File filePathF=new File(filePah);
			if(!filePathF.exists()){
				return;
			}
			long length =  filePathF.length();
		//	System.out.println("length:"+length);
			// 1.  快数
			size= (int) (Math.ceil(length*1.0/this.blockSize));
			// 2.  每块名称
			for (int i = 0; i < size; i++) {
				blockPathList.add("快数"+i+".txt");
			}
			
			// 3.	splitFileDeatil(i,beginPos,actualBlockSize);  
			// i: 需要合并的第几块文件     beginPos: 合并的起始位置    actualBlockSize: 需要合并的实际大小
			// 第i次合并其实位置       beginPos + i* actualBlockSize
			long beginPos=0;
			long actualBlockSize= blockSize;
			for (int i = 0; i <size; i++) {
				if(i==size-1){
					// 最后一块
					actualBlockSize= length- beginPos;
				}
				// 0-3
				// 3-6
				splitFileDeatil(i,beginPos,actualBlockSize);
				beginPos= beginPos+ blockSize;
				
			}
		//	System.out.println("size:"+size);
		}
		BufferedOutputStream boStream;
		public  void splitFileDeatil(int i,long beginPos,long actualBlockSize){
		//	System.out.println("i:"+i +" beginPos:"+ beginPos + "actualBlockSize:"+actualBlockSize);
			File filePathF=new File(filePah);
			File destFile=new File("E:\\test\\"+blockPathList.get(i));
		//	System.out.println(destFile.getAbsolutePath());
			
			//选择流
			RandomAccessFile raf=null;
			
			try {
				raf=new RandomAccessFile(filePathF, "r");
				boStream=new BufferedOutputStream(new FileOutputStream(destFile));
				
				raf.seek(beginPos);
				
				int len=0;
				byte[] flush=new byte[3];   //每次读3个字节
				// 4. 拆分文件读取字节问题
				// 如果每次读取1024个但是    每次需要拆分1025个字节
				// 第一次 读取 1024个字节, 第二次 读取 1个 字节
			// actualBlockSize= 1025
				while(  (len=raf.read(flush))!=-1){
	// 2
					// actualBlockSize  每块大小
					// 1025 -1 = 1024
					if(actualBlockSize-len>0){
						// 每次读 3个字节
						System.out.println(i+"  "+new String(flush,0,len));
						boStream.write(flush, 0, len);
						actualBlockSize= actualBlockSize-len;	
					}else{
						// 1 个字节  实际读取
						System.out.println(i+"  "+new String(flush,0,len));
						boStream.write(flush, 0, len);
						break;
					}
					
			
					
				}
				
				
				
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
			try {
				boStream.flush();
				boStream.close();
				raf.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
				
			}
			
		
		}
	}

如何使用:

public class Main2 {

	public static void main(String[] args) throws IOException {//  4. 文件分割
		SpiltFile spiltFile=new SpiltFile();
		spiltFile.init();	
		}
	}

效果图: 


   5. 文件合并:

 // 文件合并,把文件 逐个 内容读取出来合并

public void merge1() throws IOException{
		// 文件合并,把文件 逐个 内容读取出来合并
		  File dest=new File("E:\\b.txt");
		  File src= new File("E:\\test");
		  File srcArr[] = src.listFiles();
		  BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(dest,true)); // 追加
		  BufferedInputStream ins=null;
		  for (File file : srcArr) {
			  ins=new BufferedInputStream(new FileInputStream(file));
			  byte flush[]=new byte[1024];
			  int len=-1;
			  while(   ( len = ins.read(flush) )!=-1 ){
				  bos.write(flush,0,len);
			  }
			  bos.flush();
			  
			System.out.println(file.getAbsolutePath());
		}
				bos.close();
				ins.close();
	}


   6. SequenceInputStream  Api功能可以 把多个流合并 成一个流 实现文件合并 

public class Main2 {

	public static void main(String[] args) throws IOException {
		  File dest=new File("E:\\b.txt");
		  File src= new File("E:\\test");
		  File srcArr[] = src.listFiles();
		  Vector<InputStream> vi=new Vector<>();
		  
		  BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(dest,true)); // 追加
		// 把 流 保存到容器中
		  for (File file : srcArr) {
			  vi.add(new BufferedInputStream(new FileInputStream(file)));
		}
		 
		  // SequenceInputStream  Api功能可以 把多个流合并 成一个流
		  SequenceInputStream seq=new SequenceInputStream(vi.elements());
		  
		  byte flush[]=new byte[1024];
		  
		  int len= -1;
		  // 单做一个流使用
		  while(  (len=seq.read(flush)) !=-1 ){
			  bos.write(flush, 0, len);
		  }
		  bos.close();
		  seq.close();
		
		  }
		  
		
	}
发布了101 篇原创文章 · 获赞 110 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/dreams_deng/article/details/105082135
今日推荐