昨天晚上终于要放下屠刀回头是岸开始做算法作业了,因为最近一直在用扎瓦所以心想着就捡便宜用扎瓦编好了。可是突然发现大部分算法实现题目读取数据和运行结果都要用到文件读写啊!翻了手边的书都没有讲这一块儿,度娘发挥作用之后才明白最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类
最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类。乍一看java中的文件流这个东西蛮麻烦的,毕竟java这个东西形式上就比较麻烦。但是为了写作业还是要忍耐,学一下文件读写又不会屎。
先来贴下代码然后谈一下感想:
import java.util.*;
import java.io.*;
public class mode_problem2_2
{
public static void main(String[] args) throws IOException
{
List list = new ArrayList();
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("input.txt"))));
String str = null;
while((str = br.readLine()) != null)
{
list.add(new Integer(str));
}
Integer[] numberArray = new Integer[list.size()+1];
list.toArray(numberArray); //将读入文件数据存入数组
br.close();
int length = numberArray[0] + 1;
int[] number = new int[length];
int[] count = new int[length];
int check = 0;
int k = 1,t = 1;
count[0] = 1;
number[0] = numberArray[1];
for(int i = 1;i < length;i++)
{
number[i] = -1;
count[i] = 0;
}
for(int i = 1;i < length - 1;i++)
{
check = 0;
for(int j = 0;(j < length - 1) && (number[j] != numberArray[i + 1]);j++)
{
check++;
}
if(check == length - 1)
{
number[k] = numberArray[i + 1];
count[k]++;
k++;
}
else if(check < length - 1)
{
count[check]++;
}
}
int max = 0;
int index = 0;
for(int i = 0;i < length - 1;i++)
{
if(max <= count[i])
{
max = count[i];
index = i;
}
}
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("output.txt"))));
String str1 = "" + number[index];
String str2 = "" + max;
writer.write(str1 + '\r');
writer.write(str2);
writer.flush();
writer.close();
System.out.println(number[index]);
System.out.println(max);
}
}
这个代码用的是BufferedReader和BufferedWriter两个字符流读写文件的类,读文件的时候没有多少问题,比较顺利地能够读入文件中的数据(当然途中建了个数组不断要测试下读对了没有),但是写入文件的时候囧了一下,原因是自己理所当然地以为obj.write(int c):void里面直接填int数据就可以了,但是发现输出结果在output.txt中是乱码……乱码……码……所以之后还是乖乖地将int数据转成string类型才输出成功。
还有一个疑问,这个题目是在递归这一章,我没有用递归算法是什么个情况……
来继续讨论一下Java读写文件的问题。Java读写文件提供了三种流来提供文件读写,第一种是FileOutputStream和FileInputStream,某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter。下面上简单的字节流读写文件Code:
import java.util.*;
import java.io.*;
public class fileoutputstreamtest
{
public static void main(String[] args) throws IOException
{
File file1 = new File("FileIn&OutputStreamTest.txt");
FileOutputStream output = new FileOutputStream("FileIn&OutputStreamTest.txt");
output.write(1);
output.flush();
output.close();
FileInputStream input = new FileInputStream("FileIn&OutputStreamTest.txt");
int a = input.read();
System.out.println(a);
input.close();
}
}
输出结果正确,我当时秀逗了一把还去sourse里面去找创建的文件……这里要注意:File file1 = new File(fileName)是不会真正去创建物理文件的,只是存在一个路径而已,只有当调用了myFile.createNewFile()之后才会真正去创建文件。另外,请无视我全部用*截词了抱歉。
第二种即FileWriter和FileReader,是字符流,因为没有缓冲器所以是一个比较慢的读写文件类,我尽力码了一个没有用BufferedReader来缓冲的代码,下面上代码
import java.util.*;
import java.io.*;
public class FileReader_Writer
{
public static void main(String[] args) throws IOException
{
File file2 = new File("FileRead&Write.txt");
FileWriter fw = new FileWriter("FileRead&Write.txt");
char str1[] = "Test the FileReader & FileWriter".toCharArray();
fw.write(str1);
fw.flush();
fw.close();
FileReader fr = new FileReader("FileRead&Write.txt");
int n = 0;
while((n = fr.read(str1,0,2))!=-1)
{
String str2 = new String(str1,0,n);
System.out.print(str2);
}
}
}
这里要注意的是因为FileReader和FileWriter是字符流,在没有缓冲器的情况下要使用字符串的形式进行读写,毕竟我用String型数据改来改去都报错要不然就出现好多-1和乱码。其实FileReader和BufferedReader是一对好基友,它们一起出现的话读文件的速度会很快,至少比没有缓冲的FileReader快很多。下面上一个带有缓冲器的代码吧反正改起来比较容易:
import java.util.*;
import java.io.*;
public class FileReader_Writer
{
public static void main(String[] args) throws IOException
{
File file2 = new File("FileRead&Write.txt");
FileWriter fw = new FileWriter("FileRead&Write.txt");
String str1 = "Test the FileReader & FileWriter";
fw.write(str1);
fw.flush();
fw.close();
FileReader fr = new FileReader("FileRead&Write.txt");
BufferedReader br = new BufferedReader(fr);
String str2 = br.readLine();
System.out.println(str2);
}
}
是不是看上去可爱了许多~
第三种读写方式即BufferedReader和BufferedWriter,BufferedReader会一次性从物理流中读取8k(默认数值,可以自己进行设置和更改)字节内容到内存,如果外界有请求,就会到这里存取,如果内存里没有才到物理流里再去读。因为对物理流的每次读取,都会伴有IO操作而且IO操作是最耗费时间的。,BufferedReader就是减少了大量IO操作,而为你节省了时间。所以大家尽管用这种文件读写方法吧!下面上代码:
import java.util.*;
import java.io.*;
public class BufferedRead_Write_Test
{
public static void main(String[] args)throws IOException
{
File file3 = new File("BufferedRead_Write_Test.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter("BufferedRead_Write_Test.txt"));
bw.write("Test the BufferedReader & BufferedWriter");
bw.flush();
bw.close();
BufferedReader br = new BufferedReader(new FileReader("BufferedRead_Write_Test.txt"));
String str = br.readLine();
System.out.println(str);
}
}
被发现了,其实这个代码和上面那个是一样样的!其实是两种不同的写法而已,所以我和大家应该对这两个好基友更加理解了~今天搞了这些Java文件的读写,但是对这三种读写方式的性能还是没有做一个评价,之后的某一天我会补上的。先留着这一个坑,也许哪一天我掉进去然后就来补了。各位晚安~