Примеры, которые вы ищете, повсюду в StackOverflow. Вам просто нужно выбрать конкретную проблему и исследовать ее.
При создании консольного приложения вы должны попытаться сделать его максимально удобным для пользователя, поскольку консоль довольно ограничена практически во всем. При запросе ввода от пользователя разрешите пользователю более одной попытки в случае ошибки входа. Для такого рода вещей обычно используется цикл , в то время как , вот пример:
//Create a Scanner object
Scanner input = new Scanner(System.in);
System.out.println("This application will read the file name you supply and");
System.out.println("average the scores on each file line. It will then write");
System.out.println("the results to another file you also supply the name for:");
System.out.println("Hit the ENTER Key to continue (or q to quit)....");
String in = "";
while (in.equals("")) {
in = input.nextLine();
if (in.equalsIgnoreCase("q")) {
System.out.println("Bye-Bye");
System.exit(0);
}
break;
}
// Prompt the user to enter a file name
String fileName = "";
File file = null;
while (fileName.equals("")) {
System.out.println("Enter a file name (q to quit): ");
fileName = input.nextLine();
if (fileName.equalsIgnoreCase("q")) {
System.out.println("Bye-Bye");
System.exit(0); // Quit Application
}
// If just ENTER key was hit
if (fileName.equals("")) {
System.out.println("Invalid File Name Provided! Try Again.");
continue;
}
file = new File(fileName);
// Does the supplied file exist?
if (!file.exists()) {
// Nope!
System.out.println("Invalid File Name Provided! Can Not Locate File! Try Again.");
fileName = ""; // Make fileName hold Null String ("") to continue loop
}
}
Что касается запроса у пользователя имени файла, приведенный выше код является более дружественным подходом. Сначала это в основном объясняет, что делает приложение, затем позволяет Пользователю выйти из приложения, если он / она желает, и позволяет Пользователю предоставить правильную запись, если будет сделана ошибочная запись или если запись, которая кажется действительной, действительно обнаружены дефекты, например, когда определенный файл не может быть найден.
Эта же концепция должна применяться ко всем аспектам вашего консольного приложения. Суть в том, что вы создали приложение, так что вы знаете, что ожидается, однако этого нельзя сказать о ком-то, кто будет использовать ваше приложение. Они не имеют ни малейшего представления о том, что ожидается.
Что касается поставленной задачи, вы должны использовать код и концепции, которые вы уже изучили, и те, которые вы еще не изучили, проводя исследования и экспериментируя с другими концепциями алгоритмического кода. По ходу дела вы, вероятно, приобретете некоторую степень «мышления из коробки», и эта черта станет естественной с большим количеством кода и концепций, которые вы в конечном итоге изучите.
Запишите методический план атаки для выполнения задачи. Это может сэкономить вам огромное количество горя по ходу вашего кода, например:
- Объяснить заявку;
- Запросить у пользователя имя файла;
- Убедитесь, что указано имя файла;
- Если нет, то запросите имя файла снова;
- Убедитесь, что файл существует;
- Если нет, то запросите имя файла снова;
- Запросить у пользователя имя выходного файла;
- Проверьте, существует ли файл уже;
- Попросить перезаписать, если это так;
- Если не перезаписать, запросите другое имя выходного файла;
- Откройте Reader, чтобы прочитать предоставленное имя файла;
- Открыть Writer для записи результатов в указанное имя файла;
- Прочитать каждую строку файла, используя цикл , в то время как ;
- Разделить каждое чтение в строке на String Array с помощью метода String.split (
"\\s+"
);
- Объявите переменную totalSum как double тип данных;
- Объявите среднюю переменную как double тип данных;
- Итерация по массиву строк с для цикла ;
- Убедитесь, что каждый элемент Array является десятичным значением, используя
Метод String # соответствует (
"-?\\d+(\\.\\d+)"
);
- Преобразовать каждый элемент массива в удвоение и добавить к ** totalSum *;
- После для деления цикла totalSum на количество элементов в
массив для получения среднего, поместите эту сумму в переменную medium ;
- Запись в файл: "Среднее значение для:" + fileLine + "равно:" + среднее значение. Также
вывод на консоль;
- После обработки всего файла закройте Reader и закройте Writer.
- DONE.
Теперь это будет ваше основное руководство по созданию приложения.
При чтении файлов данных с помощью Сканера, я чувствую, что лучше использовать метод Scanner # hasNextLine () в условии цикла , тогда как , а не Scanner # hasNext () метод, поскольку этот метод больше ориентирован на получение токенов, чем на строки файла. Так что, на мой взгляд, это был бы лучший подход:
String outFile = "";
// Write code to get the File Name to write to and place
// it into the the variable outFile ....
File outputFile = new File(outFile); // True file name is acquired from User input
if (outputFile.exists()) {
// Ask User if he/she wants to overwrite if file exists....and so on
}
// 'Try With Resourses' on reader
try (Scanner reader = new Scanner(file)) {
// 'Try With Resourses' on writer
try (PrintWriter writer = new PrintWriter(outputFile)) {
String line = "";
while (reader.hasNextLine()) {
line = reader.nextLine().trim();
// Skip blank lines (if any)
if (line.equals("")) {
continue;
}
// Split the data line into a String Array
String[] data = line.split("\\s+"); // split data on one or more whitespaces
double totalSum = 0.0d; // Hold total of all values in data line
double average = 0.0d; // To hold the calculated avarage for data line
int validCount = 0; // The amount of valid data values on data line (used as divisor)
// Iterate through data Line values String Array
for (int i = 0; i < data.length; i++) {
// Is current array element a string representation of
// a decimal value (signed or unsigned)
if (data[i].matches("-?\\d+(\\.\\d+)")) {
// YES!...add to totalSum
validCount++;
// Convert Array element to double then add to totalSum.
totalSum += Double.parseDouble(data[i]);
}
else {
// NO! Kindly Inform User and don't add to totalSum.
System.out.println("An invalid value (" + data[i] + ") was detected within "
+ "the file line: " + line);
System.out.println("This invalid value was ignored during + "averaging calculations!" + System.lineSeparator());
}
}
// Calculate Data Line Average
average = totalSum / validCount;
// Write the current Data Line and its' determined Average
// to the desired file (delimited with the Pipe (|) character.
writer.append(line + " | Average: " + String.valueOf(average) + System.lineSeparator());
writer.flush();
}
}
System.out.println("DONE! See the results file.");
}
// Catch the fileNotFound exception
catch (FileNotFoundException ex) {
ex.printStackTrace();
}