所以我想给.txt文件写十个数字,当我运行它时,我想把自己放在最后一个数字上,这样我就可以手动更改最后一个数字了。这是我到目前为止所得到的:
public static void main(String[] args) throws IOException
{
int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
File file = new File("text.txt");
if (!file.exists())
{
file.createNewFile();
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(" " + Arrays.toString(a));
bw.close();
System.out.println("Done!");
这基本上是以int数组的形式将十位数写入.txt文件。现在,我将如何允许自己更改最后一位数,在这种情况下:10通过用户输入?
答案 0 :(得分:4)
第1步
从文件中将所有内容读入内存。
StringBuilder contents = new StringBuilder();
File file = new File("test.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
contents.append(line);
}
第2步
调整内存中的数据。
// Let's assume each day is split by a space
String[] numbers = contents.toString().split(" ");
numbers[numbers.length - 1] = String.valueOf(Integer.parseInt(numbers[numbers.length - 1]) - 1);
第3步
把所有东西都写回来。
FileOutputStream fos = new FileOutputStream(file);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fos));
for(String number : numbers)
{
out.write(number);
}
out.close();
答案 1 :(得分:2)
克里斯的回答可能是最直接的。但另一种可能的方法是使用RandomAccessFile
。如果您维护的文件非常大,这将是一个不错的选择。
public class RAFExample {
public static void main(String[] args){
int[] values = {1,2,3,4,5,6,123};
File file = new File("text.txt");
System.out.println("File located at: " + file.getAbsolutePath());
RAFExample re = new RAFExample();
try {
re.saveArray(file,values);
System.out.println("Current File Contents: " + re.getFileContents(file));
re.updateFile(file,9);
System.out.println("Current File Contents: " + re.getFileContents(file));
re.updateFile(file,2342352);
System.out.println("Current File Contents: " + re.getFileContents(file));
re.updateFile(file,-1);
System.out.println("Current File Contents: " + re.getFileContents(file));
} catch (IOException e) {
e.printStackTrace();
}
}
public void saveArray(File file, int[] values) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter(file.getAbsoluteFile()));
try{
String toFile = Arrays.toString(values);
System.out.println("Writing the following string to the file: " + toFile);
bw.write(toFile);
}finally{
bw.close();
}
}
public void updateFile(File f, int value) throws IOException{
RandomAccessFile raf = new RandomAccessFile(f,"rw");
// Find the last space in the file
final byte space = ' ';
try{
String s;
if(raf.length() == 0){
s = "[" + value + "]";
raf.write(s.getBytes());
}else{
raf.seek(raf.length());
int b = raf.read();
while(raf.getFilePointer() - 2 > 0 && b != space){
raf.seek(raf.getFilePointer() - 2);
b = raf.read();
}
// now we are at the position to write the new value
if(raf.getFilePointer() == 0){
// We got to the beginning of the file,
// which means there is 1 or 0 values
s = "[" + value + "]";
}else{
s = String.valueOf(value);
}
raf.write(s.getBytes());
raf.write(']'); // This follows the format of Arrays.toString(array)
raf.setLength(raf.getFilePointer());
}
}finally{
raf.close();
}
}
private String getFileContents(File f){
BufferedReader reader = null;
StringBuilder sb = new StringBuilder(100);
try{
reader = new BufferedReader(new FileReader(f));
while(reader.ready()){
sb.append(reader.readLine());
}
}catch(IOException e){
e.printStackTrace(System.err);
}finally{
if(reader != null){
try{reader.close();}catch (IOException ignore){}
}
}
return sb.toString();
}
}
答案 2 :(得分:1)
你有两个不同的问题。首先是如何获得“输入”。您希望用户添加的数据。要做到这一点,最简单的方法是在参数中使用命令行参数,并将其用作最终字符。
所以在执行bw.write之后但在bw.close之前执行
for (String str: args) {
bw.write(str);
}
如果您需要真正等待输入但保持在命令行(而不是通过GUI),那么您需要从System.in()
读取第二个问题是如何实际写入文件中的正确点。这可以通过阅读整个现有文件,然后回写追加或者可以通过打开文件,寻找正确的点,然后进行更改来完成。 Java中有一个随机访问文件系统可以帮助解决这个问题:
http://docs.oracle.com/javase/tutorial/essential/io/rafs.html