文件的读取与写入一般有三种,按字节写,按字符写,按行写。对于按字符本人不是很了解,对于按字节与按行写了解比较多。
一,对于按字节写一般是定义字节数组,然后通过read方法把字节流写入到字节数组即可。(其实对于字节的操作,在java网络的编程中用得比较多,如果中间牵涉到数据是按字节传输的时候,对于字节操作是需要很细致的,这个时候如何把字节跟字符串互换,然后进行相识的操作在解析数据,这里面有很多问题,写服务器时解决不少,不少心得在以后再写。今天先完成文件夹的读写):
对于按字节写相对而言还是比较简单的,如:
FileInputStream fs = new FileInputStream(new FIle("test.txt"))
byte[] result = new byte[1024];//长度具体情况具体定义了。很有学问
fs.read(result);这样就可以把所有的内容读入到字节数组result中了。
如果是字符的话,相信也是类似的方法~
二,对于按行读取,今天我需要把一个文件里每六行存取成另一个文件的一行,直到所有的数据读取完。(具体我的应用还有把新生成的文件每一行存储到数据库中去,都是差不多的功能了,不过之后我还需要把字符什么的按一定要求转换为字节,并封装进行转输,这个之间还是有很多问题的--)
至于文件隔行存储,方法如下:(我程序中的方法)
/**
*
*从一个文件每六行读取到另一个文件中。
*
**/
public void readFile(String readfile,String writefile){
try{
FileReader fr = new FileReader(readfile);
FileWriter fw = new FileWriter(writefile);
BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw);
int i = 0;//记录行数的标识。
StringBuffer sb = new StringBuffer();
String temp = br.readLine();
//当读取六行,则通过bw写到写文件中。
while(temp != null){
i += 1;
sb.append(temp);
if(i == 6){//如果到六行,则把拼接的一行写到文件中。
bw.write(new String(sb));
bw.newLine();//换行符
bw.flush();//需要急时涮新流的缓冲区,不然写文件时,当缓冲区满就再也写不进去了
i = 0;
sb = new StringBuffer();
}
temp = br.readLine();
}
//如果最后不到六行,且写到末尾,则把所有余下的写到文件中。
if(sb.length() > 0){
bw.write(new String(sb));
bw.newLine();
bw.flush();
bw.close();//关闭方法在涮新以后,
}
br.close();
System.out.println("转写文件完成");
}catch(Exception e){
e.printStackTrace();
}
}
在方法实现的整个过程中并没有什么大的问题,但出现了当写入文件达到16KB时就再也写不进去了,当时被这问题给难住了,在网上查找答案时还有人说写到64KB时不能再写了,我想应该是一样的问题,当有人提出这个问题时,很多人嘲笑,说什么不可能,我还有写几G的文件,其实笑别人的人还是没帮助人解决这个问题,还好有高手提出了是否流没有flush,当我在看到这句回复时,顿时感觉高手就是高手。相信这是经验的原因吧,
所以程序这句很重要:bw.flush();//需要急时涮新流的缓冲区,不然写文件时,当缓冲区满就再也写不进去了