打印流:该流提供了打印方法,可以将各种数据类型的数据都原样打印。
字节打印流:PrintStream
构造函数可以接收的参数类型:File对象、字符串路径(String)、字节输出流(OutputStream)
字符输出流:PrintWriter
构造函数可以接收的参数类型:File对象、字符串路径(String)、字节输出流(OutputStream)、字符输出流(Writer)
public PrintWriter(OutputStream out, boolean autoFlush)
作用: 通过现有的 OutputStream 创建新的 PrintWriter。此便捷构造方法创建必要的中间 OutputStreamWriter,后者使用默认字符编码将字符转换为字节。
需求:输入一行,打印一行(大写)
//读取键盘
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
//PrintWriter:是打印流,构造函数就是确定打印到哪去,打印到控制台,就是System.out,它是printStream,是OutputStream的子类
PrintWriter out=new PrintWriter(System.out,true) ;
String line=null;
while((line=bufr.readLine())!=null) {
out.println(line.toUpperCase());//打印完自动换行
//out.flush();因为是println,所以在构造函数为true时,可以自动刷新而不用写了
}
out.close();
bufr.close();
}
刷新是针对流而言的
若想写入到文件中,可以用file、String,但是他们都不带自动刷新,要想使用自动刷新,可以写成文件输出流:PrintWriter out=new PrintWriter(new FileOutputStream(“a.txt”),true); 可不写out.flush();
合并流SequenceInputStream:将多个流合并成为一个流
构造函数:public SequenceInputStream(Enumeration
需求:将多个文件内容合并到一个文件中
思路:①先将多个流写入集合中②通过v.elements()得到合并输入流
③形成合并流后,就当成普通的输入流,然后通过数组的方法写入输出流即可
//多个文件用集合存,只有Vector中有返回值是Eumeration的,所以用该集合
Vector<FileInputStream> v=new Vector<FileInputStream>();
v.add(new FileInputStream("e:\\1.txt"));//流对象仍然是对象
v.add(new FileInputStream("e:\\2.txt"));
v.add(new FileInputStream("e:\\3.txt"));
Enumeration<FileInputStream> en=v.elements();
SequenceInputStream sis=new SequenceInputStream(en);//合并流
//将合并流写入到4.txt中
FileOutputStream fos=new FileOutputStream("E:\\4.txt");
//流的第二种读法
byte[] buf=new byte[1024];
int len=0;
while((len=sis.read(buf))!=-1) {
fos.write(buf,0,len);
}
fos.close();
sis.close();
切割:将一个文件切成多个文件
思路:就是根据buf将数据存入一个文件,形成多个文件
FileInputStream fis=new FileInputStream("E:\\xx.jpg");
byte [] buf=new byte[1024*1024];
int len=0;
int count=0;
while((len=fis.read(buf))!=-1) {
count++;
File file=new File("E:"+File.separator,count+".part");
FileOutputStream fos=new FileOutputStream(file);
fos.write(buf, 0, len);
fos.close();
}
fis.close();
将上面的.part合并成.jpg:因为Vector是同步方法,低效,所以用ArrayList,中间加入Enumeration匿名内部类
ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
for(int x=1;x<=4;x++) {
al.add(new FileInputStream("E:\\"+x+".part"));
}
Iterator<FileInputStream> it=al.iterator();
//在SequenceInputStream的构造函数中必须是enumeration,所以用匿名内部类创建了一个enumeration的对象
Enumeration<FileInputStream> en=new Enumeration<FileInputStream>()
{
public boolean hasMoreElements() {
return it.hasNext();
}
public FileInputStream nextElement() {
return it.next();
}
};
SequenceInputStream sis=new SequenceInputStream(en);
FileOutputStream fos=new FileOutputStream("E:\\merge.jpg");
byte[] buf=new byte[1024*1024];
int len=0;
while((len=sis.read(buf))!=-1) {
fos.write(buf, 0, len);
}
fos.close();