站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题求教JAVA文件操作

求教JAVA文件操作

摘要: 求教JAVA文件操作


编写一个程序,将一个目录及其子目录下的所有txt类型的文本文件中的内容和并到若干个新文件中,当第一个新产生的文件中存储的内容达到1M bytes时,剩下的内容存储到第二个文件中,依次往下,新产生的文本文件名依次为 1.txt, 2.txt.......


太麻烦,分数太低。怎么成反比了?


写好了,准备给多少分?


能给多少给多少,还请赐教


关注


要多多给分啊,否则,下次不帮忙啦!


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;


public class Files {
String srcdir = "src";
String descdir = "desc";

File srcfile = null;
FileInputStream fis = null;
FileOutputStream fos = null;
int descfilenum = 1;
long size = 0;
final long MaxSize = 1024*1000;//1M

public Files() {
}

public Files(String src, String desc) {
srcdir = src;
descdir = desc;
}

public void go() throws Exception {
srcfile = new File(srcdir);
if ((!srcfile.exists()) || (!srcfile.isDirectory())) {
throw new Exception("/"" + srcdir + "/" dir does not exist!");
}

File descfile = new File(descdir);
if ((!descfile.exists()) || (!srcfile.isDirectory())) {
descfile.mkdir();
}
fos = new FileOutputStream(descdir + "//" + descfilenum + ".txt");
nest(srcdir);
fos.close();
}

public void nest(String dir) throws Exception {
srcfile = new File(dir);
String[] files = srcfile.list();
boolean havesubdir = false;
//处理文件
for (int i=0; isrcfile = new File(dir + "//" + files[i]);
if (srcfile.isDirectory()) {
havesubdir = true;
continue;
} else {
fis = new FileInputStream(srcfile);
System.out.println(srcfile.getPath());
int n;
byte[] buf = new byte[4096];
while ((n = fis.read(buf, 0, buf.length)) != -1) {
write(buf, n);
}
}
}
//没有子目录,返回
if (!havesubdir) {
return;
}
//处理文件夹
for (int i=0; isrcfile = new File(dir + "//" + files[i]);
if (srcfile.isFile()) {
continue;
}
nest(srcfile.getPath());
}

}

public void write(byte[] buffer, int end) throws Exception {
int p = 0;
while (p < end) {
if (size >= MaxSize) {
descfilenum++;
size = 0;
fos.close();
fos = new FileOutputStream(descdir + "//" + descfilenum + ".txt");
}

int len = end - p;
if ((size+len) > MaxSize) {
int m = (int)(MaxSize - size);
fos.write(buffer, p, m);
p += m;
size += m;
} else {
fos.write(buffer, p, end-p);
size += (end - p);
p = end;
}
}
}


public static void main(String[] args) {
try {
Files f = new Files("src", "dest");
f.go();
} catch (Exception e) {
e.printStackTrace();
}
}

}



楼上的搞那么复杂,还要高分。。。。。
看看兄弟我这个
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class TestRead {

/**
* @param args
*/
static int fileNumber=1;
public void fileOp(File file)
{

if(file.isDirectory())
{
File[] files=file.listFiles();
for(int i=0;i{
File tempFile=files[i];
if(tempFile.isFile())
{
if(tempFile.getName().lastIndexOf(".txt")>=0)
{
copyData(tempFile);
System.out.println(fileNumber);
}
}
else
{
fileOp(tempFile);
}
}
}
}

private void copyData(File file)
{
try
{
File tempWriteFile=new File("/temp/"+String.valueOf(fileNumber)+".txt");
BufferedReader br=new BufferedReader(new FileReader(file));
BufferedWriter bw=null;

String tempBr=null;
tempBr=br.readLine();
while(tempBr!=null)
{
if(tempWriteFile.length()>=1024)
{
fileNumber++;
}
tempWriteFile=new File("/temp/"+String.valueOf(fileNumber)+".txt");
bw=new BufferedWriter(new FileWriter(tempWriteFile,true));
bw.write(tempBr + "/r/n");
tempBr=br.readLine();
}
bw.close();
br.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}

public static void main(String[] args)
{
File file=new File("/");
(new TestRead()).fileOp(file);
}
}



第一个程序只要写.txt类型的怎么改啊


更正(之前有点)bug:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class TestRead {

/**
* @param args
*/
private static int fileNumber=1;
private File tempWriteFile=null;
private BufferedWriter bw=null;
public void fileOp(File file,String temp)
{

if(file.isDirectory()&&!file.equals(new File(temp)))
{
File[] files=file.listFiles();
if(files!=null)
{
for(int i=0;i{
File tempFile=files[i];
if(tempFile.isFile())
{
if(tempFile.getName().lastIndexOf(".txt")>=0)
{
copyData(tempFile,temp);
System.out.println(tempFile.getAbsolutePath());
}
}
else
{
fileOp(tempFile,temp);
}
}
}
}
}

private void copyData(File file,String temp)
{
try
{
this.tempWriteFile=new File(temp+"/"+String.valueOf(fileNumber)+".txt");
BufferedReader br=new BufferedReader(new FileReader(file));
this.bw=new BufferedWriter(new FileWriter(tempWriteFile,true));

String tempBr=null;
tempBr=br.readLine();
while(tempBr!=null)
{
if(this.tempWriteFile.length()+tempBr.length()>=1024*1024)
{
this.bw.close();
fileNumber++;
this.tempWriteFile=new File(temp+"/"+String.valueOf(fileNumber)+".txt");
this.bw=new BufferedWriter(new FileWriter(tempWriteFile,true));
}
bw.write(tempBr + "/r/n");
tempBr=br.readLine();
}
bw.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}

public static void main(String[] args)
{
File file=new File("c:/");
(new TestRead()).fileOp(file,"e:/test/temp");
System.out.print("Finished!");
}
}




同时建议搂主,如果要想提高io访问效率的话,还是用
java.io.BufferedReader;
java.io.BufferedWriter;
比较好


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class TestRead {

/**
* @param args
*/
private static int fileNumber=1;
private File tempWriteFile=null;
private BufferedWriter bw=null;
public void fileOp(File file,String temp)
{

if(file.isDirectory()&&!file.equals(new File(temp)))
{
File[] files=file.listFiles();
if(files!=null)
{
for(int i=0;i{
File tempFile=files[i];
if(tempFile.isFile())
{
if(tempFile.getName().lastIndexOf(".txt")>=0)
{
copyData(tempFile,temp);
System.out.println(tempFile.getAbsolutePath());
}
}
else
{
fileOp(tempFile,temp);
}
}
}
}
}

private void copyData(File file,String temp)
{
try
{
this.tempWriteFile=new File(temp+"/"+String.valueOf(fileNumber)+".txt");
BufferedReader br=new BufferedReader(new FileReader(file));
this.bw=new BufferedWriter(new FileWriter(tempWriteFile,true));

String tempBr=null;
tempBr=br.readLine();
while(tempBr!=null)
{
if(this.tempWriteFile.length()+tempBr.length()>=1024*1024)
{
this.bw.close();
fileNumber++;
this.tempWriteFile=new File(temp+"/"+String.valueOf(fileNumber)+".txt");
this.bw=new BufferedWriter(new FileWriter(tempWriteFile,true));
}
bw.write(tempBr + "/r/n");
tempBr=br.readLine();
}
bw.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}

public static void main(String[] args)
{
String savedDoc="e:/temp";
String srcDoc="e:/";
File file=new File(srcDoc);
File savedDocFile=new File(savedDoc);
if(savedDocFile.exists())
{
File[] fileTemp;
fileTemp=savedDocFile.listFiles();
for(int i=0;i {
fileTemp[i].delete();
}
}
else
{
savedDocFile.mkdir();
}
(new TestRead()).fileOp(file,savedDoc);
System.out.print("Finished!");
}
}



张孝祥的那本书中有


就是支持


gzpoplar(poplar) 的程序比较正确,但缺少过滤txt文件的功能
hdhmail2000(禅剑飞雪)的程序中,不能正确分割文件大小,我用每个文件1k来测试,结果有的文件竟然是2.2k,不过我也没看出程序中错误的地方
下面是本人对gzpoplar(poplar) 程序的改进:
package csdn.example;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;


public class File_csdn1 {
String srcdir = "src";
String descdir = "desc";

File srcfile = null;
FileInputStream fis = null;
FileOutputStream fos = null;
int descfilenum = 1;
long size = 0;
final long MaxSize = 1024*1024;//1M

public File_csdn1() {
}

public File_csdn1(String src, String desc) {
srcdir = src;
descdir = desc;
}

public void go() throws Exception {
srcfile = new File(srcdir);
if ((!srcfile.exists()) || (!srcfile.isDirectory())) {
throw new Exception("/"" + srcdir + "/" dir does not exist!");
}

File descfile = new File(descdir);
if ((!descfile.exists()) || (!srcfile.isDirectory())) {
descfile.mkdir();
}
fos = new FileOutputStream(descdir + "/" + descfilenum + ".txt");
nest(srcdir);
fos.close();
}

public void nest(String dir) throws Exception {
srcfile = new File(dir);
String[] files = srcfile.list();

boolean havesubdir = false;
//处理文件
for (int i=0; isrcfile = new File(dir + "/" + files[i]);
if (srcfile.isDirectory()) {
havesubdir = true;
continue;
}
else {
if(srcfile.getName().lastIndexOf(".txt")>=0){//过滤txt文件
fis = new FileInputStream(srcfile);
//System.out.println(srcfile.getPath());
int n;
byte[] buf = new byte[4096];
while ((n = fis.read(buf, 0, buf.length)) != -1) {
write(buf, n);
}
}
else
continue;
}
}
//没有子目录,返回
if (!havesubdir) {
return;
}
//处理文件夹
for (int i=0; isrcfile = new File(dir + "/" + files[i]);
if (srcfile.isFile()) {
continue;
}
nest(srcfile.getPath());
}
}

public void write(byte[] buffer, int end) throws Exception {
int p = 0;
while (p < end) {
if (size >= MaxSize) {
descfilenum++;
size = 0;
fos.close();
fos = new FileOutputStream(descdir + "/" + descfilenum + ".txt");
}
int len = end - p;
if ((size+len) > MaxSize) {
int m = (int)(MaxSize - size);
fos.write(buffer, p, m);
p += m;
size += m;
}
else {
fos.write(buffer, p, end-p);
size += (end - p);
p = end;
}
}
}


public static void main(String[] args) {
try {
File_csdn1 f = new File_csdn1("/root/temp", "/root/temp1");
f.go();
} catch (Exception e) {
e.printStackTrace();
}
}

}

注意:descdir不应该是srcdir的子目录,否则容易发生混乱,程序会出错


当然了,我的是以行来确定大小的,不可能刚好那么多的大小
想想如果用txt文件的,总不能一边半行吧?


当然了,我的是以行来确定大小的,不可能刚好那么多的大小
想想如果用txt文件的,总不能一边半行吧?
--------------------------------------------
呵呵,有道理,不过,我是以每个文件1k的大小来存储的,结果文件却为2.2k,2.3k


第一次来这里发贴,很高兴大家帮忙解决了问题。
多谢啦!
还是字节流的读取比较准确,gzpoplar(poplar)的方法挺好,hbcui1984的补充很及时,谢谢啦!


↑返回目录
前一篇: java连接数据库的问题。问题解决了一定揭贴。
后一篇: 请教一个简单的小问题