Списал:
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