黑马程序员技术交流社区
标题:
一个IO流程序的问题
[打印本页]
作者:
李贺晓
时间:
2013-1-16 15:55
标题:
一个IO流程序的问题
本帖最后由 李贺晓 于 2013-1-17 14:18 编辑
这道程序实现的目标是“将一个目录下的所有txt类型的文本文件中的内容合并到若干个新的文本文件中,当第一个新产生的文件中存储的内容大道1M时,剩下的内容存储到第二个新的文件中,依次往下,新产生的文本文件的名字依次是1.txt,2.txt......”
下面是我编写的代码:
import java.io.*;
import java.util.*;
public class StreamTest {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
getFile("e:\\lihexiao");
}
public static void getFile(String str) throws Exception
{
//定义一个Vector集合,只能往里添加InputStream类型的对象
Vector<InputStream> v=new Vector<InputStream>();
int i=1;
File f=new File(str);
//定义一个缓存数组,大小为1024字节
byte[] by=new byte[1024];
FileInputStream fis=null;
FileOutputStream fos=null;
//获取此文件目录下所有的txt文件
String[] fileNames=f.list(new FilenameFilter()
{
public boolean accept(File f,String name)
{
if(name.endsWith(".txt"))
return true;
else
return false;
}
});
for(String fileName:fileNames)
{
//建立读取流对象
fis=new FileInputStream(str+"\\"+fileName);
//将所有的读取流对象添加到Vector集合中
v.add(fis);
}
Enumeration<InputStream> e=v.elements();
//定义序列流,将多个流对象合并成一个流
SequenceInputStream se=new SequenceInputStream(e);
int len=0;
while((len=se.read(by))!=-1)
{
//将序列流中的数据读取到多个文件中,每个文件大小为1024字节
fos=new FileOutputStream(str+"\\"+(i++)+".txt");
fos.write(by,0,len);
}
fis.close();
fos.close();
}
}
最后生成的几个文件为什么不正确呢,按照我的程序得到的结果是,如果lihexiao目录下的txt文件大于1M的话会自动分隔,如果小于1M的话会自动把这个不到1M的文件内容存入到一个in的文件中,我的程序的错误在哪里?求指点啊
作者:
李贺晓
时间:
2013-1-17 14:19
设置一个临时文件就可以了,不知道还有没有其他的方式,感觉临时文件比较麻烦
作者:
惠晖
时间:
2013-1-17 21:43
最后文件生成是什么样子的
作者:
惠晖
时间:
2013-1-17 23:37
本帖最后由 惠晖 于 2013-1-17 23:40 编辑
头大了
作者:
惠晖
时间:
2013-1-18 01:27
兄弟这个题目3人搞了4 5个小时楞是没搞出来啊 高手在那里
作者:
惠晖
时间:
2013-1-18 01:30
李贺晓 发表于 2013-1-17 14:19
设置一个临时文件就可以了,不知道还有没有其他的方式,感觉临时文件比较麻烦 ...
最后捉摸了半天,这个方法是最简单的了 苍天啊 来点高手来解答问题吧
作者:
舒远
时间:
2013-1-18 10:28
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.util.Enumeration;
import java.util.Vector;
public class StreamTest {
public static void main(String[] args) throws Exception {
Vector<InputStream> vector = new Vector<>();
File dir = new File("E:\\nihao");
File[] files = dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
});
for (File file : files) {
vector.add(new FileInputStream(file));
}
Enumeration<InputStream> enumeration = vector.elements();
SequenceInputStream stream = new SequenceInputStream(enumeration);
FileOutputStream fos = null;
int i = 1;
int len = -1;
int total = 0;
byte[] buf = new byte[20];
while ((len = stream.read(buf, total, buf.length - total)) != -1) {
total += len;
if (total == buf.length) {
fos = new FileOutputStream("E:\\nihao\\" + i++ + ".txt");
fos.write(buf, 0, total);
total = 0;
}
}
// 读完的最后一次可能不足buf.length个字节。需要单独处理
fos = new FileOutputStream("E:\\nihao\\" + i + ".txt");
fos.write(buf, 0, total);
}
}
复制代码
作者:
朱玉玺
时间:
2013-1-18 11:20
import java.io.*;
import java.util.*;
public class StreamTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception
{
getFile("W:\\javawork\\bxd\\day25");
}
public static void getFile(String str) throws Exception
{
Vector<InputStream> v = new Vector<InputStream>();
File f = new File(str);
FileInputStream fis = null;
FileOutputStream fos = null;
// 获取此文件目录下所有的txt文件
String[] fileNames = f.list(new FilenameFilter()
{
public boolean accept(File f, String name)
{
return name.endsWith(".java");
}
});
for (String fileName : fileNames)
{
fis = new FileInputStream(str + "\\" + fileName);
v.add(fis);
}
Enumeration<InputStream> e = v.elements();
SequenceInputStream se = new SequenceInputStream(e);
byte[] by = new byte[450];
int len = 0;
//以上部分都一样,下边的与楼主不同不同。
int num = 0;//记录读取的所有文件的总长
int num1 = 0;//记录当前操作文件已写入的字符长度。
int pos = 0;//当前操作文件需要写入的字符长度。
int i = 1;//文件标题自增计数器
fos=new FileOutputStream((str+"\\"+(i++)+".txt"));
while ((len = se.read(by)) != -1)
{
System.out.println("len="+len);
num=num+len;
while(len>0)
{
pos = by.length-num1;
if(len<pos)
{
fos.write(by,0,len); //写入后,写入计数器增加,len清空
num1+=len;
len=0;
}
else//len>=pos的情况。
{
fos.write(by,0,pos);//写入后,写入计数器归零,len减去写入的长度。
num1 = 0;
len -= pos;
System.out.println("pos="+pos+" num1="+num1+" i="+i);
fos.close();
fos=new FileOutputStream((str+"\\"+(i++)+".txt"));
}
}
}
fis.close();
fos.close();
}
}
复制代码
作者:
惠晖
时间:
2013-1-18 11:56
{:soso_e113:}
作者:
朱玉玺
时间:
2013-1-18 15:06
舒远 发表于 2013-1-18 10:28
刚有重新思考了下这个代码:发现了一下问题
1.在往Vector中添加过程中,应该增加个判断过程,应该可能一个文件夹的名字也已“.txt”结尾的,如果有这样的文件夹,下边的操作会出现空指针异常。
2.在while循环中,新建一个FileOutputStream后,没有将之前的资源关闭,整个代码结束时,序列流也应该关闭资源。
3.whil循环外边的新建写入流过程中,前边应该加个if(pos!=0)判断一下,否则如果while结束后,可能会创建一个空文件。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2