我想读取一个文本文件并将其内容存储在一个数组中,其中数组的每个元素最多可容纳500个字符(即一次读取500个字符,直到没有更多字符可读)。
我在执行此操作时遇到了麻烦,因为我无法理解在Java中执行IO的所有不同方法之间的差异,而我无法找到执行我想要的任务的任何方法。
我是否需要使用数组列表,因为我最初不知道数组中有多少项?
答案 0 :(得分:1)
很难避免使用ArrayList或类似的东西。如果您知道该文件是ASCII,则可以执行
int partSize = 500;
File f = new File("file.txt");
String[] parts = new String[(f.length() + partSize - 1) / partSize];
但是如果文件使用像UTF-8这样的可变宽度编码,那么这将不起作用。这段代码可以完成这项工作。
static String[] readFileInParts(String fname) throws IOException {
int partSize = 500;
FileReader fr = new FileReader(fname);
List<String> parts = new ArrayList<String>();
char[] buf = new char[partSize];
int pos = 0;
for (;;) {
int nRead = fr.read(buf, pos, partSize - pos);
if (nRead == -1) {
if (pos > 0)
parts.add(new String(buf, 0, pos));
break;
}
pos += nRead;
if (pos == partSize) {
parts.add(new String(buf));
pos = 0;
}
}
return parts.toArray(new String[parts.size()]);
}
请注意FileReader
使用平台默认编码。要指定特定编码,请将其替换为new InputStreamReader(new FileInputStream(fname), charSet)
。它有点难看,但这是最好的方法。
答案 1 :(得分:0)
ArrayList肯定会更合适,因为你不知道你将拥有多少元素。
有很多种方法可以读取文件,但是由于您希望保留字符数以获得500个,您可以使用Reader对象的read()
方法来读取字符按性格。一旦你收集了你需要的500个字符(我想在一个字符串中),只需将它添加到你的ArrayList(当然是循环中的所有字符)。
Reader对象需要使用扩展Reader的对象进行初始化,就像InputStreamReader一样(这个将InputStream的实现作为参数,使用文件作为输入时使用FileInputStream)。
答案 2 :(得分:0)
不确定这是否有效,但您可能想尝试这样的事情(警告:未经测试的代码):
private void doStuff() {
ArrayList<String> stringList = new ArrayList<String>();
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader("file.txt"));
String str;
int count = 0;
while ((str = in.readLine()) != null) {
String temp = "";
for (int i = 0; i <= str.length(); i++) {
temp += str.charAt(i);
count++;
if(count>500) {
stringList.add(temp);
temp = "";
count = 0;
}
}
if(count>500) {
stringList.add(temp);
temp = "";
count = 0;
}
}
} catch (IOException e) {
// handle
} finally {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}