Протестировано и работает
public static void replaceSelected(String replaceWith, String type) {
try {
// input the file content to the StringBuffer "input"
BufferedReader file = new BufferedReader(new FileReader("notes.txt"));
String line;
StringBuffer inputBuffer = new StringBuffer();
while ((line = file.readLine()) != null) {
inputBuffer.append(line);
inputBuffer.append('\n');
}
String inputStr = inputBuffer.toString();
file.close();
System.out.println(inputStr); // check that it's inputted right
// this if structure determines whether or not to replace "0" or "1"
if (Integer.parseInt(type) == 0) {
inputStr = inputStr.replace(replaceWith + "1", replaceWith + "0");
}
else if (Integer.parseInt(type) == 1) {
inputStr = inputStr.replace(replaceWith + "0", replaceWith + "1");
}
// check if the new input is right
System.out.println("----------------------------------\n" + inputStr);
// write the new String with the replaced line OVER the same file
FileOutputStream fileOut = new FileOutputStream("notes.txt");
fileOut.write(inputStr.getBytes());
fileOut.close();
} catch (Exception e) {
System.out.println("Problem reading file.");
}
}
public static void main(String[] args) {
replaceSelected("Do the dishes", "1");
}
Содержимое исходного текстового файла:
Сделайте блюда0 Подайте собаке0 Очистите мою комнату1
blockquote >Выход:
Сделайте посуду0 Подайте собаке0 Очистите мою комнату1 ------------------------- --------- Сделайте блюда1 Подайте собаке0 Очистите мою комнату1
blockquote>Содержимое нового текстового файла:
Сделайте блюда1 Подайте собаке0 Очистил мою комнату1
blockquote>
И как примечание, если текстовый файл был:
Делать блюда1 Подавать собаку0 Очистил мою комнату1
blockquote>, и вы использовали метод
replaceSelected("Do the dishes", "1");
, он просто не изменит файл.
как заменить строки :) как я делаю сначала arg будет filename второй целевой строкой третьей строкой, которую нужно заменить вместо targe
public class ReplaceString{
public static void main(String[] args)throws Exception {
if(args.length<3)System.exit(0);
String targetStr = args[1];
String altStr = args[2];
java.io.File file = new java.io.File(args[0]);
java.util.Scanner scanner = new java.util.Scanner(file);
StringBuilder buffer = new StringBuilder();
while(scanner.hasNext()){
buffer.append(scanner.nextLine().replaceAll(targetStr, altStr));
if(scanner.hasNext())buffer.append("\n");
}
scanner.close();
java.io.PrintWriter printer = new java.io.PrintWriter(file);
printer.print(buffer);
printer.close();
}
}
Ну, вам нужно будет получить файл с JFileChooser, а затем прочитать строки файла с помощью сканера и функции hasNext ()
http://docs.oracle.com /javase/7/docs/api/javax/swing/JFileChooser.html
после того, как вы сделаете это, вы можете сохранить строку в переменной и манипулировать содержимым.
Я собирался ответить на этот вопрос. Затем я увидел, что он стал отмеченным как дубликат этого вопроса, после того как я написал код, поэтому я собираюсь опубликовать свое решение здесь.
Помня, что вам нужно переписать текст файл. Сначала я прочитал весь файл и сохранил его в строке. Затем я сохраняю каждую строку как индекс строкового массива, ex line one = массив index 0. Затем я редактирую индекс, соответствующий строке, которую вы хотите отредактировать. Как только это будет сделано, я объединю все строки в массиве в одну строку. Затем я пишу новую строку в файл, который пишет поверх старого содержимого. Не беспокойтесь о потере старого контента, поскольку он был снова написан с помощью редактирования. ниже - код, который я использовал.
public class App {
public static void main(String[] args) {
String file = "file.txt";
String newLineContent = "Hello my name is bob";
int lineToBeEdited = 3;
ChangeLineInFile changeFile = new ChangeLineInFile();
changeFile.changeALineInATextFile(file, newLineContent, lineToBeEdited);
}
}
И класс.
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
public class ChangeLineInFile {
public void changeALineInATextFile(String fileName, String newLine, int lineNumber) {
String content = new String();
String editedContent = new String();
content = readFile(fileName);
editedContent = editLineInContent(content, newLine, lineNumber);
writeToFile(fileName, editedContent);
}
private static int numberOfLinesInFile(String content) {
int numberOfLines = 0;
int index = 0;
int lastIndex = 0;
lastIndex = content.length() - 1;
while (true) {
if (content.charAt(index) == '\n') {
numberOfLines++;
}
if (index == lastIndex) {
numberOfLines = numberOfLines + 1;
break;
}
index++;
}
return numberOfLines;
}
private static String[] turnFileIntoArrayOfStrings(String content, int lines) {
String[] array = new String[lines];
int index = 0;
int tempInt = 0;
int startIndext = 0;
int lastIndex = content.length() - 1;
while (true) {
if (content.charAt(index) == '\n') {
tempInt++;
String temp2 = new String();
for (int i = 0; i < index - startIndext; i++) {
temp2 += content.charAt(startIndext + i);
}
startIndext = index;
array[tempInt - 1] = temp2;
}
if (index == lastIndex) {
tempInt++;
String temp2 = new String();
for (int i = 0; i < index - startIndext + 1; i++) {
temp2 += content.charAt(startIndext + i);
}
array[tempInt - 1] = temp2;
break;
}
index++;
}
return array;
}
private static String editLineInContent(String content, String newLine, int line) {
int lineNumber = 0;
lineNumber = numberOfLinesInFile(content);
String[] lines = new String[lineNumber];
lines = turnFileIntoArrayOfStrings(content, lineNumber);
if (line != 1) {
lines[line - 1] = "\n" + newLine;
} else {
lines[line - 1] = newLine;
}
content = new String();
for (int i = 0; i < lineNumber; i++) {
content += lines[i];
}
return content;
}
private static void writeToFile(String file, String content) {
try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8"))) {
writer.write(content);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static String readFile(String filename) {
String content = null;
File file = new File(filename);
FileReader reader = null;
try {
reader = new FileReader(file);
char[] chars = new char[(int) file.length()];
reader.read(chars);
content = new String(chars);
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return content;
}
}
Если замена имеет разную длину:
Если замена имеет одинаковую длину:
Это лучшее, что вы можете получите, с ограничениями на ваш вопрос. Однако, по крайней мере, этот пример заменяет строку той же длины, поэтому второй способ должен работать.
Также следует учитывать: строки Java - это текст Unicode, а текстовые файлы - это байты с некоторой кодировкой. Если кодировка UTF8, а ваш текст не является латинским (или простой 7-разрядный ASCII), вам нужно проверить длину закодированного байтового массива, а не длину строки Java.
С Java 7 это очень просто и интуитивно понятно.
List<String> fileContent = new ArrayList<>(Files.readAllLines(FILE_PATH, StandardCharsets.UTF_8));
for (int i = 0; i < fileContent.size(); i++) {
if (fileContent.get(i).equals("old line")) {
fileContent.set(i, "new line");
break;
}
}
Files.write(FILE_PATH, fileContent, StandardCharsets.UTF_8);
В основном вы читаете весь файл в List
, редактируете список и, наконец, записываете список обратно в файл.
FILE_PATH
представляет Path
файла.