我必须编写一个程序来读取文件并插入用户通过控制台窗口给出的一些文本。插入文本的位置也应通过控制台窗口给出。
下面是我的代码,在输入句子和偏移后,我得到“字符串索引超出范围”。
输入句子: heey
输入位置: 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());
}
}
}
答案 0 :(得分:1)
该行
bufferedWriter.write(sentence, offset, len);
表示从len
sentence
开始offset
写出sentence
个字符。
换句话说,offset
是句子不在输出文件中的位置。
如果要在文件中插入文本,则需要编写代码以将文件复制到新文件,在复制期间将文本添加到正确的位置。
另外你不应该使用
@SuppressWarnings("resource")
要取消关闭缺失警告 - 您需要关闭作家。
答案 1 :(得分:0)
那是因为内部write
方法将调用getchar
api从offset(5)获取字符,直到offset +(sentence.length - offset)(9)
你的句子只有4个字符(即heey)。因此,您应该检查代码,该偏移量应始终小于sentence.length
,即其中的字符数。
答案 2 :(得分:0)
给出了在特定位置写内容的方法。
假设我的文件是 Test.txt ,内容如下
Hello
How are you
Today is Monday
现在你想在你好之后写下“hi”。因此,“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