JAVA写入具有特定偏移量的文件
我必须编写一个程序来读取文件并插入用户通过控制台窗口给出的一些文本。 插入文本的位置也应通过控制台窗口给出。
下面是我的代码,输入句子和偏移后我得到“字符串索引超出范围”。
输入句子:嘿
输入位置:5
字符串索引超出范围:9 < – 这是错误,
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.util.Scanner; import java.io.Writer; class ReadPosition{ public static void main(String args[]) { try{ FileWriter Writer = new FileWriter("in.txt"); @SuppressWarnings("resource") BufferedWriter bufferedWriter = new BufferedWriter(Writer); Scanner input= new Scanner(System.in); System.out.println("Enter The Sentence: "); String sentence = input.nextLine(); System.out.println("Enter location: "); int offset = input.nextInt(); input.close(); byte[] buffer = sentence.getBytes(); int len = buffer.length; bufferedWriter.write(sentence, offset, len); } catch(Exception ex) { System.out.println(ex.getMessage()); } } }
这条线
bufferedWriter.write(sentence, offset, len);
意味着从sentence
中offset
开始的sentence
写出len
字符。
换句话说, offset
是句子中的位置而不是输出文件中的位置。
如果要在文件中插入文本,则需要编写代码以将文件复制到新文件,在复制期间将文本添加到正确的位置。
你不应该使用
@SuppressWarnings("resource")
抑制关闭缺失警告 – 你需要关闭你的作家。
这是因为内部write
方法将调用getchar
api从offset(5)获取字符,直到offset +(sentence.length – offset)(9)
而你的句子长度只有4个字符(即heey)。 因此,您应该检查代码,该偏移量应始终小于sentence.length
即其中的字符数。
给出了在特定位置写入内容的方法。
假设我的文件是Test.txt ,内容如下
Hello How are you Today is Monday
现在你想打招呼后写“嗨”。 因此“hi”的偏移量将为“5”。
方法是:
filename = "test.txt"; offset = 5; byte[] content = ("\t hi").getBytes(); private void insert(String filename, long offset, byte[] content) throws IOException { RandomAccessFile r = new RandomAccessFile(filename, "rw"); RandomAccessFile rtemp = new RandomAccessFile(filename+"Temp", "rw"); long fileSize = r.length(); FileChannel sourceChannel = r.getChannel(); FileChannel targetChannel = rtemp.getChannel(); sourceChannel.transferTo(offset, (fileSize - offset), targetChannel); sourceChannel.truncate(offset); r.seek(offset); r.write(content); long newOffset = r.getFilePointer(); targetChannel.position(0L); sourceChannel.transferFrom(targetChannel, newOffset, (fileSize - offset)); sourceChannel.close(); targetChannel.close(); rtemp.close(); r.close();
}
输出将是:
Hello hi How are you Today is Monday