JAVA写入具有特定偏移量的文件

时间:2015-03-07 09:52:27

标签: java io output fileinputstream

我必须编写一个程序来读取文件并插入用户通过控制台窗口给出的一些文本。插入文本的位置也应通过控制台窗口给出。

下面是我的代码,在输入句子和偏移后,我得到“字符串索引超出范围”。

输入句子: 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());      
                } 


    }

}

3 个答案:

答案 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