МОТИВАЦИЯ
В видео на YouTube Венката Субраманиама он рассказывает о том, как не использовать AutoCloseable, а попробовать использовать функцию типа «использовать». Потому что можно забыть реализовать блок try в классе, который реализует AutoCloseable.
ВОПРОС
Я реализовал эту стратегию на многих случаях, однако есть один случай, который я не смог выполнить.
У меня есть много программ записи файлов в зависимости от их типов файлов. Все они используют один и тот же интерфейс. Таким образом, можно анализировать основной код макроса и обрабатывать действия с файлами для всех типов файлов. (в блоге я сократил имена функций до «addText», а типы файлов — до двух: «FileWeb» и «FileTable».)
И, пользователи каждый раз решают, какой тип файлов им нужен.
Последовательный способ действий описан ниже. (Там в функции "constructFileAccordingToMacroCode" дважды обрабатывается "построчный разбор макрокода").
{//SEQUENTIAL
boolean produceFileTable = true;
if (produceFileTable) {
FileTable.use(dir, fileLabel, fileTable -> {
constructFileAccordingToMacroCode(macroCode, fileTable);
});
}
boolean produceFileWeb = true;
if (produceFileWeb) {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileWeb);
});
}
}
Параллельный способ выполнения описан ниже. (Там функция «constructFileAccordingToMacroCode» запускается один раз, следовательно, «построчный разбор макрокода» обрабатывается один раз).
{//KIND OF PARALLEL
boolean produceFileTable = true;//?
boolean produceFileWeb = true;//?
FileTable.use(dir, fileLabel, fileTable -> {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileTable, fileWeb);
});
});
}
Однако, если я реализую это, я потеряю возможность не создавать нежелательные типы файлов.
Есть ли более разумный способ что-то делаете?
СООТВЕТСТВУЮЩИЕ ПРИМЕРЫ ФАЙЛОВ КЛАССОВ
Главная
public class Main {
public static void main(String... s) {
var macroCode = """
LINE1: ADD_FILE_TYPE
LINE2: ADD_SYSTEM_MILLIS
""";
var dir = Path.of("c:\\fileFirectory");
var fileLabel = "fileLabel";
{//SEQUENTIAL
boolean produceFileTable = true;
if (produceFileTable) {
FileTable.use(dir, fileLabel, fileTable -> {
constructFileAccordingToMacroCode(macroCode, fileTable);
});
}
boolean produceFileWeb = true;
if (produceFileWeb) {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileWeb);
});
}
}
{//KIND OF PARALLEL
boolean produceFileTable = true;//?
boolean produceFileWeb = true;//?
FileTable.use(dir, fileLabel, fileTable -> {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileTable, fileWeb);
});
});
}
}
private static boolean constructFileAccordingToMacroCode(String macroCode, FileInterface... files) {
boolean result;
for (var file : files) {
//parse macroCode line by line in a for loop {
/*FOREXAMPLE LINE1: from macroCode*/
result = file.addText("I am a %s type file.".formatted(file.getClass().getSimpleName()));
if (!result) {
return false;
}
/*FOREXAMPLE LINE2: from macroCode*/
file.addText(", and time is %L".formatted(System.currentTimeMillis()));
if (!result) {
return false;
}
//}
}
return true;
}
}
TGS_RunnableType1
public interface TGS_RunnableType1 {
public void run(A result);
}
Файловый интерфейс
public interface FileInterface /*implements AutoCloseable*/{
public boolean addText(CharSequence text);
}
Таблица файлов
public class FileTable implements FileInterface {
private FileTable(Path dir) {
this.dir = dir;
}
final public Path dir;
@Override
public boolean addText(CharSequence text) {
//TODO add text code
return true;
}
public static void use(Path dir, String fileLabel, TGS_RunnableType1 fileTable) {
var instance = new FileTable(dir);
try {
instance.open();
fileTable.run(instance);
instance.close();
} catch (Exception e) {//SILENTLY CLOSE
try {
instance.close();
} catch (Exception e2) {
if (e2 instanceof InterruptedException) {//let InterruptedException propagate
throw e2;
}
}
if (e instanceof InterruptedException) {//let InterruptedException propagate
throw e;
}
}
}
private void open() {
//open according to dir & fileLabel & type
}
private void close() {
//close according to dir & fileLabel & type
}
}
FileWeb
public class FileWeb implements FileInterface {
private FileWeb(Path dir) {
this.dir = dir;
}
final public Path dir;
@Override
public boolean addText(CharSequence text) {
//TODO add text code
return true;
}
public static void use(Path dir, String fileLabel, TGS_RunnableType1 fileWeb) {
var instance = new FileWeb(dir);
try {
instance.open();
fileWeb.run(instance);
instance.close();
} catch (Exception e) {//SILENTLY CLOSE
try {
instance.close();
} catch (Exception e2) {
if (e2 instanceof InterruptedException) {//let InterruptedException propagate
throw e2;
}
}
if (e instanceof InterruptedException) {//let InterruptedException propagate
throw e;
}
}
}
private void open() {
//open according to dir & fileLabel & type
}
private void close() {
//close according to dir & fileLabel & type
}
------- ------------------ ОБНОВЛЕНИЕ ----------------
ПАРАЛЛЕЛЬНАЯ ВЕРСИЯ buildFileAccordingToMacroCode
//WILL POSSIBLY CREATE OUT OF MEMORY ERROR
private static boolean constructFileAccordingToMacroCode(String macroCode, FileInterface... files) {
//parse macroCode line by line in a for loop {
var errorPresent = IntStream.range(0, files.length).parallel()
.mapToObj(i -> {
var file = files;
/*FOREXAMPLE LINE1: from macroCode*/
var result = file.addText("I am a %s type file.".formatted(file.getClass().getSimpleName()));
if (!result) {
return false;
}
/*FOREXAMPLE LINE2: from macroCode*/
file.addText(", and time is %L".formatted(System.currentTimeMillis()));
if (!result) {
return false;
}
return true;
})
.filter(result -> false)
.findAny().isPresent();
if (errorPresent) {
return false;
}
//}
return true;
}
Подробнее здесь: https://stackoverflow.com/questions/778 ... e-files-in
Как запускать параллельные задачи в цикле for для работы с файлами AutoCloseable в Java ⇐ JAVA
Программисты JAVA общаются здесь
1737091147
Anonymous
[b]МОТИВАЦИЯ[/b][b]
В видео на YouTube Венката Субраманиама он рассказывает о том, как не использовать AutoCloseable, а попробовать использовать функцию типа «использовать». Потому что можно забыть реализовать блок try в классе, который реализует AutoCloseable.
ВОПРОС[/b][b]
Я реализовал эту стратегию на многих случаях, однако есть один случай, который я не смог выполнить.
У меня есть много программ записи файлов в зависимости от их типов файлов. Все они используют один и тот же интерфейс. Таким образом, можно анализировать основной код макроса и обрабатывать действия с файлами для всех типов файлов. (в блоге я сократил имена функций до «addText», а типы файлов — до двух: «FileWeb» и «FileTable».)
И, пользователи каждый раз решают, какой тип файлов им нужен.
Последовательный способ действий описан ниже. (Там в функции "constructFileAccordingToMacroCode" дважды обрабатывается "построчный разбор макрокода").
{//SEQUENTIAL
boolean produceFileTable = true;
if (produceFileTable) {
FileTable.use(dir, fileLabel, fileTable -> {
constructFileAccordingToMacroCode(macroCode, fileTable);
});
}
boolean produceFileWeb = true;
if (produceFileWeb) {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileWeb);
});
}
}
Параллельный способ выполнения описан ниже. (Там функция «constructFileAccordingToMacroCode» запускается один раз, следовательно, «построчный разбор макрокода» обрабатывается один раз).
{//KIND OF PARALLEL
boolean produceFileTable = true;//?
boolean produceFileWeb = true;//?
FileTable.use(dir, fileLabel, fileTable -> {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileTable, fileWeb);
});
});
}
Однако, если я реализую это, я потеряю возможность не создавать нежелательные типы файлов.
Есть ли более разумный способ что-то делаете?
СООТВЕТСТВУЮЩИЕ ПРИМЕРЫ ФАЙЛОВ КЛАССОВ[/b] [b]
Главная[/b][b]
public class Main {
public static void main(String... s) {
var macroCode = """
LINE1: ADD_FILE_TYPE
LINE2: ADD_SYSTEM_MILLIS
""";
var dir = Path.of("c:\\fileFirectory");
var fileLabel = "fileLabel";
{//SEQUENTIAL
boolean produceFileTable = true;
if (produceFileTable) {
FileTable.use(dir, fileLabel, fileTable -> {
constructFileAccordingToMacroCode(macroCode, fileTable);
});
}
boolean produceFileWeb = true;
if (produceFileWeb) {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileWeb);
});
}
}
{//KIND OF PARALLEL
boolean produceFileTable = true;//?
boolean produceFileWeb = true;//?
FileTable.use(dir, fileLabel, fileTable -> {
FileWeb.use(dir, fileLabel, fileWeb -> {
constructFileAccordingToMacroCode(macroCode, fileTable, fileWeb);
});
});
}
}
private static boolean constructFileAccordingToMacroCode(String macroCode, FileInterface... files) {
boolean result;
for (var file : files) {
//parse macroCode line by line in a for loop {
/*FOREXAMPLE LINE1: from macroCode*/
result = file.addText("I am a %s type file.".formatted(file.getClass().getSimpleName()));
if (!result) {
return false;
}
/*FOREXAMPLE LINE2: from macroCode*/
file.addText(", and time is %L".formatted(System.currentTimeMillis()));
if (!result) {
return false;
}
//}
}
return true;
}
}
TGS_RunnableType1[/b][b]
public interface TGS_RunnableType1 {
public void run(A result);
}
Файловый интерфейс[/b][b]
public interface FileInterface /*implements AutoCloseable*/{
public boolean addText(CharSequence text);
}
Таблица файлов [/b][b]
public class FileTable implements FileInterface {
private FileTable(Path dir) {
this.dir = dir;
}
final public Path dir;
@Override
public boolean addText(CharSequence text) {
//TODO add text code
return true;
}
public static void use(Path dir, String fileLabel, TGS_RunnableType1 fileTable) {
var instance = new FileTable(dir);
try {
instance.open();
fileTable.run(instance);
instance.close();
} catch (Exception e) {//SILENTLY CLOSE
try {
instance.close();
} catch (Exception e2) {
if (e2 instanceof InterruptedException) {//let InterruptedException propagate
throw e2;
}
}
if (e instanceof InterruptedException) {//let InterruptedException propagate
throw e;
}
}
}
private void open() {
//open according to dir & fileLabel & type
}
private void close() {
//close according to dir & fileLabel & type
}
}
FileWeb [/b][b]
public class FileWeb implements FileInterface {
private FileWeb(Path dir) {
this.dir = dir;
}
final public Path dir;
@Override
public boolean addText(CharSequence text) {
//TODO add text code
return true;
}
public static void use(Path dir, String fileLabel, TGS_RunnableType1 fileWeb) {
var instance = new FileWeb(dir);
try {
instance.open();
fileWeb.run(instance);
instance.close();
} catch (Exception e) {//SILENTLY CLOSE
try {
instance.close();
} catch (Exception e2) {
if (e2 instanceof InterruptedException) {//let InterruptedException propagate
throw e2;
}
}
if (e instanceof InterruptedException) {//let InterruptedException propagate
throw e;
}
}
}
private void open() {
//open according to dir & fileLabel & type
}
private void close() {
//close according to dir & fileLabel & type
}
------- ------------------ ОБНОВЛЕНИЕ ----------------
[/b][b] ПАРАЛЛЕЛЬНАЯ ВЕРСИЯ buildFileAccordingToMacroCode[/b]
//WILL POSSIBLY CREATE OUT OF MEMORY ERROR
private static boolean constructFileAccordingToMacroCode(String macroCode, FileInterface... files) {
//parse macroCode line by line in a for loop {
var errorPresent = IntStream.range(0, files.length).parallel()
.mapToObj(i -> {
var file = files[i];
/*FOREXAMPLE LINE1: from macroCode*/
var result = file.addText("I am a %s type file.".formatted(file.getClass().getSimpleName()));
if (!result) {
return false;
}
/*FOREXAMPLE LINE2: from macroCode*/
file.addText(", and time is %L".formatted(System.currentTimeMillis()));
if (!result) {
return false;
}
return true;
})
.filter(result -> false)
.findAny().isPresent();
if (errorPresent) {
return false;
}
//}
return true;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/77819961/how-to-run-parallel-tasks-in-a-for-loop-for-dealing-with-autocloseable-files-in[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия