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