Подскажите, пожалуйста, что не так. Тестировал на файле в UTF-8, все работает, как задано в условии.
Сообщения валидатора:
При запуске программы с параметрами "-u id productName price quantity" должна обновится информация о товаре в файле.
При запуске программы с параметрами "-d id" строка товара с заданным id должна быть удалена из файла.
Поток чтения из файла не был закрыт.
Последнее сообщение и вовсе не понятно, если бы не закрылся поток чтения, переименование не прошло бы. Остается предположить, что валидатор не имеет прав записи в каталог с исходным файлом, только непосредственно в исходный файл, но это как-то странно. Тогда остается только один выход — заливать весь исходный файл в память; но кто сказал, что он туда поместится?package com.javarush.task.task18.task1828;
/*
Прайсы 2
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) throws IOException {
String tail = new String(new char[30]).replace('\0', ' ');
String fileName;
try (Scanner scanner = new Scanner(System.in)) {
fileName = scanner.nextLine();
}
if (args.length == 0) return;
int productId = Integer.parseInt(args[1]);
String product = "";
if (args[0].equals("-u")) {
StringBuilder sb = new StringBuilder();
for (int i = 2; i < args.length - 2; i++) {
sb.append(args[i] + " ");
}
String productName = (sb.toString() + tail).substring(0, 30);
sb = new StringBuilder();
sb.append("\n");
sb.append((productId + tail), 0, 8);
sb.append(productName);
sb.append((args[args.length - 2] + tail), 0, 8);
sb.append((args[args.length - 1] + tail), 0, 4);
product = sb.toString();
}
File file = new File(fileName);
File tmpFile = File.createTempFile("1234", ".tmp", file.getParentFile());
try (FileInputStream inputStream = new FileInputStream(file);
FileOutputStream outputStream = new FileOutputStream(tmpFile);
Scanner scanner = new Scanner(inputStream)) {
int i = 0;
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
int currentId = Integer.parseInt(line.substring(0, 8).trim());
if (currentId != productId) {
outputStream.write(((i == 0 ? "" : "\n") + line).getBytes());
i++;
} else {
if (args[0].equals("-u")) {
outputStream.write(product.getBytes());
}
}
}
}
tmpFile.renameTo(file);
}
}