文件输出流、缓存、文件复制
outText();//使用字节输出字符串到txt文件(或追加内容)
appendText();//使用RandomAccessFile(此类还可以进行读操作)向文件中追加内容
charOutText();//使用字符输出流,将字符串输出到txt中
bufferCharOutText();//加缓存的、按字符输出(按字节输出一样)
readOutZip();//读取文件然后写入到另一个路径下(相当于拷贝)
package com.io.file;
import java.io.*;
public class OutFile {
public static void main(String[] args) {
//outText();//使用字节输出字符串到txt文件(或追加内容)
//appendText();//使用RandomAccessFile(此类还可以进行读操作)向文件中追加内容
//charOutText();//使用字符输出流,将字符串输出到txt中
//bufferCharOutText();//加缓存的、按字符输出(按字节输出一样)
readOutZip();//读取文件然后写入到另一个路径下(相当于拷贝)
}
/**
* 读取文件(按字节)然后写入到另一个路径下(相当于拷贝)
*/
private static void readOutZip() {
//File.separator是为了避免因路径符(在不同系统中是不一样的)不正确引起的路径错误
File infile = new File("D:"+File.separator+"A_软件工具包/《植物大战僵尸》跳关修改器.rar");
File outfile = new File("G:"+File.separator+"A_软件工具包/《植物大战僵尸》跳关修改器.rar");
//此处需创建父目录,如果没有父目录,则会报错,找不到路径
if(!outfile.getParentFile().exists()){
outfile.getParentFile().mkdirs();
}
InputStream in = null;
BufferedInputStream bufIn = null;
OutputStream out = null;
BufferedOutputStream bufOut =null;
try {
in = new FileInputStream(infile);
bufIn = new BufferedInputStream(in);
byte [] bytes = new byte[102400];
out = new FileOutputStream(outfile);
bufOut = new BufferedOutputStream(out);
int length;
while ((length = bufIn.read(bytes)) != -1){
System.out.println(length);
bufOut.write(bytes,0,length);
bufOut.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(bufOut != null){
try {
bufOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(out != null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bufIn != null){
try {
bufIn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 加缓存的、按字符输出
*/
private static void bufferCharOutText() {
File file = new File("G:/test/BufferedCharText.txt");
String content = "汉皇重色思倾国,御宇多年求不得。\n杨家有女初长成,养在深闺人未识。\n天生丽质难自弃,一朝选在君王侧。\n回眸一笑百媚生,六宫粉黛无颜色。\n春寒赐浴华清池,温泉水滑洗凝脂。\n侍儿扶起娇无力,始是新承恩泽时。\n云鬓花颜金步摇,芙蓉帐暖度春宵。\n春宵苦短日高起,从此君王不早朝。\n承欢侍宴无闲暇,春从春游夜专夜。\n后宫佳丽三千人,三千宠爱在一身。\n金屋妆成娇侍夜,玉楼宴罢醉和春。\n姊妹弟兄皆列土,可怜光彩生门户。\n遂令天下父母心,不重生男重生女。\n骊宫高处入青云,仙乐风飘处处闻。\n缓歌慢舞凝丝竹,尽日君王看不足。\n渔阳鼙鼓动地来,惊破霓裳羽衣曲。\n九重城阙烟尘生,千乘万骑西南行。\n翠华摇摇行复止,西出都门百余里。\n六军不发无奈何,宛转蛾眉马前死。\n花钿委地无人收,翠翘金雀玉搔头。\n君王掩面救不得,回看血泪相和流。\n黄埃散漫风萧索,云栈萦纡登剑阁。\n峨嵋山下少人行,旌旗无光日色薄。\n蜀江水碧蜀山青,圣主朝朝暮暮情。\n行宫见月伤心色,夜雨闻铃肠断声。\n天旋地转回龙驭,到此踌躇不能去。\n马嵬坡下泥土中,不见玉颜空死处。\n君臣相顾尽沾衣,东望都门信马归。\n归来池苑皆依旧,太液芙蓉未央柳。\n芙蓉如面柳如眉,对此如何不泪垂。\n春风桃李花开夜,秋雨梧桐叶落时。\n西宫南苑多秋草,落叶满阶红不扫。\n梨园弟子白发新,椒房阿监青娥老。\n夕殿萤飞思悄然,孤灯挑尽未成眠。\n迟迟钟鼓初长夜,耿耿星河欲曙天。\n鸳鸯瓦冷霜华重,翡翠衾寒谁与共。\n悠悠生死别经年,魂魄不曾来入梦。\n临邛道士鸿都客,能以精诚致魂魄。\n为感君王辗转思,遂教方士殷勤觅。\n排空驭气奔如电,升天入地求之遍。\n上穷碧落下黄泉,两处茫茫皆不见。\n忽闻海上有仙山,山在虚无缥渺间。\n楼阁玲珑五云起,其中绰约多仙子。\n中有一人字太真,雪肤花貌参差是。\n金阙西厢叩玉扃,转教小玉报双成。\n闻道汉家天子使,九华帐里梦魂惊。\n揽衣推枕起徘徊,珠箔银屏迤逦开。\n云鬓半偏新睡觉,花冠不整下堂来。\n风吹仙袂飘飖举,犹似霓裳羽衣舞。\n玉容寂寞泪阑干,梨花一枝春带雨。\n含情凝睇谢君王,一别音容两渺茫。\n昭阳殿里恩爱绝,蓬莱宫中日月长。\n回头下望人寰处,不见长安见尘雾。\n惟将旧物表深情,钿合金钗寄将去。\n钗留一股合一扇,钗擘黄金合分钿。\n但令心似金钿坚,天上人间会相见。\n临别殷勤重寄词,词中有誓两心知。\n七月七日长生殿,夜半无人私语时。\n在天愿作比翼鸟,在地愿为连理枝。\n天长地久有时尽,此恨绵绵无绝期。\n#end\n";
//此处创建不创建文件都可以,但是需要创建父目录,如果没有父目录,则会报错,找不到路径
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
Writer writer = null;
BufferedWriter bufferedWriter = null;
try {
writer = new FileWriter(file,true);
//缓冲区大小默认是8K,查看源码defaultCharBufferSize = 8192;
//每次直接写入磁盘,效率低,加上缓存后,先将内容写入到缓存中,等缓存满了在写入到文件中
bufferedWriter = new BufferedWriter(writer);
bufferedWriter.write(content);
bufferedWriter.flush();//此处刷新会立即写入,如果此句不写,则在close时,写入文件
} catch (IOException e) {
e.printStackTrace();
}finally {
if(bufferedWriter != null){
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(writer != null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 使用字符输出流,将字符串输出到txt中
*/
private static void charOutText() {
File file = new File("G:/test/CharText.txt");
//此处创建不创建文件都可以,但是需要创建父目录,如果没有父目录,则会报错,找不到路径
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
Writer writer = null;
try {
writer = new FileWriter(file,true);
//writer.write("输出字符!\n");
writer.append('草');
} catch (IOException e) {
e.printStackTrace();
}finally {
if(writer != null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 使用字节方式向文件中追加内容
*/
private static void appendText() {
File file = new File("G:/test/outText1.txt");
//此处创建不创建文件都可以,但是需要创建父目录,如果没有父目录,则会报错,找不到路径
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
RandomAccessFile randomAccessFile = null;
try {
//第二个参数:r:只读;rw:读写;rws:写操作时,同步刷新到磁盘,刷新内容和元数据;rwd:写操作时,同步刷新到磁盘,刷新内容;
randomAccessFile = new RandomAccessFile(file,"rw");
//获取文件长度
long fileLength = randomAccessFile.length();
//将写文件的指针移到文件尾
randomAccessFile.seek(fileLength);
/**
* 此处有中文乱码的坑
* String.getBytes();默认会选取系统中的编码格式,而idea中的项目一般默认是UTF-8,获取此项目的编码即为UTF-8。
* 但是windows(中国版)默认编码为GBK,向文件中输出时,输出的是UTF-8的字节数组,自然会中文乱码
*
* 一般此处不使用writeBytes(String str),因为底层转化成字节数组时,使用UTF-8编码
* 此处建议使用write(Byte [] byte),使用程序控制编码
*/
randomAccessFile.write("追加内容\n".getBytes("GBK"));//String.getBytes():会按照系统默认编码获取字符串的字节码
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(randomAccessFile != null){
try {
randomAccessFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 使用字节输出字符串到txt文件(或追加内容)
*/
private static void outText() {
File file = new File("G:/test/outTxt.txt");
//此处创建不创建文件都可以,但是需要创建父目录,如果没有父目录,则会报错,找不到路径
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
byte [] bytes = "OutPutStream输出到文件中\n".getBytes();
OutputStream out = null;
try {
//FileOutputStream(File file):此种输出会覆盖原有内容
//FileOutputStream(File file,String append):此种输出会追加内容
//默认保存文件格式编码为UTF-8
out = new FileOutputStream(file,true);
out.write(bytes);
bytes = "追加内容\n".getBytes();
out.write(bytes);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(out != null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}