IO流
使用FileWriter复制文件
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("IO流_2.txt");
FileWriter fw = new FileWriter("copytext_1.txt");
int ch = 0;
while((ch=fr.read())!=-1){
fw.write(ch);
}
fw.close();
fr.close();
}
使用缓冲区,提高效率
private static final int BUFFER_SIZE = 1024;
/**
* @param args
*/
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("IO流_2.txt");
fw = new FileWriter("copytest_2.txt");
char[] buf = new char[BUFFER_SIZE];
int len = 0;
while((len=fr.read(buf))!=-1){
fw.write(buf, 0, len);
}
} catch (Exception e) {
throw new RuntimeException("读写失败");
}finally{
if(fw!=null)
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
if(fr!=null)
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用java内置的高效字节流完成文件复制
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("buf.txt");
BufferedReader bufr = new BufferedReader(fr);
FileWriter fw = new FileWriter("buf_copy.txt");
BufferedWriter bufw = new BufferedWriter(fw);
String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufw.close();
bufr.close();
}
使用LineNumberReader打印行数
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("IO流_2.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String line = null;
lnr.setLineNumber(100);
while((line=lnr.readLine())!=null){
System.out.println(lnr.getLineNumber()+":"+line);
}
lnr.close();
}
练习:文件深度遍历
public static void main(String[] args){
File dir = new File("e:\\demodir");
listAll(dir , 0);
}
public static void listAll(File dir , int level){
System.out.println(getSpace(level) + dir.getName() );
level++;
File[] files = dir.listFiles();
for(int x = 0 ; x < files.length ; x++){
if(files[x].isDirectory()){
listAll(files[x] , level);
}else{
System.out.println(getSpace(level) + files[x].getName() );
}
}
}
private static String getSpace(int level){
StringBuilder sb = new StringBuilder();
sb.append("|--");
for(int x = 0 ; x < level ; x++){
sb.insert(0 , "| ");
}
return sb.toString();
}
练习:删除一个带内容的目录
public static void main(String[] args){
File dir = new File("e:\\demodir");
removeDir(dir);
}
public static void removeDir(File dir){
File[] files = dir.listFiles();
for(File file : files){
if(file.isDirectory()){
removeDir(file);
}else{
System.out.println(file + ":" + file.delete() );
delete();
}
}
System.out.println(dir + ":" + dir.delete() );
}
练习:程序计数器
练习:获取指定目录下,指定扩展名的文件
public static void main(String[] args) throws IOException {
File dir = new File("e:\\java0331");
FilenameFilter filter = new FilenameFilter(){
@Override
public boolean accept(File dir , String name){
return name.endsWith(".java");
}
};
List<File> list = new ArrayList<File>();
getFiles(dir , filter , list);
#数据写入的目标文件
File destFile = new File(dir , "javalist.txt");
#写入文件
write2File(list , destFile);
}
#根据输入的目录,文件过滤器,寻找符合条件的文件,放入集合中,并返回这个集合
public static void getFiles(File dir , FilenameFilter filter , List<File> list ){
File[] files = dir.listFiles();
for(File file : files){
if( file.isDirectory() ){
getFiles(file , filter , list);
}else{
if(filter.accept(dir , file.getName() ) ){
list.add(file);
}
}
}
}
public static void write2File(List<File> list , File destFile) throws IOException{
BufferedWriter bufw = null;
try{
bufw = new BufferedWriter(new FileWriter(destFile) );
for(File file : list){
bufw.write(file.getAbsolutePath() );
bufw.newLine();
bufw.flush();
}finally{
try {
bufw.close();
} catch (IOException e) {
throw new RuntimeException("关闭失败");
}
}
}
}
练习:文件切割器
public static void main(String[] args) throws Exception {
File file = new File("c:\\aa.mp3");
splitFile(file);
}
private static void splitFile(File file) throws IOException {
FileInputStream fis = new FileInputStream(file);
byte[] buf = new byte[1024 * 1024];
FileOutputStream fos = null
int len = 0;
int count = 1;
Properties prop = new Properties();
File dir = new File("c:\\partfiles");
if(!dir.exists()){
dir.mkdirs();
}
while( (len = fis.read(buf)) != -1){
fos = new FileOutputStream(new File(dir , (count++) + ".part"));
fos.write(buf , 0 , len);
fos.close();
}
prop.setProperty("partcount" , count + "");
prop.setProperty("filename" , file.getName());
fos = new FileOutputStream(new File(dir + count + ".properties"));
prop.store(for , "save file info");
fos.close();
fis.close();
}
练习:碎片文件合并
public static void main(String[] args) throws IOException {
File dir = new File("c:\\partfiles");
mergeFile(dir);
}
public static void mergeFile(File dir) throws IOException {
File[] files = dir.listFiles(new SuffixFilter(".properties"));
if(files.length != 1)
throw new RuntimeException(dir + ",该目录下没有properties扩展名的文件或者不唯一");
File confile = files[0];
Properties prop = new Properties();
FileInputStream fis = new FileInputStream(confile);
prop.load(fis);
String filename = prop.getProperty("filename");
int count = Integer.parseInt(prop.getProperty("partcount"));
File[] partFiles = dir.listFiles(new SuffixFileter(".part"));
if(partFiles.length != (count - 1)){
throw new RuntimeException(" 碎片文件不符合要求,个数不对!应该"+count+"个");
}
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
for(int x = 0 ; x < partFiles.length ; x++){
al.add(new FileInputStream(partFiles[x]));
}
Enumeration<FileInputStream> en = Collections.enumeration(al);
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream(new File(dir , filename));
byte[] buf = new byte[1024];
int len = 0;
while( (len = sis.read(buf)) != -1){
fos.write(buf , 0 , len);
}
fos.close();
sis.close();
}