sobreescribir - JAVA Escribir en un archivo con desplazamiento específico
modificar archivos txt en java (3)
Tengo que escribir un programa que lea un archivo e inserte algún texto dado por el usuario a través de la ventana de la consola. La ubicación en la que se inserta el texto también debe darse a través de la ventana de la consola.
Debajo está mi código, estoy obteniendo "Índice de cadena fuera de rango" después de ingresar la oración y el desplazamiento.
Introduzca la oración: heey
Introduzca la ubicación: 5
Índice de cadena fuera de rango: 9 <- este es el error,
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());
}
}
}
Esto se debe a que el método de write
interna llamará a getchar
api para obtener caracteres de offset (5) hasta offset + (sentence.length - offset) (9)
Y tu oración tiene solo 4 caracteres de largo (es decir, heey). Por lo tanto, debe tener un cheque en su código, ese desplazamiento siempre debe ser menor que la sentence.length
de la sentence.length
es decir, el número de caracteres que contiene.
La línea
bufferedWriter.write(sentence, offset, len);
significa escribir los caracteres len
de la sentence
comenzando en offset
en la sentence
.
En otras palabras, la offset
es la posición en la oración, no la posición en el archivo de salida.
Si desea insertar texto en un archivo, debe escribir el código para copiar el archivo en un nuevo archivo y agregar el texto en la posición correcta durante la copia.
Además, no deberías estar usando
@SuppressWarnings("resource")
para suprimir la advertencia de falta de cierre, es necesario cerrar el escritor.
Dado es el método para escribir contenido en una posición particular.
Digamos que mi archivo es Test.txt y el contenido es el siguiente
Hello
How are you
Today is Monday
ahora quieres escribir "hola" después de hola. Entonces el desplazamiento para "hola" será "5".
El método es:
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();
}
El resultado será:
Hello hi
How are you
Today is Monday