Списал:
package com.javarush.test.level18.lesson10.bonus02;
/* Прайсы
CrUD для таблицы внутри файла
Считать с консоли имя файла для операций CrUD
Программа запускается со следующим набором параметров:
-c productName price quantity
Значения параметров:
где id - 8 символов
productName - название товара, 30 chars (60 bytes)
price - цена, 8 символов
quantity - количество, 4 символа
-c - добавляет товар с заданными параметрами в конец файла, генерирует id самостоятельно, инкрементируя максимальный id, найденный в файле
В файле данные хранятся в следующей последовательности (без разделяющих пробелов):
id productName price quantity
Данные дополнены пробелами до их длины
Пример:
19846 Шорты пляжные синие 159.00 12
198478 Шорты пляжные черные с рисунко173.00 17
19847983Куртка для сноубордистов, разм10173.991234
*/
/*
#1
Объяснение String.format("%1$-8.8s");
% — начало формата
1$ — порядковый номер аргумента, который вставляется в формат
- — означает выравнивание по левому краю
8 — минимальное количество символов, которые будут выведены
.8 — ограничение на количество символов
s — String
Общий вид инструкции форматирования следующий:
%[argument_index$][flags][width][.precision]conversion
% — специальный символ, обозначающий начало инструкций форматирования.
[argument_index$] — целое десятичное число, указывающее позицию аргумента в списке аргументов. Ссылка на первый аргумент "1$", ссылка на второй аргумент "2$" и т.д. Не является обязательной частью инструкции. Если позиция не задана, то аргументы должны находиться в том же порядке, что и ссылки на них в строке форматирования.
[flags] — специальные символы для форматирования. Например, флаг "+" означает, что числовое значение должно включать знак +, флаг "-" означает выравнивание результата по левому краю, флаг «,» устанавливает разделитель тысяч у целых чисел. Не является обязательной частью инструкции.
[width] — положительное целое десятичное число, которое определяет минимальное количество символов, которые будут выведены. Не является обязательной частью инструкции.
[.precision] — не отрицательное целое десятичное число с точкойперед ним. Обычно используется для ограничения количества символов. Специфика поведения зависит от вида преобразования. Не является обязательной частью инструкции.
conversion — это символ, указывающий, как аргумент должен быть отформатирован. Например d для целых чисел, s для строк, f для чисел с плавающей точкой. Является обязательной частью инструкции.
*/
/*
#2
public String substring();
Создаёт новую последовательность/строку с символами из данной строки начиная с позиции start до конца строки/заканчивая символом с позиции end.
Новая строка содержит символы от start до end - 1, поэтому берём на один символ больше.
String testString = "скотина";
infoTextView.setText(testString.substring(1, 4)); // возвращается кот
*/
import java.io.*;
import java.util.Locale;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
String fileName = rd.readLine();
rd.close();
if ("-c".equals(args[0])){
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String id = reader.readLine();
while (reader.ready()){
id = reader.readLine();
}
reader.close();
id = id.substring(0,id.indexOf(" ")>=0 && id.indexOf(" ")<=7 ?id.indexOf(" "):8);
int idInc = Integer.parseInt(id)+1;
String productName = args[1];
String price = args[2];
String quantity = args[3];
if (productName.length()>30)
productName = productName.substring(0,30);
if (price.length()>8)
price = price.substring(0,8);
if (quantity.length()>4)
quantity = quantity.substring(0,4);
while (productName.length()<30){
productName+=" ";
}
while (price.length()<8){
price+=" ";
}
while (quantity.length()<4){
quantity+=" ";
}
String outputString = String.valueOf(idInc)+productName+price+quantity;
FileOutputStream outputStream = new FileOutputStream(fileName,true);
outputStream.write(outputString.getBytes());
outputStream.flush();
outputStream.close();
}
}
}
Мой вариант:
public class Solution {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
String fileName = scanner.nextLine();
if (args.length > 0) {
if (args[0].equals("-c")) add(args, fileName);
}
scanner.close();
}
private static void add(String[] args, String fileName) throws IOException {
File file = new File(fileName);
String id = (file.exists()) ? (String.format("%1$-8.8s", createId(fileName))) : (String.format("%1$-8.8s", 1)); //1
boolean haveLines = (file.exists());
String productName = createProductName(args);
String price = String.format("%-8.8s", String.format(Locale.US, "%.2f", Double.parseDouble(args[args.length - 2])));
String quantity = String.format("%-4.4s", Integer.parseInt(args[args.length - 1]));
FileWriter fileWriter = new FileWriter(fileName, haveLines);
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
if (!haveLineSeparator(fileName) && reader.readLine() != null) {
fileWriter.write(System.getProperty("line.separator"));
}
fileWriter.write(id + productName + price + quantity);
fileWriter.close();
reader.close();
}
private static boolean haveLineSeparator(String fileName) throws FileNotFoundException {
Scanner scanner = new Scanner(new File(fileName));
if (scanner.hasNextLine()) {
do {
String line = scanner.nextLine();
if (!scanner.hasNextLine()) {
return (line.substring(1).equals(""));
}
}
while (scanner.hasNextLine());
}
scanner.close();
return false;
}
private static String createProductName(String[] args) {
char[] ch = new char[30];
int x = 0;
for (int i = 0; i < args.length - 2; i++) {
char[] chTemp = args[i].toCharArray();
for (char aChTemp : chTemp) {
ch[i] = aChTemp;
x++;
}
if (x == 30) break;
}
if (x < 30) {
for (int i = x; i < 30; i++) {
ch[i] = ' ';
}
}
System.out.println(ch.length);
for (char c : ch) {
System.out.print(c);
}
String output = new String(ch);
System.out.println();
System.out.println("output length: " + output.length());
System.out.println(output);
byte[] bytes = output.getBytes();
System.out.println("bytes length: " + bytes.length);
return output;
// StringBuilder builder = new StringBuilder();
// for (int i = 1; i < args.length - 2; i++) {
// builder.append(args[i]);
// builder.append(" ");
// }
// if (builder.toString().length() < 30) {
// for (int i = 0; i < 30 - builder.toString().length(); i++) {
// builder.append(" ");
// }
// }
// byte[] bytes = builder.toString().getBytes();
// char[] ch = builder.toString().toCharArray();
// System.out.println(bytes.length);
// System.out.println(ch.length);
// byte[] bytes60 = new byte[60];
// System.arraycopy(bytes, 0, bytes60, 0, 60);
// System.out.println(bytes60.length);
// String st = new String(bytes60);
// char[] ch2 = st.toCharArray();
// System.out.println(ch2.length);
// for (byte b : bytes60) System.out.print(b + " ");
// System.out.println(st);
// return st;
}
private static String createId(String fileName) throws FileNotFoundException {
Scanner scanner = new Scanner(new File(fileName));
int maxId = 0;
while (scanner.hasNextLine()) {
int id = Integer.parseInt(scanner.nextLine().substring(0, 8).trim()); //2
if (id > maxId) maxId = id;
}
scanner.close();
return String.valueOf(++maxId);
}
}
Leave A Comment